From 4c5be02539a53a57d659402d0c074974bd558add Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 11:53:59 +0000 Subject: [PATCH 01/29] feat(toolshed/interfaces): add recurring collector helpers and deployment registries Exposes the RecurringCollector contract across interfaces and toolshed so downstream DIPs consumers can build directly against it: - Re-export IRecurringCollector from @graphprotocol/interfaces under both the bare name and the conventional toolshed alias (RecurringCollector), matching the pattern used for other contracts. - Add toolshed/src/core/recurring-collector.ts (DIPs helpers, including conditions in RCA decoder) and a covering test. - Update toolshed deployment registries for issuance and REO contracts. --- packages/interfaces/src/types/horizon.ts | 3 + .../toolshed/src/core/recurring-collector.ts | 86 ++++++++ .../toolshed/src/core/subgraph-service.ts | 15 ++ .../src/deployments/horizon/contracts.ts | 3 + .../src/deployments/issuance/contracts.ts | 33 ++-- .../src/hardhat/hardhat.base.config.ts | 9 +- .../toolshed/test/recurring-collector.test.ts | 183 ++++++++++++++++++ packages/toolshed/tsconfig.json | 3 +- 8 files changed, 318 insertions(+), 17 deletions(-) create mode 100644 packages/toolshed/test/recurring-collector.test.ts diff --git a/packages/interfaces/src/types/horizon.ts b/packages/interfaces/src/types/horizon.ts index c2a09abb6..afed43e2c 100644 --- a/packages/interfaces/src/types/horizon.ts +++ b/packages/interfaces/src/types/horizon.ts @@ -10,6 +10,7 @@ import type { IL2GNSToolshed, ILegacyRewardsManager, IPaymentsEscrowToolshed, + IRecurringCollector, IRewardsManagerToolshed, IStaking, ISubgraphNFT, @@ -22,12 +23,14 @@ export { IGraphProxyAdmin as GraphProxyAdmin, IGraphTallyCollectorToolshed as GraphTallyCollector, IHorizonStakingToolshed as HorizonStaking, + IRecurringCollector, IL2CurationToolshed as L2Curation, IL2GNSToolshed as L2GNS, IGraphToken as L2GraphToken, ILegacyRewardsManager as LegacyRewardsManager, IStaking as LegacyStaking, IPaymentsEscrowToolshed as PaymentsEscrow, + IRecurringCollector as RecurringCollector, IRewardsManagerToolshed as RewardsManager, ISubgraphNFT as SubgraphNFT, } diff --git a/packages/toolshed/src/core/recurring-collector.ts b/packages/toolshed/src/core/recurring-collector.ts index 42c1bc7be..6b43564f8 100644 --- a/packages/toolshed/src/core/recurring-collector.ts +++ b/packages/toolshed/src/core/recurring-collector.ts @@ -1,3 +1,5 @@ +import { BytesLike, ethers } from 'ethers' + /** * Constants for constructing RCA / RCAU offers against `RecurringCollector`. * @@ -35,3 +37,87 @@ export const RC_EIP712_RCA_TYPESTRING = /** EIP-712 typestring for a RecurringCollectionAgreementUpdate (RCAU). */ export const RC_EIP712_RCAU_TYPESTRING = 'RecurringCollectionAgreementUpdate(bytes16 agreementId,uint64 deadline,uint64 endsAt,uint256 maxInitialTokens,uint256 maxOngoingTokensPerSecond,uint32 minSecondsPerCollection,uint32 maxSecondsPerCollection,uint16 conditions,uint32 nonce,bytes metadata)' + +// -- ABI tuple types for decoding -- + +const RCA_TUPLE = + 'tuple(uint64 deadline, uint64 endsAt, address payer, address dataService, address serviceProvider, uint256 maxInitialTokens, uint256 maxOngoingTokensPerSecond, uint32 minSecondsPerCollection, uint32 maxSecondsPerCollection, uint16 conditions, uint256 nonce, bytes metadata)' + +const SIGNED_RCA_TUPLE = `tuple(${RCA_TUPLE} rca, bytes signature)` + +const ACCEPT_METADATA_TUPLE = 'tuple(bytes32 subgraphDeploymentId, uint8 version, bytes terms)' + +const TERMS_V1_TUPLE = 'tuple(uint256 tokensPerSecond, uint256 tokensPerEntityPerSecond)' + +// -- Return types -- + +export interface RecurringCollectionAgreement { + deadline: bigint + endsAt: bigint + payer: string + dataService: string + serviceProvider: string + maxInitialTokens: bigint + maxOngoingTokensPerSecond: bigint + minSecondsPerCollection: bigint + maxSecondsPerCollection: bigint + conditions: bigint + nonce: bigint + metadata: string +} + +export interface SignedRCA { + rca: RecurringCollectionAgreement + signature: string +} + +export interface AcceptIndexingAgreementMetadata { + subgraphDeploymentId: string + version: bigint + terms: string +} + +export interface IndexingAgreementTermsV1 { + tokensPerSecond: bigint + tokensPerEntityPerSecond: bigint +} + +// -- Decoders -- + +export function decodeSignedRCA(data: BytesLike): SignedRCA { + const [decoded] = ethers.AbiCoder.defaultAbiCoder().decode([SIGNED_RCA_TUPLE], data) + return { + rca: { + deadline: decoded.rca.deadline, + endsAt: decoded.rca.endsAt, + payer: decoded.rca.payer, + dataService: decoded.rca.dataService, + serviceProvider: decoded.rca.serviceProvider, + maxInitialTokens: decoded.rca.maxInitialTokens, + maxOngoingTokensPerSecond: decoded.rca.maxOngoingTokensPerSecond, + minSecondsPerCollection: decoded.rca.minSecondsPerCollection, + maxSecondsPerCollection: decoded.rca.maxSecondsPerCollection, + conditions: decoded.rca.conditions, + nonce: decoded.rca.nonce, + metadata: decoded.rca.metadata, + }, + signature: decoded.signature, + } +} + +export function decodeAcceptIndexingAgreementMetadata(data: BytesLike): AcceptIndexingAgreementMetadata { + const [decoded] = ethers.AbiCoder.defaultAbiCoder().decode([ACCEPT_METADATA_TUPLE], data) + return { + subgraphDeploymentId: decoded.subgraphDeploymentId, + version: decoded.version, + terms: decoded.terms, + } +} + +export function decodeIndexingAgreementTermsV1(data: BytesLike): IndexingAgreementTermsV1 { + const [decoded] = ethers.AbiCoder.defaultAbiCoder().decode([TERMS_V1_TUPLE], data) + return { + tokensPerSecond: decoded.tokensPerSecond, + tokensPerEntityPerSecond: decoded.tokensPerEntityPerSecond, + } +} diff --git a/packages/toolshed/src/core/subgraph-service.ts b/packages/toolshed/src/core/subgraph-service.ts index b4301900f..03a7840d0 100644 --- a/packages/toolshed/src/core/subgraph-service.ts +++ b/packages/toolshed/src/core/subgraph-service.ts @@ -32,6 +32,21 @@ export function encodeCollectQueryFeesData(rav: RAV, signature: string, tokensTo ) } +export function encodeCollectIndexingFeesData( + agreementId: string, + entities: bigint, + poi: BytesLike, + poiBlockNumber: bigint, + metadata: BytesLike, + maxSlippage: bigint, +) { + const innerData = ethers.AbiCoder.defaultAbiCoder().encode( + ['uint256', 'bytes32', 'uint256', 'bytes', 'uint256'], + [entities, poi, poiBlockNumber, metadata, maxSlippage], + ) + return ethers.AbiCoder.defaultAbiCoder().encode(['bytes16', 'bytes'], [agreementId, innerData]) +} + export function encodeStopServiceData(allocationId: string) { return ethers.AbiCoder.defaultAbiCoder().encode(['address'], [allocationId]) } diff --git a/packages/toolshed/src/deployments/horizon/contracts.ts b/packages/toolshed/src/deployments/horizon/contracts.ts index bd852d5f0..9c293b187 100644 --- a/packages/toolshed/src/deployments/horizon/contracts.ts +++ b/packages/toolshed/src/deployments/horizon/contracts.ts @@ -11,6 +11,7 @@ import type { LegacyRewardsManager, LegacyStaking, PaymentsEscrow, + RecurringCollector, RewardsManager, SubgraphNFT, } from '@graphprotocol/interfaces' @@ -36,6 +37,7 @@ export const GraphHorizonContractNameList = [ 'GraphPayments', 'PaymentsEscrow', 'GraphTallyCollector', + 'RecurringCollector', ] as const export interface GraphHorizonContracts extends ContractList { @@ -56,6 +58,7 @@ export interface GraphHorizonContracts extends ContractList { + DefaultAllocation: DirectAllocation DirectAllocation_Implementation: Contract IssuanceAllocator: IssuanceAllocator NetworkOperator: Contract // Address holder for network operator (not an actual contract) - PilotAllocation: DirectAllocation - ReclaimedRewardsForCloseAllocation: DirectAllocation - ReclaimedRewardsForIndexerIneligible: DirectAllocation - ReclaimedRewardsForStalePoi: DirectAllocation - ReclaimedRewardsForSubgraphDenied: DirectAllocation - ReclaimedRewardsForZeroPoi: DirectAllocation - RewardsEligibilityOracle: RewardsEligibilityOracle + ReclaimedRewards: DirectAllocation + RecurringAgreementManager: RecurringAgreementManager + RewardsEligibilityOracleA: RewardsEligibilityOracle + RewardsEligibilityOracleB: RewardsEligibilityOracle + RewardsEligibilityOracleMock: Contract } diff --git a/packages/toolshed/src/hardhat/hardhat.base.config.ts b/packages/toolshed/src/hardhat/hardhat.base.config.ts index 3b7e3b66d..cf6fd0579 100644 --- a/packages/toolshed/src/hardhat/hardhat.base.config.ts +++ b/packages/toolshed/src/hardhat/hardhat.base.config.ts @@ -60,8 +60,15 @@ export const projectPathsUserConfig: ProjectPathsUserConfig = { // Etherscan v2 API uses a single API key for all networks // See: https://docs.etherscan.io/etherscan-v2/getting-started/creating-an-account +// Check keystore first (vars), then environment variables +// Support both ETHERSCAN_API_KEY and ARBISCAN_API_KEY for compatibility +const getEtherscanApiKey = (): string => { + if (vars.has('ETHERSCAN_API_KEY')) return vars.get('ETHERSCAN_API_KEY') + if (vars.has('ARBISCAN_API_KEY')) return vars.get('ARBISCAN_API_KEY') + return process.env.ETHERSCAN_API_KEY ?? process.env.ARBISCAN_API_KEY ?? '' +} export const etherscanUserConfig: Partial = { - apiKey: vars.has('ETHERSCAN_API_KEY') ? vars.get('ETHERSCAN_API_KEY') : '', + apiKey: getEtherscanApiKey(), } // In general: diff --git a/packages/toolshed/test/recurring-collector.test.ts b/packages/toolshed/test/recurring-collector.test.ts new file mode 100644 index 000000000..9a8e7efd7 --- /dev/null +++ b/packages/toolshed/test/recurring-collector.test.ts @@ -0,0 +1,183 @@ +import assert from 'node:assert/strict' + +import { ethers } from 'ethers' + +import { + decodeAcceptIndexingAgreementMetadata, + decodeIndexingAgreementTermsV1, + decodeSignedRCA, + encodeCollectIndexingFeesData, +} from '../dist/core/index.js' + +const coder = ethers.AbiCoder.defaultAbiCoder() + +// -- decodeSignedRCA round-trip -- + +{ + const rca = { + deadline: 1000000n, + endsAt: 2000000n, + payer: '0x1111111111111111111111111111111111111111', + dataService: '0x2222222222222222222222222222222222222222', + serviceProvider: '0x3333333333333333333333333333333333333333', + maxInitialTokens: 500n * 10n ** 18n, + maxOngoingTokensPerSecond: 1n * 10n ** 15n, + minSecondsPerCollection: 3600n, + maxSecondsPerCollection: 86400n, + conditions: 0n, + nonce: 42n, + metadata: '0xdeadbeef', + } + const signature = '0x' + 'ab'.repeat(65) + + const encoded = coder.encode( + [ + 'tuple(tuple(uint64 deadline, uint64 endsAt, address payer, address dataService, address serviceProvider, uint256 maxInitialTokens, uint256 maxOngoingTokensPerSecond, uint32 minSecondsPerCollection, uint32 maxSecondsPerCollection, uint16 conditions, uint256 nonce, bytes metadata) rca, bytes signature)', + ], + [{ rca, signature }], + ) + + const decoded = decodeSignedRCA(encoded) + + assert.equal(decoded.rca.deadline, rca.deadline) + assert.equal(decoded.rca.endsAt, rca.endsAt) + assert.equal(decoded.rca.payer, rca.payer) + assert.equal(decoded.rca.dataService, rca.dataService) + assert.equal(decoded.rca.serviceProvider, rca.serviceProvider) + assert.equal(decoded.rca.maxInitialTokens, rca.maxInitialTokens) + assert.equal(decoded.rca.maxOngoingTokensPerSecond, rca.maxOngoingTokensPerSecond) + assert.equal(decoded.rca.minSecondsPerCollection, rca.minSecondsPerCollection) + assert.equal(decoded.rca.maxSecondsPerCollection, rca.maxSecondsPerCollection) + assert.equal(decoded.rca.conditions, rca.conditions) + assert.equal(decoded.rca.nonce, rca.nonce) + assert.equal(decoded.rca.metadata, rca.metadata) + assert.equal(decoded.signature, signature) + console.log('PASS: decodeSignedRCA round-trip') +} + +// -- decodeSignedRCA with empty metadata -- + +{ + const rca = { + deadline: 100n, + endsAt: 200n, + payer: '0x' + '00'.repeat(20), + dataService: '0x' + '00'.repeat(20), + serviceProvider: '0x' + '00'.repeat(20), + maxInitialTokens: 0n, + maxOngoingTokensPerSecond: 0n, + minSecondsPerCollection: 0n, + maxSecondsPerCollection: 0n, + conditions: 0n, + nonce: 0n, + metadata: '0x', + } + const signature = '0x' + + const encoded = coder.encode( + [ + 'tuple(tuple(uint64 deadline, uint64 endsAt, address payer, address dataService, address serviceProvider, uint256 maxInitialTokens, uint256 maxOngoingTokensPerSecond, uint32 minSecondsPerCollection, uint32 maxSecondsPerCollection, uint16 conditions, uint256 nonce, bytes metadata) rca, bytes signature)', + ], + [{ rca, signature }], + ) + + const decoded = decodeSignedRCA(encoded) + assert.equal(decoded.rca.metadata, '0x') + assert.equal(decoded.signature, '0x') + console.log('PASS: decodeSignedRCA with empty metadata') +} + +// -- decodeAcceptIndexingAgreementMetadata round-trip -- + +{ + const subgraphDeploymentId = ethers.id('my-subgraph') + const version = 0n // V1 = 0 in the enum + const terms = coder.encode(['uint256', 'uint256'], [1000n, 2000n]) + + const encoded = coder.encode( + ['tuple(bytes32 subgraphDeploymentId, uint8 version, bytes terms)'], + [{ subgraphDeploymentId, version, terms }], + ) + + const decoded = decodeAcceptIndexingAgreementMetadata(encoded) + + assert.equal(decoded.subgraphDeploymentId, subgraphDeploymentId) + assert.equal(decoded.version, version) + assert.equal(decoded.terms, terms) + console.log('PASS: decodeAcceptIndexingAgreementMetadata round-trip') +} + +// -- decodeAcceptIndexingAgreementMetadata with empty terms -- + +{ + const encoded = coder.encode( + ['tuple(bytes32 subgraphDeploymentId, uint8 version, bytes terms)'], + [{ subgraphDeploymentId: ethers.ZeroHash, version: 0, terms: '0x' }], + ) + + const decoded = decodeAcceptIndexingAgreementMetadata(encoded) + assert.equal(decoded.terms, '0x') + console.log('PASS: decodeAcceptIndexingAgreementMetadata with empty terms') +} + +// -- decodeAcceptIndexingAgreementMetadata with unknown version -- + +{ + const encoded = coder.encode( + ['tuple(bytes32 subgraphDeploymentId, uint8 version, bytes terms)'], + [{ subgraphDeploymentId: ethers.ZeroHash, version: 255, terms: '0x' }], + ) + + const decoded = decodeAcceptIndexingAgreementMetadata(encoded) + assert.equal(decoded.version, 255n) + console.log('PASS: decodeAcceptIndexingAgreementMetadata with unknown version') +} + +// -- decodeIndexingAgreementTermsV1 round-trip -- + +{ + const tokensPerSecond = 1000n * 10n ** 18n + const tokensPerEntityPerSecond = 5n * 10n ** 15n + + const encoded = coder.encode( + ['tuple(uint256 tokensPerSecond, uint256 tokensPerEntityPerSecond)'], + [{ tokensPerSecond, tokensPerEntityPerSecond }], + ) + + const decoded = decodeIndexingAgreementTermsV1(encoded) + + assert.equal(decoded.tokensPerSecond, tokensPerSecond) + assert.equal(decoded.tokensPerEntityPerSecond, tokensPerEntityPerSecond) + console.log('PASS: decodeIndexingAgreementTermsV1 round-trip') +} + +// -- encodeCollectIndexingFeesData round-trip -- + +{ + const agreementId = '0x' + 'ab'.repeat(16) + const entities = 1000n + const poi = ethers.id('test-poi') + const poiBlockNumber = 12345n + const metadata = '0xdeadbeef' + const maxSlippage = 100n + + const encoded = encodeCollectIndexingFeesData(agreementId, entities, poi, poiBlockNumber, metadata, maxSlippage) + + // Decode outer: (bytes16, bytes) + const [decodedAgreementId, innerData] = coder.decode(['bytes16', 'bytes'], encoded) + assert.equal(decodedAgreementId, agreementId) + + // Decode inner: CollectIndexingFeeDataV1 + const [decodedEntities, decodedPoi, decodedPoiBlockNumber, decodedMetadata, decodedMaxSlippage] = coder.decode( + ['uint256', 'bytes32', 'uint256', 'bytes', 'uint256'], + innerData, + ) + assert.equal(decodedEntities, entities) + assert.equal(decodedPoi, poi) + assert.equal(decodedPoiBlockNumber, poiBlockNumber) + assert.equal(decodedMetadata, metadata) + assert.equal(decodedMaxSlippage, maxSlippage) + console.log('PASS: encodeCollectIndexingFeesData round-trip') +} + +console.log('\nAll tests passed.') diff --git a/packages/toolshed/tsconfig.json b/packages/toolshed/tsconfig.json index f6387508a..8d3b58663 100644 --- a/packages/toolshed/tsconfig.json +++ b/packages/toolshed/tsconfig.json @@ -3,5 +3,6 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src/**/*.ts", "test/**/*.ts"] + "include": ["src/**/*.ts"], + "exclude": ["test/**/*.ts"] } From 283575ca45d5dacbd75c1bf9be1d2b5e0581970f Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 11:09:41 +0000 Subject: [PATCH 02/29] feat(issuance): MockRewardsEligibilityOracle test mock --- packages/issuance/README.md | 2 +- .../mocks/MockRewardsEligibilityOracle.sol | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol diff --git a/packages/issuance/README.md b/packages/issuance/README.md index c6def2743..f6c4e4856 100644 --- a/packages/issuance/README.md +++ b/packages/issuance/README.md @@ -10,7 +10,7 @@ The issuance contracts handle token issuance mechanisms for The Graph protocol. - **[IssuanceAllocator](contracts/allocate/IssuanceAllocator.md)** - Central distribution hub for token issuance, allocating tokens to different protocol components based on configured rates - **[RewardsEligibilityOracle](contracts/eligibility/RewardsEligibilityOracle.md)** - Oracle-based eligibility system for indexer rewards with time-based expiration -- **DirectAllocation** - Simple target contract implementation for receiving and distributing allocated tokens (deployed as PilotAllocation and other instances) +- **DirectAllocation** - Simple target contract implementation for receiving and distributing allocated tokens (deployed as ReclaimedRewards) - **[RecurringAgreementManager](contracts/agreement/RecurringAgreementManager.md)** - Funds PaymentsEscrow deposits for RCAs using issuance tokens, tracking max-next-claim per agreement per indexer ## Development diff --git a/packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol b/packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol new file mode 100644 index 000000000..92e811ce5 --- /dev/null +++ b/packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.27; + +import { BaseUpgradeable } from "../../common/BaseUpgradeable.sol"; +import { IGraphToken } from "../../common/IGraphToken.sol"; + +/// @title MockRewardsEligibilityOracle +/// @author The Graph Contributors +/// @notice Testnet REO replacement. Indexers control their own eligibility. +/// @dev Everyone starts eligible. Call setEligible(false) to become ineligible. +/// Upgradeable via OZ TransparentUpgradeableProxy for deployment consistency. +contract MockRewardsEligibilityOracle is BaseUpgradeable { + mapping(address indexer => bool isIneligible) private ineligible; + + /// @notice Emitted when an indexer changes their eligibility. + /// @param indexer The indexer address. + /// @param eligible Whether the indexer is now eligible. + event EligibilitySet(address indexed indexer, bool indexed eligible); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor(IGraphToken graphToken) BaseUpgradeable(graphToken) {} + + /// @notice Initialize the contract. + /// @param governor Address that will have the GOVERNOR_ROLE. + function initialize(address governor) external initializer { + __BaseUpgradeable_init(governor); + } + + /// @notice Toggle the caller's eligibility. + /// @param eligible True to be eligible, false to opt out. + function setEligible(bool eligible) external { + ineligible[msg.sender] = !eligible; + emit EligibilitySet(msg.sender, eligible); + } + + /// @notice Check whether an indexer is eligible for rewards. + /// @dev Called by RewardsManager to check eligibility. + /// @param indexer The indexer address to check. + /// @return True if the indexer is eligible. + function isEligible(address indexer) external view returns (bool) { + return !ineligible[indexer]; + } + + /// @notice ERC165 interface detection. + /// @dev Supports IRewardsEligibility (0x66e305fd) and inherited interfaces. + /// @param interfaceId The interface identifier to check. + /// @return True if the interface is supported. + function supportsInterface(bytes4 interfaceId) public view override returns (bool) { + return interfaceId == 0x66e305fd || super.supportsInterface(interfaceId); + } +} From 92e1d6288097735d0ca49a681e772cc51cb215b5 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 29 Apr 2026 10:26:13 +0000 Subject: [PATCH 03/29] refactor(address-book): consolidate publish source list to one place The set of packages exported by @graphprotocol/address-book was duplicated three times: the exports map in package.json, FILES_TO_COPY in copy-addresses-for-publish.js, and SYMLINKS_TO_RESTORE in restore-symlinks.js. Drift had already crept in -- issuance was referenced everywhere but src/issuance/ was missing on disk, which would break prepublishOnly. Collapse to a single SOURCES array in scripts/sources.js consumed by both scripts. Use a subpath pattern in package.json exports ("./*/addresses.json": "./src/*/addresses.json") so the exports map no longer enumerates names. Both scripts now mkdir src// recursively and use rmSync({ force: true }) in place of the existsSync/unlinkSync dance, so a missing dir or stale entry is handled silently. The copy step ends with a drift check that catches src// dirs not listed in SOURCES (stale leftovers from removed entries). Verified end-to-end: pnpm pack produces a tarball containing real files under src/{horizon,issuance,subgraph-service}/addresses.json, and restore-symlinks puts the symlinks back at the original relative targets. --- packages/address-book/package.json | 4 +- .../scripts/copy-addresses-for-publish.js | 69 ++++++++----------- .../address-book/scripts/restore-symlinks.js | 52 ++++---------- packages/address-book/scripts/sources.js | 4 ++ .../address-book/src/issuance/addresses.json | 1 + 5 files changed, 48 insertions(+), 82 deletions(-) create mode 100644 packages/address-book/scripts/sources.js create mode 120000 packages/address-book/src/issuance/addresses.json diff --git a/packages/address-book/package.json b/packages/address-book/package.json index 86de6244d..0a1d886e9 100644 --- a/packages/address-book/package.json +++ b/packages/address-book/package.json @@ -13,9 +13,7 @@ "directory": "packages/address-book" }, "exports": { - "./horizon/addresses.json": "./src/horizon/addresses.json", - "./issuance/addresses.json": "./src/issuance/addresses.json", - "./subgraph-service/addresses.json": "./src/subgraph-service/addresses.json" + "./*/addresses.json": "./src/*/addresses.json" }, "files": [ "src/**/*.json", diff --git a/packages/address-book/scripts/copy-addresses-for-publish.js b/packages/address-book/scripts/copy-addresses-for-publish.js index 6335f7dc5..0665359d4 100755 --- a/packages/address-book/scripts/copy-addresses-for-publish.js +++ b/packages/address-book/scripts/copy-addresses-for-publish.js @@ -3,67 +3,52 @@ /** * 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. + * Replaces the dev-time symlinks under src//addresses.json with real + * file copies before npm publish — npm does not include symlinks in the + * published tarball. restore-symlinks.js puts the symlinks back afterwards. */ const fs = require('fs') const path = require('path') +const SOURCES = require('./sources') -const FILES_TO_COPY = [ - { - source: '../../../horizon/addresses.json', - target: 'src/horizon/addresses.json', - }, - { - source: '../../../issuance/addresses.json', - target: 'src/issuance/addresses.json', - }, - { - source: '../../../subgraph-service/addresses.json', - target: 'src/subgraph-service/addresses.json', - }, -] +const ROOT = path.resolve(__dirname, '..') +const SRC = path.join(ROOT, 'src') -function copyFileForPublish(source, target) { - const targetPath = path.resolve(__dirname, '..', target) - const sourcePath = path.resolve(path.dirname(targetPath), source) +function copyOne(name) { + const sourcePath = path.resolve(ROOT, '..', name, 'addresses.json') + const targetDir = path.join(SRC, name) + const targetPath = path.join(targetDir, 'addresses.json') - // 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) - } + fs.mkdirSync(targetDir, { recursive: true }) + fs.rmSync(targetPath, { force: true }) + fs.copyFileSync(sourcePath, targetPath) + console.log(`✅ Copied for publish: src/${name}/addresses.json`) +} - // 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) +function checkDrift() { + const dirs = fs + .readdirSync(SRC) + .filter((d) => fs.statSync(path.join(SRC, d)).isDirectory()) + .sort() + const expected = [...SOURCES].sort() + if (JSON.stringify(dirs) !== JSON.stringify(expected)) { + console.error(`❌ Drift between SOURCES and src/`) + console.error(` SOURCES: [${expected.join(', ')}]`) + console.error(` src/ : [${dirs.join(', ')}]`) process.exit(1) } } function main() { console.log('📦 Copying address files for npm publish...') - - for (const { source, target } of FILES_TO_COPY) { - copyFileForPublish(source, target) - } - + for (const name of SOURCES) copyOne(name) + checkDrift() console.log('✅ Address files copied for publish!') } diff --git a/packages/address-book/scripts/restore-symlinks.js b/packages/address-book/scripts/restore-symlinks.js index 2f3a871f2..eb2f1f5df 100755 --- a/packages/address-book/scripts/restore-symlinks.js +++ b/packages/address-book/scripts/restore-symlinks.js @@ -3,54 +3,32 @@ /** * 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. + * Restores the dev-time symlinks under src//addresses.json after + * npm publish. copy-addresses-for-publish.js replaces them with real files + * for the publish step; this puts them back. */ const fs = require('fs') const path = require('path') +const SOURCES = require('./sources') -const SYMLINKS_TO_RESTORE = [ - { - target: '../../../horizon/addresses.json', - link: 'src/horizon/addresses.json', - }, - { - target: '../../../issuance/addresses.json', - link: 'src/issuance/addresses.json', - }, - { - target: '../../../subgraph-service/addresses.json', - link: 'src/subgraph-service/addresses.json', - }, -] +const ROOT = path.resolve(__dirname, '..') +const SRC = path.join(ROOT, 'src') -function restoreSymlink(target, link) { - const linkPath = path.resolve(__dirname, '..', link) +function restoreOne(name) { + const linkTarget = `../../../${name}/addresses.json` + const linkDir = path.join(SRC, name) + const linkPath = path.join(linkDir, 'addresses.json') - // 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) - } + fs.mkdirSync(linkDir, { recursive: true }) + fs.rmSync(linkPath, { force: true }) + fs.symlinkSync(linkTarget, linkPath) + console.log(`✅ Restored symlink: src/${name}/addresses.json -> ${linkTarget}`) } function main() { console.log('🔗 Restoring symlinks after publish...') - - for (const { target, link } of SYMLINKS_TO_RESTORE) { - restoreSymlink(target, link) - } - + for (const name of SOURCES) restoreOne(name) console.log('✅ Symlinks restored!') } diff --git a/packages/address-book/scripts/sources.js b/packages/address-book/scripts/sources.js new file mode 100644 index 000000000..6885c1a2b --- /dev/null +++ b/packages/address-book/scripts/sources.js @@ -0,0 +1,4 @@ +// Source packages exported from @graphprotocol/address-book. +// Each name corresponds to packages//addresses.json (source of truth) +// and packages/address-book/src//addresses.json (publish symlink). +module.exports = ['horizon', 'issuance', 'subgraph-service'] diff --git a/packages/address-book/src/issuance/addresses.json b/packages/address-book/src/issuance/addresses.json new file mode 120000 index 000000000..b73ad34ff --- /dev/null +++ b/packages/address-book/src/issuance/addresses.json @@ -0,0 +1 @@ +../../../issuance/addresses.json \ No newline at end of file From 47bce26ba89ee15dbeb025d60bc67b4df4677849 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 11:10:40 +0000 Subject: [PATCH 04/29] chore: update arbitrumSepolia addresses and deployment metadata --- packages/horizon/addresses.json | 72 +++++++++++-- packages/issuance/addresses.json | 128 +++++++++++++++++++++-- packages/subgraph-service/addresses.json | 27 +++-- 3 files changed, 199 insertions(+), 28 deletions(-) diff --git a/packages/horizon/addresses.json b/packages/horizon/addresses.json index a7c8437bd..f386a84a3 100644 --- a/packages/horizon/addresses.json +++ b/packages/horizon/addresses.json @@ -71,7 +71,18 @@ "address": "0x4b5D3Da463F7E076bb7CDF5030960bf123245681", "proxy": "transparent", "proxyAdmin": "0x36dFE73C38e0340C8925BA6a68aE706b74340156", - "implementation": "0x36a194135E41a556ad6F4Dbad6b7F8F0e884ba1d" + "implementation": "0x25cf4a6ccd1f829d346cfda69112cd66639aaaa8", + "implementationDeployment": { + "txHash": "0x38c2d58d65e7ba66779cc2c45a9348d6ecb8ecedf80703be5769a3259311db02", + "argsData": "0x0000000000000000000000009db3ee191681f092607035d9bda6e59fbeaca6950000000000000000000000000000000000000000000000000000000000002a30", + "bytecodeHash": "0xc422e0b089ad8479e55a9a768d5bbea929745c83067496ff60a8f47dc2a08d90", + "blockNumber": 258351112, + "timestamp": "2026-04-10T15:30:13.000Z", + "verified": "https://sepolia.arbiscan.io/address/0x25cf4a6ccd1f829d346cfda69112cd66639aaaa8#code" + }, + "proxyDeployment": { + "verified": "https://sepolia.arbiscan.io/address/0x4b5D3Da463F7E076bb7CDF5030960bf123245681#code" + } }, "Controller": { "address": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695" @@ -79,7 +90,18 @@ "L2Curation": { "address": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", "proxy": "graph", - "implementation": "0xbC8F4355f346e47eef8A0DBFF4a58616ACf7DaCA" + "implementation": "0x42e7b4b418672e890b460ca5e83ff47ad5717f02", + "implementationDeployment": { + "txHash": "0x774d6402b982c6a04245715efa92d0d40d47bf06ba95f3e02bc3d2dea3cba409", + "argsData": "0x", + "bytecodeHash": "0xaad16b82ef09b39624235fcc47361da5bd2c6cb0f3926a4aa2d9d11f88a3e238", + "blockNumber": 258322205, + "timestamp": "2026-04-10T13:12:51.000Z", + "verified": "https://sepolia.arbiscan.io/address/0x42e7b4b418672e890b460ca5e83ff47ad5717f02#code" + }, + "proxyDeployment": { + "verified": "https://sepolia.arbiscan.io/address/0xDe761f075200E75485F4358978FB4d1dC8644FD5#code" + } }, "L2GNS": { "address": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", @@ -92,23 +114,34 @@ "RewardsManager": { "address": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", "proxy": "graph", - "implementation": "0xd681431502e7f9780f14576c17f4459074fc2360", + "implementation": "0xeffc5bb9b46dfbda6f8b0f297d12880674a6717e", "proxyDeployment": { "verified": "https://sepolia.arbiscan.io/address/0x1F49caE7669086c8ba53CC35d1E9f80176d67E79#code" }, "implementationDeployment": { - "txHash": "0x09b9cea7f67a55bf81fc92b08d4bb6c7a34f0471d4d1987ef3d914d76ea3f351", + "txHash": "0x9be5cd5335eec0ae8305d149f13d79ff4015d2327bbeed0a47d444e29fbbfd7a", "argsData": "0x", - "bytecodeHash": "0xee210d0ea0a5e1a46622eb4da78d621523e3efcae872d8a844a69b9677c704ef", - "blockNumber": 240022327, - "timestamp": "2026-02-05T19:03:01.000Z", - "verified": "https://sepolia.arbiscan.io/address/0xd681431502e7f9780f14576c17f4459074fc2360#code" + "bytecodeHash": "0xd0cd3f4b7ce4ce4fe6ea8ee8ecd4e74bb683c64de2696c9e5ad7f74ef4c16f4e", + "blockNumber": 258336594, + "timestamp": "2026-04-10T14:19:51.000Z", + "verified": "https://sepolia.arbiscan.io/address/0xeffc5bb9b46dfbda6f8b0f297d12880674a6717e#code" } }, "HorizonStaking": { "address": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", "proxy": "graph", - "implementation": "0x2AF6F51e119A79497C3A3FFf012B5889da489764" + "implementation": "0x2333c59d080c5641c804579165641d0162a7249b", + "implementationDeployment": { + "txHash": "0x0cb033e6595517c53daf5e0c736c9a8b49e92e830a894ac05f9fdd81acd6fcfb", + "argsData": "0x0000000000000000000000009db3ee191681f092607035d9bda6e59fbeaca695000000000000000000000000c24a3dac5d06d771f657a48b20ce1a671b78f26b", + "bytecodeHash": "0x4fcc568f70748b19c8a90480ea1521870bac358681074768388098ef263ed559", + "blockNumber": 258348283, + "timestamp": "2026-04-10T15:16:25.000Z", + "verified": "https://sepolia.arbiscan.io/address/0x2333c59d080c5641c804579165641d0162a7249b#code" + }, + "proxyDeployment": { + "verified": "https://sepolia.arbiscan.io/address/0x865365C425f3A593Ffe698D9c4E6707D14d51e08#code" + } }, "GraphTallyCollector": { "address": "0x382863e7B662027117449bd2c49285582bbBd21B" @@ -130,6 +163,27 @@ "address": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", "proxy": "graph", "implementation": "0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC" + }, + "RecurringCollector": { + "address": "0x0b18befc60455121ad66ae6e4a647955fcde3900", + "proxy": "transparent", + "proxyAdmin": "0x59d83d4bd5f880c5e635273e4fb12e0a8e827f1d", + "implementation": "0xf4f75d6e1021db1b83b8bccfefa1a0ea06989fa1", + "implementationDeployment": { + "txHash": "0x579640729801f30ddec1e85b7ae6b7b9c51cc2502c1d96a0b698dbb553a1dafa", + "argsData": "0x0000000000000000000000009db3ee191681f092607035d9bda6e59fbeaca6950000000000000000000000000000000000000000000000000000000000007080", + "bytecodeHash": "0xe475513d113bac487d6c2a5504f73e8c1a7962dd611aa981e09cf04ebb0c5486", + "blockNumber": 258348301, + "timestamp": "2026-04-10T15:16:30.000Z", + "verified": "https://sepolia.arbiscan.io/address/0xf4f75d6e1021db1b83b8bccfefa1a0ea06989fa1#code" + }, + "proxyDeployment": { + "txHash": "0x6fb822cdafa22542bed36045d77705c1354770feed50d67ef69ecde1bf668e28", + "argsData": "0x000000000000000000000000763a83af638f1ea6a4033868bc24994f9bd62617000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c44cd88b76000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012526563757272696e67436f6c6c6563746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 258322094, + "verified": "https://sepolia.arbiscan.io/address/0x0b18befc60455121ad66ae6e4a647955fcde3900#code" + } } } } diff --git a/packages/issuance/addresses.json b/packages/issuance/addresses.json index ad38aec4e..28942d3e1 100644 --- a/packages/issuance/addresses.json +++ b/packages/issuance/addresses.json @@ -32,33 +32,139 @@ "address": "0x6ba849fbd33257162552578b2a432d30784f2f80", "proxy": "transparent", "proxyAdmin": "0xfd76b74d4da4ef5b9c2379b9c8dbd79575b0fdda", - "implementation": "0x24901750b48ad049b914f13e1855dc71ecf8397a", + "implementation": "0xd6f2acf352f655b72cc32a056edf7ca97ec3e9e4", "implementationDeployment": { - "txHash": "0xc2bdcd2b9d40f9932f231e04bae0a8248745ee1a3514851e5e25ee17ef5f1fa7", + "txHash": "0xbf484964670ce105ce4de7f97d3617dbccede17d6ab806174c49fa36c1483950", "argsData": "0x000000000000000000000000f8c05dcf59e8b28bfd5eed176c562bebcfc7ac04", "bytecodeHash": "0x8ff7d1a6e22cf7f074c4688d9c84394ee151531de3f219ceabf66f0386201412", - "blockNumber": 250569158 + "blockNumber": 258351189, + "timestamp": "2026-04-10T15:30:34.000Z", + "verified": "https://sepolia.arbiscan.io/address/0xd6f2acf352f655b72cc32a056edf7ca97ec3e9e4#code" }, "proxyDeployment": { "txHash": "0xcf2995a0f7142be957a71da0bc3f63e93939d7442dcab8f549e7765585464ce1", "argsData": "0x00000000000000000000000024901750b48ad049b914f13e1855dc71ecf8397a00000000000000000000000072ee30d43fb5a90b3fe983156c5d2fbe6f6d07b300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de800000000000000000000000072ee30d43fb5a90b3fe983156c5d2fbe6f6d07b300000000000000000000000000000000000000000000000000000000", "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", - "blockNumber": 250569166 + "blockNumber": 250569166, + "verified": "https://sepolia.arbiscan.io/address/0x6ba849fbd33257162552578b2a432d30784f2f80#code" } }, - "RewardsEligibilityOracleMock": { - "address": "0x5FB23365F8cf643D5f1459E9793EfF7254522400" - }, "IssuanceAllocator": { "address": "0x76a0d75651d4db83f74ac502b86a0ae4e19ac38b", "proxy": "transparent", "proxyAdmin": "0x9a3e5bd36a72a6306c63dce573a8100992479bfa", - "implementation": "0x50782d395e32300f57f6446951cf6734ae22c68d", + "implementation": "0x96baa229e1a0bdb750330617876cb9f40d9c2632", + "implementationDeployment": { + "txHash": "0x2175ca7acce3d792681391f98458190c7a1983d9222856ec28663a13df98577a", + "argsData": "0x000000000000000000000000f8c05dcf59e8b28bfd5eed176c562bebcfc7ac04", + "bytecodeHash": "0xf16079c15a15d3ae077bfadf40e4865fe5c73bb213486831e129b725a8554092", + "blockNumber": 258351131, + "timestamp": "2026-04-10T15:30:19.000Z", + "verified": "https://sepolia.arbiscan.io/address/0x96baa229e1a0bdb750330617876cb9f40d9c2632#code" + }, + "proxyDeployment": { + "txHash": "0xd633a88e947568883f1f38be269f63f061d764550ebae189402b11a376f7e973", + "argsData": "0x00000000000000000000000050782d395e32300f57f6446951cf6734ae22c68d00000000000000000000000072ee30d43fb5a90b3fe983156c5d2fbe6f6d07b300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de800000000000000000000000072ee30d43fb5a90b3fe983156c5d2fbe6f6d07b300000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 250574013, + "verified": "https://sepolia.arbiscan.io/address/0x76a0d75651d4db83f74ac502b86a0ae4e19ac38b#code" + } + }, + "DefaultAllocation": { + "address": "0xa0eab4367d753314840c09313a5c6d27174bd541", + "proxy": "transparent", + "proxyAdmin": "0x6b09a6fcef85b1df540c922af2c9b64847ff8ae6", + "implementation": "0xd5de0951759b8306226fa370a9ecca40a31aa2d3", + "proxyDeployment": { + "txHash": "0xde2ebe4a22d0b6473736cea55f335bb5debfc6086a4de4f7261d6b3d0ff6952a", + "argsData": "0x000000000000000000000000d5de0951759b8306226fa370a9ecca40a31aa2d3000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 258322247, + "verified": "https://sepolia.arbiscan.io/address/0xa0eab4367d753314840c09313a5c6d27174bd541#code" + } + }, + "ReclaimedRewards": { + "address": "0xe01bb1bba83d3d5b823877d85bc3ba9fd7835c6d", + "proxy": "transparent", + "proxyAdmin": "0xb2201d01a41c1afc76fa9e598f3c57b5733dc7dc", + "implementation": "0xd5de0951759b8306226fa370a9ecca40a31aa2d3", + "proxyDeployment": { + "txHash": "0x26a5e9dbce77a2b88906321c51505ae4ea8b570b5d86d161fa68753553eb23ee", + "argsData": "0x000000000000000000000000d5de0951759b8306226fa370a9ecca40a31aa2d3000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 258322261, + "verified": "https://sepolia.arbiscan.io/address/0xe01bb1bba83d3d5b823877d85bc3ba9fd7835c6d#code" + } + }, + "RecurringAgreementManager": { + "address": "0x590dbbbdb1b6261e39bcc1fe88bffc21c847a68e", + "proxy": "transparent", + "proxyAdmin": "0xc80b101a601d38b3f72e22c613fdafb594d82f2e", + "implementation": "0xcea9350703c07dc1a92516f472d4769092e26e21", "implementationDeployment": { - "txHash": "0x4cf7787b81d88786893c7aca5da193d9041c3272995f3c1cdd202d87919e47e6", + "txHash": "0xd182846b059c7441dd76172a343d51185184a74a5a834e546a493429ef8096b1", + "argsData": "0x000000000000000000000000f8c05dcf59e8b28bfd5eed176c562bebcfc7ac040000000000000000000000004b5d3da463f7e076bb7cdf5030960bf123245681", + "bytecodeHash": "0x8d7d7208240cb7032d538818a2879ac2b6102267d80258c943469b16d7794d3f", + "blockNumber": 258351168, + "timestamp": "2026-04-10T15:30:28.000Z", + "verified": "https://sepolia.arbiscan.io/address/0xcea9350703c07dc1a92516f472d4769092e26e21#code" + }, + "proxyDeployment": { + "txHash": "0x8b6a8b30950715a5be3c95159949a2dc2bf7368684022a8f305eb711c5667e85", + "argsData": "0x0000000000000000000000002b114f3a63715224c1b5722f17fd84b6417a794a000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 258322276, + "verified": "https://sepolia.arbiscan.io/address/0x590dbbbdb1b6261e39bcc1fe88bffc21c847a68e#code" + } + }, + "RewardsEligibilityOracleB": { + "address": "0xcc70eae4001b36029fecb285ba6e8bbfd753e3da", + "proxy": "transparent", + "proxyAdmin": "0x6bbf45ff96b1acfbb04645c42783d8115c4befde", + "implementation": "0x35150110d11199e746fc1529f1647f162fb6c785", + "implementationDeployment": { + "txHash": "0xc60d3032c9c4825115e4d7432784dcf69e2c59557bae4607165a416b59792a35", + "argsData": "0x000000000000000000000000f8c05dcf59e8b28bfd5eed176c562bebcfc7ac04", + "bytecodeHash": "0x8ff7d1a6e22cf7f074c4688d9c84394ee151531de3f219ceabf66f0386201412", + "blockNumber": 258351208, + "timestamp": "2026-04-10T15:30:40.000Z", + "verified": "https://sepolia.arbiscan.io/address/0x35150110d11199e746fc1529f1647f162fb6c785#code" + }, + "proxyDeployment": { + "txHash": "0xccaf5e98ca9b1112ef332119c5ad2830d4b7d951d1ba4319f6fb3538dff4eff1", + "argsData": "0x000000000000000000000000b23e0463b930523ff34b32b28f32ff0484a8e0dc000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 258322322, + "verified": "https://sepolia.arbiscan.io/address/0xcc70eae4001b36029fecb285ba6e8bbfd753e3da#code" + } + }, + "RewardsEligibilityOracleMock": { + "address": "0x69b0f3c6a19beaf1ba59405f7179e188c64b4e06", + "proxy": "transparent", + "proxyAdmin": "0xca303d77c53c1e8aaec32d1a81e5a359ea2bb308", + "implementation": "0xa9336216cd501c554c76f1dcd85b90e84ebbf972", + "implementationDeployment": { + "txHash": "0x7c12fea73aac7421b49f41508ef87f9c542e7fa7001152850a57d63797e94109", + "argsData": "0x000000000000000000000000f8c05dcf59e8b28bfd5eed176c562bebcfc7ac04", + "bytecodeHash": "0x7048d139b92b2e2638c66eca026737eddd064e85ebf20e0438bdef81232ea320", + "blockNumber": 258351227, + "timestamp": "2026-04-10T15:30:46.000Z", + "verified": "https://sepolia.arbiscan.io/address/0xa9336216cd501c554c76f1dcd85b90e84ebbf972#code" + }, + "proxyDeployment": { + "txHash": "0xff444e8f13200eed55e7499b4cbdf4d4363f3e6db2c9913bc19ee5b0abbf75ec", + "argsData": "0x0000000000000000000000009e67aff526f1446455cc3e154c813100048c0ee5000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000", + "bytecodeHash": "0x6b4ba3015667741610274b7c196ec5d7767235d85865912f7ac680eac3011c54", + "blockNumber": 258322343, + "verified": "https://sepolia.arbiscan.io/address/0x69b0f3c6a19beaf1ba59405f7179e188c64b4e06#code" + } + }, + "DirectAllocation_Implementation": { + "address": "0xd5de0951759b8306226fa370a9ecca40a31aa2d3", + "deployment": { + "txHash": "", "argsData": "0x000000000000000000000000f8c05dcf59e8b28bfd5eed176c562bebcfc7ac04", - "bytecodeHash": "0x94b490cdb340cdf9f601e618fdb7e21608969ba1a0dee05a3b017efa4ad36ad0", - "blockNumber": 250574005 + "bytecodeHash": "0xf11b102de39fbe66879f57214393c7ff7438e050f77802e2c08c71a000002003" } } } diff --git a/packages/subgraph-service/addresses.json b/packages/subgraph-service/addresses.json index 59eb1a67b..60a90dec8 100644 --- a/packages/subgraph-service/addresses.json +++ b/packages/subgraph-service/addresses.json @@ -37,14 +37,14 @@ "address": "0xc24A3dAC5d06d771f657A48B20cE1a671B78f26b", "proxy": "transparent", "proxyAdmin": "0x15737D9f8635cAcd43e110327c930bd5EC1fe098", - "implementation": "0x8a6361e7355d6936ab17aaacde797d01c0e6c4c4", + "implementation": "0xe549fe68aab5a251f2b76c325c497461ec244bd9", "implementationDeployment": { - "txHash": "0x9f3fc372d88a97832eb47bc1f98176532b9a54fa0c110dab8399f9e55ab0aa9d", - "argsData": "0x0000000000000000000000009db3ee191681f092607035d9bda6e59fbeaca69500000000000000000000000096e1b86b2739e8a3d59f40f2532cadf9ce8da088000000000000000000000000382863e7b662027117449bd2c49285582bbbd21b000000000000000000000000de761f075200e75485f4358978fb4d1dc8644fd5", - "bytecodeHash": "0x9c25d2f93e6a2a34cc19d00224872e288a8392d5d99b2df680b7e978d148d450", - "blockNumber": 240040490, - "timestamp": "2026-02-05T20:26:15.000Z", - "verified": "https://sepolia.arbiscan.io/address/0x8a6361e7355d6936ab17aaacde797d01c0e6c4c4#code" + "txHash": "0xcea5fab7372ecbb7d3810d5b01f347b6da71e1a52eacb625dd76385099f8e0ea", + "argsData": "0x0000000000000000000000009db3ee191681f092607035d9bda6e59fbeaca69500000000000000000000000096e1b86b2739e8a3d59f40f2532cadf9ce8da088000000000000000000000000382863e7b662027117449bd2c49285582bbbd21b000000000000000000000000de761f075200e75485f4358978fb4d1dc8644fd50000000000000000000000000b18befc60455121ad66ae6e4a647955fcde3900", + "bytecodeHash": "0x8d08acc2dc16818f457d86cdf7bf86d1903a3786cd3f4ec430239dd553473926", + "blockNumber": 258351073, + "timestamp": "2026-04-10T15:30:03.000Z", + "verified": "https://sepolia.arbiscan.io/address/0xe549fe68aab5a251f2b76c325c497461ec244bd9#code" }, "proxyDeployment": { "verified": "https://sepolia.arbiscan.io/address/0xc24A3dAC5d06d771f657A48B20cE1a671B78f26b#code" @@ -54,7 +54,18 @@ "address": "0x96e1b86b2739e8A3d59F40F2532caDF9cE8Da088", "proxy": "transparent", "proxyAdmin": "0x154a73CB6ebB5717a15f203d6E160E6F41ecC527", - "implementation": "0x28A0cFDE10e8Ea5C7f3E80981728E3eA1228D338" + "implementation": "0xa2016b450af51c356295388ba944f1396ae0ab35", + "implementationDeployment": { + "txHash": "0xb81c006bdfe70d834309bf6bbc32ba8b659508ab4a8283f99c41af52b6933a45", + "argsData": "0x0000000000000000000000009db3ee191681f092607035d9bda6e59fbeaca695", + "bytecodeHash": "0xff6852f3bcaeb2e092067b1c8239a93f36d945f0bbca82cb721d65b5a953ab25", + "blockNumber": 258351091, + "timestamp": "2026-04-10T15:30:08.000Z", + "verified": "https://sepolia.arbiscan.io/address/0xa2016b450af51c356295388ba944f1396ae0ab35#code" + }, + "proxyDeployment": { + "verified": "https://sepolia.arbiscan.io/address/0x96e1b86b2739e8A3d59F40F2532caDF9cE8Da088#code" + } }, "L2Curation": { "address": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", From 0833d95f9626329285846fb4be35d17277dbc62d Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 11:10:33 +0000 Subject: [PATCH 05/29] docs(address-book): publishing guide and 1.2.0 changelog --- packages/address-book/CHANGELOG.md | 6 + packages/address-book/docs/PublishingGuide.md | 108 ++++++++++++++++++ packages/address-book/package.json | 2 +- 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 packages/address-book/docs/PublishingGuide.md diff --git a/packages/address-book/CHANGELOG.md b/packages/address-book/CHANGELOG.md index 11e71dae2..1427d84c2 100644 --- a/packages/address-book/CHANGELOG.md +++ b/packages/address-book/CHANGELOG.md @@ -1,5 +1,11 @@ # @graphprotocol/address-book +## 1.2.0 + +### Minor Changes + +- Upgraded Rewards Manager and Subgraph Service with Rewards Eligibility Oracle and rewards reclaiming. + ## 1.1.0 ### Minor Changes diff --git a/packages/address-book/docs/PublishingGuide.md b/packages/address-book/docs/PublishingGuide.md new file mode 100644 index 000000000..d4b021783 --- /dev/null +++ b/packages/address-book/docs/PublishingGuide.md @@ -0,0 +1,108 @@ +# Publishing @graphprotocol/address-book + +Step-by-step guide for releasing a new version of the address-book package and deploying it to the network monitor. + +## Prerequisites + +- npm publish access for the `@graphprotocol` scope +- Write access to the [network-monitor](https://github.com/edgeandnode/network-monitor) repo +- Ability to trigger GitHub Actions workflows in both repos + +## Step 1: Update Address Files + +Update the source address files in the contracts monorepo. These live in: + +- `packages/horizon/addresses.json` +- `packages/subgraph-service/addresses.json` +- `packages/issuance/addresses.json` + +The address-book package symlinks to these files during development, so changes here are automatically reflected locally. + +## Step 2: Create a Changeset + +From the monorepo root: + +```bash +pnpm changeset +``` + +- Select `@graphprotocol/address-book` +- Choose the bump type (patch/minor/major) +- Describe what changed (e.g., "update arbitrumSepolia addresses after deployment") + +## Step 3: Version the Package + +```bash +pnpm changeset version +``` + +This consumes the changeset, bumps the version in `packages/address-book/package.json`, and updates `CHANGELOG.md`. + +## Step 4: Commit and Push + +```bash +git add . +git commit -m "chore: release @graphprotocol/address-book vX.Y.Z" +git push +``` + +## Step 5: Publish to npm + +1. Go to the contracts monorepo → Actions → "Publish package to NPM" +2. Select `address-book` as the package +3. Set tag to `latest` (or a pre-release tag) +4. Run workflow + +The workflow automatically: + +- Publishes to npm (symlinks are converted to real files via `prepublishOnly`) +- Creates and pushes a git tag (`@graphprotocol/address-book@X.Y.Z`) + +## Step 6: Verify on npm + +```bash +npm view @graphprotocol/address-book version +``` + +Confirm the new version is live. + +## Step 7: Update the Network Monitor + +In the [network-monitor](https://github.com/edgeandnode/network-monitor) repo: + +1. Update `package.json` to reference the new version: + + ```json + "@graphprotocol/address-book": "X.Y.Z", + ``` + +2. Run `yarn` to update the lockfile +3. Commit and push + +The network monitor imports addresses from: + +- `@graphprotocol/address-book/horizon/addresses.json` (in `src/env.ts`) +- `@graphprotocol/address-book/subgraph-service/addresses.json` (in `src/env.ts`, `src/tests/contracts.ts`) + +## Step 8: Deploy the Network Monitor + +1. Go to the network-monitor repo → Actions → "Deployment" +2. Choose the target cluster: + - **`network`** → production (mainnet) + - **`testnet`** → testnet +3. Run workflow + +This builds a Docker image, pushes it to `ghcr.io/edgeandnode/network-monitor`, and restarts the StatefulSet on GKE. + +## Quick Reference + +| Step | Action | Where | +| ---- | ------------------------------- | ----------------------------- | +| 1 | Update address files | contracts monorepo | +| 2 | `pnpm changeset` | contracts monorepo | +| 3 | `pnpm changeset version` | contracts monorepo | +| 4 | Commit + push | contracts monorepo | +| 5 | Publish to npm (auto-tags) | contracts monorepo GH Actions | +| 6 | Verify on npm | npmjs.com | +| 7 | Bump version in network-monitor | network-monitor repo | +| 8 | Deploy network monitor | network-monitor GH Actions | diff --git a/packages/address-book/package.json b/packages/address-book/package.json index 0a1d886e9..329309a01 100644 --- a/packages/address-book/package.json +++ b/packages/address-book/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/address-book", - "version": "1.1.0", + "version": "1.2.0", "publishConfig": { "access": "public" }, From 2e7319d86d11964714d638eec6f7483c071d0bf5 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 6 May 2026 12:52:45 +0000 Subject: [PATCH 06/29] chore: bump interfaces 0.7.1-dips.0 / toolshed 1.2.1-dips.2 for dips publish --- packages/interfaces/package.json | 2 +- packages/toolshed/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/interfaces/package.json b/packages/interfaces/package.json index 3b774337d..a25e678a1 100644 --- a/packages/interfaces/package.json +++ b/packages/interfaces/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/interfaces", - "version": "0.6.6", + "version": "0.7.1-dips.0", "publishConfig": { "access": "public" }, diff --git a/packages/toolshed/package.json b/packages/toolshed/package.json index b60e2a86d..375bb36ff 100644 --- a/packages/toolshed/package.json +++ b/packages/toolshed/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/toolshed", - "version": "1.1.2", + "version": "1.2.1-dips.2", "publishConfig": { "access": "public" }, From 324b04ece8b6e340b12a23165f26c6f86b15bbf9 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 11:10:47 +0000 Subject: [PATCH 07/29] fix: root tooling compat (rocketh patch, hardhat-waffle deps, etherscan env fallback) Three small workspace-root fixes needed to make the deployment package and the legacy contracts test suite coexist: - patches/rocketh@0.17.13.patch re-enables the deployScript skip() hook. Upstream 0.17.13 has the skip path commented out, so any deploy script defining `func.skip` was executed unconditionally; the deployment package relies on skip() to short-circuit no-op steps. Patch restores the call and removes the commented-out scaffolding. - pnpm packageExtensions for @nomiclabs/hardhat-waffle. Under pnpm strict mode the package's missing peer declarations on @ethereum-waffle/{chai,provider} cause hardhat-waffle to fail to resolve them. The legacy contracts test suite still imports hardhat-waffle, so declare the deps via packageExtensions rather than upgrading the test suite off waffle. - ARBISCAN_API_KEY env fallback in packages/contracts/hardhat.config.ts. Hardhat keystore (`vars`) is the documented path, but CI and local scripts often only set the environment variable; fall back to process.env so verification works in both contexts. --- package.json | 11 +++++++++- packages/contracts/hardhat.config.ts | 3 ++- patches/rocketh@0.17.13.patch | 33 ++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 patches/rocketh@0.17.13.patch diff --git a/package.json b/package.json index 5808128ba..972633896 100644 --- a/package.json +++ b/package.json @@ -56,8 +56,17 @@ "overrides": { "@types/node": "^20.17.50" }, + "packageExtensions": { + "@nomiclabs/hardhat-waffle@*": { + "dependencies": { + "@ethereum-waffle/chai": "*", + "@ethereum-waffle/provider": "*" + } + } + }, "patchedDependencies": { - "typechain@8.3.2": "patches/typechain@8.3.2.patch" + "typechain@8.3.2": "patches/typechain@8.3.2.patch", + "rocketh@0.17.13": "patches/rocketh@0.17.13.patch" } }, "lint-staged": { diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 86b77d5c5..ba90039ca 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -60,7 +60,8 @@ const config: HardhatUserConfig = { etherscan: { // Use ARBISCAN_API_KEY for Arbitrum networks // For mainnet Ethereum, use ETHERSCAN_API_KEY - apiKey: vars.has('ARBISCAN_API_KEY') ? vars.get('ARBISCAN_API_KEY') : '', + // Check both keystore (vars) and environment variable + apiKey: vars.has('ARBISCAN_API_KEY') ? vars.get('ARBISCAN_API_KEY') : (process.env.ARBISCAN_API_KEY ?? ''), }, sourcify: { enabled: false, diff --git a/patches/rocketh@0.17.13.patch b/patches/rocketh@0.17.13.patch new file mode 100644 index 000000000..e16957b96 --- /dev/null +++ b/patches/rocketh@0.17.13.patch @@ -0,0 +1,33 @@ +diff --git a/dist/executor/index.js b/dist/executor/index.js +index 05324b861bfa25afe89da4afba244f92c17c9c1c..e3529b53f92e4657a160e899715216267a25f6af 100644 +--- a/dist/executor/index.js ++++ b/dist/executor/index.js +@@ -338,19 +338,16 @@ Do you want to proceed (note that gas price can change for each tx)`, + logger.info(`skipping ${deployScript.id} as migrations already executed and complete`); + continue; + } +- let skip = false; ++ if (deployScript.func.skip) { ++ try { ++ const skip = await deployScript.func.skip(external, args); ++ if (skip) continue; ++ } catch (e) { ++ throw e; ++ } ++ } + const spinner = spin(`- Executing ${deployScript.id}`); +- // if (deployScript.func.skip) { +- // const spinner = spin(` - skip?()`); +- // try { +- // skip = await deployScript.func.skip(external, args); +- // spinner.succeed(skip ? `skipping ${filename}` : undefined); +- // } catch (e) { +- // spinner.fail(); +- // throw e; +- // } +- // } +- if (!skip) { ++ { + let result; + try { + result = await deployScript.func(external, args); From dc8f8f50dc98521c03e6d9de860e9e5df7ade7cc Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Fri, 10 Apr 2026 11:59:42 +0000 Subject: [PATCH 08/29] refactor(data-edge): upgrade to ethers v6 and @nomicfoundation plugins MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The rest of the workspace had moved to ethers v6 and the @nomicfoundation/hardhat-* plugin generation; data-edge was the last holdout on ethers v5, @nomiclabs/hardhat-*, ethereum-waffle, and the @ethersproject/* sub-packages. The mismatch produced peer-dependency clashes that broke local network deploys whenever data-edge was pulled into the same Hardhat run as the rest of the workspace. Safe to do as a straight bump: - The package's deployed contracts only need recompilation to match a later toolchain; any new deployment naturally targets the newer versions, so there is no historical compatibility to preserve. - The migration is mechanical (ethers v6 API renames, BigNumber → bigint, chai-matchers move under @nomicfoundation, etc.) and stays contained to hardhat.config.ts, tasks, and tests — no contract code is touched. Also drops dead testnet entries (ropsten, rinkeby, kovan, arbitrum-goerli) and unused dependencies (tenderly, ethereum-waffle, ethlint, husky/lint-staged) on the way through. --- packages/data-edge/hardhat.config.ts | 31 ++---------- packages/data-edge/package.json | 45 ++++++----------- packages/data-edge/tasks/craft-calldata.ts | 6 +-- packages/data-edge/tasks/deploy.ts | 20 ++++---- packages/data-edge/tasks/post-calldata.ts | 18 +++---- packages/data-edge/test/dataedge.test.ts | 40 +++++---------- .../data-edge/test/eventful-dataedge.test.ts | 50 +++++++------------ 7 files changed, 68 insertions(+), 142 deletions(-) diff --git a/packages/data-edge/hardhat.config.ts b/packages/data-edge/hardhat.config.ts index a3b1ccff4..6dee140d0 100644 --- a/packages/data-edge/hardhat.config.ts +++ b/packages/data-edge/hardhat.config.ts @@ -1,15 +1,12 @@ import '@typechain/hardhat' -// Plugins -import '@nomiclabs/hardhat-ethers' -import '@nomiclabs/hardhat-etherscan' -import '@nomiclabs/hardhat-waffle' +import '@nomicfoundation/hardhat-ethers' +import '@nomicfoundation/hardhat-chai-matchers' +import '@nomicfoundation/hardhat-verify' import 'hardhat-abi-exporter' import 'hardhat-gas-reporter' import 'hardhat-contract-sizer' -import '@openzeppelin/hardhat-upgrades' import 'solidity-coverage' -import '@tenderly/hardhat-tenderly' -import 'hardhat-secure-accounts' // for graph config +import 'hardhat-secure-accounts' // Tasks import './tasks/craft-calldata' import './tasks/post-calldata' @@ -29,20 +26,12 @@ interface NetworkConfig { const networkConfigs: NetworkConfig[] = [ { network: 'mainnet', chainId: 1 }, - { network: 'ropsten', chainId: 3 }, - { network: 'rinkeby', chainId: 4 }, - { network: 'kovan', chainId: 42 }, { network: 'sepolia', chainId: 11155111 }, { network: 'arbitrum-one', chainId: 42161, url: 'https://arb1.arbitrum.io/rpc', }, - { - network: 'arbitrum-goerli', - chainId: 421613, - url: 'https://goerli-rollup.arbitrum.io/rpc', - }, { network: 'arbitrum-sepolia', chainId: 421614, @@ -89,10 +78,6 @@ task('accounts', 'Prints the list of accounts', async (_, bre) => { // Config const config: HardhatUserConfig = { - graph: { - addressBook: process.env.ADDRESS_BOOK || 'addresses.json', - disableSecureAccounts: true, - }, paths: { sources: './contracts', tests: './test', @@ -140,10 +125,8 @@ const config: HardhatUserConfig = { etherscan: { apiKey: { mainnet: process.env.ETHERSCAN_API_KEY, - goerli: process.env.ETHERSCAN_API_KEY, sepolia: process.env.ETHERSCAN_API_KEY, arbitrumOne: process.env.ARBISCAN_API_KEY, - arbitrumGoerli: process.env.ARBISCAN_API_KEY, arbitrumSepolia: process.env.ARBISCAN_API_KEY, }, }, @@ -155,17 +138,13 @@ const config: HardhatUserConfig = { }, typechain: { outDir: 'build/types', - target: 'ethers-v5', + target: 'ethers-v6', }, abiExporter: { path: './build/abis', clear: false, flat: true, }, - tenderly: { - project: process.env.TENDERLY_PROJECT, - username: process.env.TENDERLY_USERNAME, - }, contractSizer: { alphaSort: true, runOnCompile: false, diff --git a/packages/data-edge/package.json b/packages/data-edge/package.json index c97514031..15b97d050 100644 --- a/packages/data-edge/package.json +++ b/packages/data-edge/package.json @@ -7,8 +7,6 @@ "license": "GPL-2.0-or-later", "main": "index.js", "scripts": { - "prepare": "cd ../.. && husky install packages/contracts/.husky", - "prepublishOnly": "scripts/prepublish", "build": "pnpm build:self", "build:self": "scripts/build", "clean": "rm -rf build/ cache/ dist/ reports/ artifacts/", @@ -35,43 +33,30 @@ "LICENSE" ], "devDependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/providers": "^5.7.0", - "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-etherscan": "^3.1.2", - "@nomiclabs/hardhat-waffle": "^2.0.1", - "@openzeppelin/contracts": "^4.5.0", - "@openzeppelin/hardhat-upgrades": "^1.8.2", - "@tenderly/api-client": "^1.0.13", - "@tenderly/hardhat-tenderly": "^1.0.13", - "@typechain/ethers-v5": "^10.2.1", - "@typechain/hardhat": "^6.1.6", + "@nomicfoundation/hardhat-chai-matchers": "catalog:", + "@nomicfoundation/hardhat-ethers": "catalog:", + "@nomicfoundation/hardhat-verify": "catalog:", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "catalog:", "@types/mocha": "^9.0.0", - "@types/node": "^20.17.50", + "@types/node": "catalog:", "@types/sinon-chai": "^3.2.12", - "chai": "^4.2.0", - "dotenv": "^16.0.0", + "chai": "catalog:", + "dotenv": "catalog:", "eslint": "catalog:", - "ethereum-waffle": "^3.0.2", - "ethers": "^5.7.2", - "ethlint": "^1.2.5", + "ethers": "catalog:", "hardhat": "catalog:", "hardhat-abi-exporter": "^2.2.0", - "hardhat-contract-sizer": "^2.0.3", - "hardhat-gas-reporter": "^1.0.4", - "hardhat-secure-accounts": "0.0.6", - "husky": "^7.0.4", - "lint-staged": "^12.3.5", - "lodash": "^4.17.21", - "markdownlint-cli": "0.45.0", + "hardhat-contract-sizer": "catalog:", + "hardhat-gas-reporter": "catalog:", + "hardhat-secure-accounts": "catalog:", + "markdownlint-cli": "catalog:", "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", + "ts-node": "catalog:", + "typechain": "catalog:", "typescript": "catalog:" } } diff --git a/packages/data-edge/tasks/craft-calldata.ts b/packages/data-edge/tasks/craft-calldata.ts index 8e285886c..855478f68 100644 --- a/packages/data-edge/tasks/craft-calldata.ts +++ b/packages/data-edge/tasks/craft-calldata.ts @@ -1,5 +1,3 @@ -import '@nomiclabs/hardhat-ethers' - import { Contract } from 'ethers' import { task } from 'hardhat/config' @@ -35,15 +33,13 @@ task('data:craft', 'Build calldata') .addParam('selector', 'Selector name') .addParam('data', 'Call data to post') .setAction(async (taskArgs, hre) => { - // parse input const edgeAddress = taskArgs.edge const calldata = taskArgs.data const selector = taskArgs.selector - // build data const abi = getAbiForSelector(selector) const contract = getContract(edgeAddress, abi, hre.ethers.provider) - const tx = await contract.populateTransaction[selector](calldata) + const tx = await contract[selector].populateTransaction(calldata) const txData = tx.data console.log(txData) }) diff --git a/packages/data-edge/tasks/deploy.ts b/packages/data-edge/tasks/deploy.ts index 0ad97d194..ca142b1e2 100644 --- a/packages/data-edge/tasks/deploy.ts +++ b/packages/data-edge/tasks/deploy.ts @@ -1,5 +1,3 @@ -import '@nomiclabs/hardhat-ethers' - import { promises as fs } from 'fs' import { task } from 'hardhat/config' @@ -31,25 +29,25 @@ task('data-edge:deploy', 'Deploy a DataEdge contract') console.log(`Deploying contract...`) const contract = await factory.deploy() - const tx = contract.deployTransaction + const tx = contract.deploymentTransaction()! - // The address the Contract WILL have once mined - console.log(`> deployer: ${await contract.signer.getAddress()}`) - console.log(`> contract: ${contract.address}`) + const contractAddress = await contract.getAddress() + const [signer] = await hre.ethers.getSigners() + console.log(`> deployer: ${await signer.getAddress()}`) + console.log(`> contract: ${contractAddress}`) console.log( - `> tx: ${tx.hash} nonce:${tx.nonce} limit: ${tx.gasLimit.toString()} gas: ${tx.gasPrice.toNumber() / 1e9} (gwei)`, + `> tx: ${tx.hash} nonce:${tx.nonce} limit: ${tx.gasLimit.toString()} gas: ${Number(tx.gasPrice) / 1e9} (gwei)`, ) - // The contract is NOT deployed yet; we must wait until it is mined - await contract.deployed() + await contract.waitForDeployment() console.log(`Done!`) // Update addresses.json - const chainId = hre.network.config.chainId.toString() + const chainId = hre.network.config.chainId!.toString() if (!addresses[chainId]) { addresses[chainId] = {} } const deployName = `${taskArgs.deployName}${taskArgs.contract}` - addresses[chainId][deployName] = contract.address + addresses[chainId][deployName] = contractAddress return fs.writeFile('addresses.json', JSON.stringify(addresses, null, 2) + '\n') }) diff --git a/packages/data-edge/tasks/post-calldata.ts b/packages/data-edge/tasks/post-calldata.ts index fbededfbc..edd455511 100644 --- a/packages/data-edge/tasks/post-calldata.ts +++ b/packages/data-edge/tasks/post-calldata.ts @@ -1,30 +1,28 @@ -import '@nomiclabs/hardhat-ethers' - import { task } from 'hardhat/config' task('data:post', 'Post calldata') .addParam('edge', 'Address of the data edge contract') .addParam('data', 'Call data to post') .setAction(async (taskArgs, hre) => { - // prepare data const edgeAddress = taskArgs.edge const txData = taskArgs.data + const [signer] = await hre.ethers.getSigners() const contract = await hre.ethers.getContractAt('DataEdge', edgeAddress) + const contractAddress = await contract.getAddress() const txRequest = { data: txData, - to: contract.address, + to: contractAddress, } - // send transaction console.log(`Sending data...`) - console.log(`> edge: ${contract.address}`) - console.log(`> sender: ${await contract.signer.getAddress()}`) + console.log(`> edge: ${contractAddress}`) + console.log(`> sender: ${await signer.getAddress()}`) console.log(`> payload: ${txData}`) - const tx = await contract.signer.sendTransaction(txRequest) + const tx = await signer.sendTransaction(txRequest) console.log( - `> tx: ${tx.hash} nonce:${tx.nonce} limit: ${tx.gasLimit.toString()} gas: ${tx.gasPrice.toNumber() / 1e9} (gwei)`, + `> tx: ${tx.hash} nonce:${tx.nonce} limit: ${tx.gasLimit.toString()} gas: ${Number(tx.gasPrice) / 1e9} (gwei)`, ) const rx = await tx.wait() - console.log('> rx: ', rx.status == 1 ? 'success' : 'failed') + console.log('> rx: ', rx!.status == 1 ? 'success' : 'failed') console.log(`Done!`) }) diff --git a/packages/data-edge/test/dataedge.test.ts b/packages/data-edge/test/dataedge.test.ts index 479758881..b96257786 100644 --- a/packages/data-edge/test/dataedge.test.ts +++ b/packages/data-edge/test/dataedge.test.ts @@ -1,57 +1,43 @@ -import '@nomiclabs/hardhat-ethers' - -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { expect } from 'chai' import { ethers } from 'hardhat' -import { DataEdge, DataEdge__factory } from '../build/types' - -const { getContractFactory, getSigners } = ethers -const { id, hexConcat, randomBytes, hexlify, defaultAbiCoder } = ethers.utils +import { DataEdge } from '../build/types' describe('DataEdge', () => { let edge: DataEdge - let me: SignerWithAddress + let me: Awaited>[0] beforeEach(async () => { - ;[me] = await getSigners() + ;[me] = await ethers.getSigners() - const factory = (await getContractFactory('DataEdge', me)) as DataEdge__factory + const factory = await ethers.getContractFactory('DataEdge', me) edge = await factory.deploy() - await edge.deployed() + await edge.waitForDeployment() }) describe('submit data', () => { it('post any arbitrary data as selector', async () => { - // virtual function call const txRequest = { data: '0x123123', - to: edge.address, + to: await edge.getAddress(), } - // send transaction const tx = await me.sendTransaction(txRequest) const rx = await tx.wait() - // transaction must work - it just stores data - expect(rx.status).eq(1) + expect(rx!.status).eq(1) }) it('post long calldata', async () => { - // virtual function call - const selector = id('setEpochBlocksPayload(bytes)').slice(0, 10) - // calldata payload - const messageBlocks = hexlify(randomBytes(1000)) - const txCalldata = defaultAbiCoder.encode(['bytes'], [messageBlocks]) // we abi encode to allow the subgraph to decode it properly - const txData = hexConcat([selector, txCalldata]) - // craft full transaction + const selector = ethers.id('setEpochBlocksPayload(bytes)').slice(0, 10) + const messageBlocks = ethers.hexlify(ethers.randomBytes(1000)) + const txCalldata = ethers.AbiCoder.defaultAbiCoder().encode(['bytes'], [messageBlocks]) + const txData = ethers.concat([selector, txCalldata]) const txRequest = { data: txData, - to: edge.address, + to: await edge.getAddress(), } - // send transaction const tx = await me.sendTransaction(txRequest) const rx = await tx.wait() - // transaction must work - it just stores data - expect(rx.status).eq(1) + expect(rx!.status).eq(1) }) }) }) diff --git a/packages/data-edge/test/eventful-dataedge.test.ts b/packages/data-edge/test/eventful-dataedge.test.ts index 8bdf86a2e..974dde5dc 100644 --- a/packages/data-edge/test/eventful-dataedge.test.ts +++ b/packages/data-edge/test/eventful-dataedge.test.ts @@ -1,63 +1,47 @@ -import '@nomiclabs/hardhat-ethers' - -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { expect } from 'chai' import { ethers } from 'hardhat' -import { EventfulDataEdge, EventfulDataEdge__factory } from '../build/types' - -const { getContractFactory, getSigners } = ethers -const { id, hexConcat, randomBytes, hexlify, defaultAbiCoder } = ethers.utils +import { EventfulDataEdge } from '../build/types' describe('EventfulDataEdge', () => { let edge: EventfulDataEdge - let me: SignerWithAddress + let me: Awaited>[0] beforeEach(async () => { - ;[me] = await getSigners() + ;[me] = await ethers.getSigners() - const factory = (await getContractFactory('EventfulDataEdge', me)) as EventfulDataEdge__factory + const factory = await ethers.getContractFactory('EventfulDataEdge', me) edge = await factory.deploy() - await edge.deployed() + await edge.waitForDeployment() }) describe('submit data', () => { it('post any arbitrary data as selector', async () => { - // virtual function call const txRequest = { data: '0x123123', - to: edge.address, + to: await edge.getAddress(), } - // send transaction const tx = await me.sendTransaction(txRequest) const rx = await tx.wait() - // transaction must work - it just stores data - expect(rx.status).eq(1) - // emit log event - const event = edge.interface.parseLog(rx.logs[0]).args - expect(event.data).eq(txRequest.data) + expect(rx!.status).eq(1) + const event = edge.interface.parseLog({ topics: rx!.logs[0].topics as string[], data: rx!.logs[0].data }) + expect(event!.args.data).eq(txRequest.data) }) it('post long calldata', async () => { - // virtual function call - const selector = id('setEpochBlocksPayload(bytes)').slice(0, 10) - // calldata payload - const messageBlocks = hexlify(randomBytes(1000)) - const txCalldata = defaultAbiCoder.encode(['bytes'], [messageBlocks]) // we abi encode to allow the subgraph to decode it properly - const txData = hexConcat([selector, txCalldata]) - // craft full transaction + const selector = ethers.id('setEpochBlocksPayload(bytes)').slice(0, 10) + const messageBlocks = ethers.hexlify(ethers.randomBytes(1000)) + const txCalldata = ethers.AbiCoder.defaultAbiCoder().encode(['bytes'], [messageBlocks]) + const txData = ethers.concat([selector, txCalldata]) const txRequest = { data: txData, - to: edge.address, + to: await edge.getAddress(), } - // send transaction const tx = await me.sendTransaction(txRequest) const rx = await tx.wait() - // transaction must work - it just stores data - expect(rx.status).eq(1) - // emit log event - const event = edge.interface.parseLog(rx.logs[0]).args - expect(event.data).eq(txRequest.data) + expect(rx!.status).eq(1) + const event = edge.interface.parseLog({ topics: rx!.logs[0].topics as string[], data: rx!.logs[0].data }) + expect(event!.args.data).eq(txRequest.data) }) }) }) From 45fb80eb88ebe7296edfe0eaae15b991893fe0c4 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 11:13:01 +0000 Subject: [PATCH 09/29] feat(subgraph-service): wire RecurringCollector parameter and StakeClaims/IndexingAgreement libraries via deployImplementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add recurringCollectorAddress as a module parameter and pass it into the SubgraphService constructor alongside the existing collector / curation / dispute-manager addresses, and link the StakeClaims, AllocationHandler, IndexingAgreementDecoder(Raw), and IndexingAgreement libraries. Uses the deployImplementation() helper from @graphprotocol/horizon/ignition rather than m.contract() — matches the pattern every other core module already uses (HorizonStaking, GraphPayments, PaymentsEscrow, RecurringCollector, RewardsManager, Curation). SubgraphService was the odd one out. --- .../ignition/modules/SubgraphService.ts | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/subgraph-service/ignition/modules/SubgraphService.ts b/packages/subgraph-service/ignition/modules/SubgraphService.ts index 8efb6800b..12f120976 100644 --- a/packages/subgraph-service/ignition/modules/SubgraphService.ts +++ b/packages/subgraph-service/ignition/modules/SubgraphService.ts @@ -15,6 +15,7 @@ export default buildModule('SubgraphService', (m) => { const disputeManagerProxyAddress = m.getParameter('disputeManagerProxyAddress') const graphTallyCollectorAddress = m.getParameter('graphTallyCollectorAddress') const curationProxyAddress = m.getParameter('curationProxyAddress') + const recurringCollectorAddress = m.getParameter('recurringCollectorAddress') const minimumProvisionTokens = m.getParameter('minimumProvisionTokens') const maximumDelegationRatio = m.getParameter('maximumDelegationRatio') const stakeToFeesRatio = m.getParameter('stakeToFeesRatio') @@ -28,12 +29,40 @@ export default buildModule('SubgraphService', (m) => { subgraphServiceProxyAddress, ) - // Deploy implementation - const SubgraphServiceImplementation = deployImplementation(m, { - name: 'SubgraphService', - constructorArgs: [controllerAddress, disputeManagerProxyAddress, graphTallyCollectorAddress, curationProxyAddress], + // Deploy libraries required by SubgraphService + const StakeClaims = m.library('StakeClaims') + const AllocationHandler = m.library('AllocationHandler') + const IndexingAgreementDecoderRaw = m.library('IndexingAgreementDecoderRaw') + const IndexingAgreementDecoder = m.library('IndexingAgreementDecoder', { + libraries: { IndexingAgreementDecoderRaw }, + }) + const IndexingAgreement = m.library('IndexingAgreement', { + libraries: { IndexingAgreementDecoder }, }) + // Deploy implementation + const SubgraphServiceImplementation = deployImplementation( + m, + { + name: 'SubgraphService', + constructorArgs: [ + controllerAddress, + disputeManagerProxyAddress, + graphTallyCollectorAddress, + curationProxyAddress, + recurringCollectorAddress, + ], + }, + { + libraries: { + StakeClaims, + AllocationHandler, + IndexingAgreement, + IndexingAgreementDecoder, + }, + }, + ) + // Upgrade implementation const SubgraphService = upgradeTransparentUpgradeableProxy( m, From 854a43504f2bd0300de13ca6e3e2e856129d15b0 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:40:33 +0000 Subject: [PATCH 10/29] fix: correct localNetwork addresses (governor / pauseGuardian / SAO) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Align localNetwork config across horizon and subgraph-service so addresses match the deploy modules' hardcoded ACCOUNT1 convention. Previously caused OwnableUnauthorizedAccount reverts mid-batch when run-scripts signed with ACCOUNT1_SECRET. Covers: - horizon localNetwork migrate/protocol governor → ACCOUNT1 - horizon localNetwork pauseGuardian and subgraphAvailabilityOracle - subgraph-service localNetwork migrate/protocol governor → ACCOUNT1 --- packages/horizon/ignition/configs/migrate.localNetwork.json5 | 2 +- packages/horizon/ignition/configs/protocol.localNetwork.json5 | 4 ++-- .../ignition/configs/migrate.localNetwork.json5 | 2 +- .../ignition/configs/protocol.localNetwork.json5 | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/horizon/ignition/configs/migrate.localNetwork.json5 b/packages/horizon/ignition/configs/migrate.localNetwork.json5 index 8b052634d..21f34880e 100644 --- a/packages/horizon/ignition/configs/migrate.localNetwork.json5 +++ b/packages/horizon/ignition/configs/migrate.localNetwork.json5 @@ -1,7 +1,7 @@ { "$global": { // Accounts already configured in the original Graph Protocol - Local Network values - "governor": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "governor": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", // Addresses for contracts deployed in the original Graph Protocol - Local Network values "graphProxyAdminAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", diff --git a/packages/horizon/ignition/configs/protocol.localNetwork.json5 b/packages/horizon/ignition/configs/protocol.localNetwork.json5 index 2d3c08b39..5b5ea1e2c 100644 --- a/packages/horizon/ignition/configs/protocol.localNetwork.json5 +++ b/packages/horizon/ignition/configs/protocol.localNetwork.json5 @@ -1,8 +1,8 @@ { "$global": { // Accounts for new deployment - derived from hardhat default mnemonic - "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", // index 3 - "subgraphAvailabilityOracle": "0xd03ea8624C8C5987235048901fB614fDcA89b117", // index 4 + "pauseGuardian": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", // index 3 + "subgraphAvailabilityOracle": "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", // index 4 // Placeholder address for a standalone Horizon deployment, see README.md for more details "subgraphServiceAddress": "0x0000000000000000000000000000000000000000", diff --git a/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 b/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 index c71d70a8f..9c93e1087 100644 --- a/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 +++ b/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 @@ -1,7 +1,7 @@ { "$global": { // Accounts already configured in the original Graph Protocol - Local Network values - "governor": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", // index 0 + "governor": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", // index 1 "arbitrator": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", // index 2 "pauseGuardian": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", // index 3 diff --git a/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 b/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 index 1b35b18c1..867873db1 100644 --- a/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 +++ b/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 @@ -1,7 +1,7 @@ { "$global": { // Accounts for new deployment - derived from local network mnemonic - "governor": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", // index 0 + "governor": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", // index 1 "arbitrator": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", // index 2 "pauseGuardian": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", // index 3 From 4dda611a7cba9798bcbe40ca905c0d1945c8e8f0 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 11:55:20 +0000 Subject: [PATCH 11/29] feat(deployment): add GIP-0088 deployment infrastructure Introduces packages/deployment with the deploy/ scripts, network configs, ABI generation, rocketh-based orchestration, and supporting tasks for the GIP-0088 testnet upgrade. Core infra: - governor registered as a rocketh named account so local/test signing works without explicit private-key plumbing - localNetwork tweaks to HorizonStaking ignition module - tag-deployment task annotation cleaned up (no commit-sha noise) Also includes: - drive RM revertOnIneligible from network config through ResolvedSettings into the upgrade governance batch; remove vestigial RecurringCollector block from network configs - gate sync rocketh-record seeding on artifact verification. When syncing a non-proxy address-book entry that has no rocketh deployment record, seed rocketh's record from the local artifact's bytecode only when the artifact's hash matches the address book's stored hash. Otherwise leave the record absent so the next deployFn sees no prior bytecode and produces newlyDeployed=true, propagating the new impl address through to proxy pending-upgrade detection naturally. Extract the gate into a pure shouldSeedRocketh helper and pin its truth table. - cross-package config reconciliation test that catches drift between per-network Ignition config files in horizon/ and subgraph-service/: sibling agreement, localNetwork all-files $global agreement, same-package cross-prefix sub-object agreement, and mnemonic-index correctness for accounts referenced in localNetwork configs. - sync RewardsManager in mock REO integrate path (otherwise stale on subsequent runs); namespace mock REO governance-tx label. --- packages/deployment/.gitignore | 1 + packages/deployment/CLAUDE.md | 3 +- packages/deployment/README.md | 64 +- packages/deployment/config/arbitrumOne.json5 | 12 + .../deployment/config/arbitrumSepolia.json5 | 12 + packages/deployment/config/localNetwork.json5 | 11 + .../deploy/agreement/manager/01_deploy.ts | 16 + .../deploy/agreement/manager/02_upgrade.ts | 4 + .../deploy/agreement/manager/04_configure.ts | 225 + .../manager/05_transfer_governance.ts | 60 + .../deploy/agreement/manager/09_end.ts | 4 + .../deploy/agreement/manager/10_status.ts | 4 + .../deploy/allocate/allocator/01_deploy.ts | 59 +- .../deploy/allocate/allocator/02_upgrade.ts | 26 +- .../deploy/allocate/allocator/03_deploy.ts | 30 - .../deploy/allocate/allocator/04_configure.ts | 293 +- .../allocator/05_verify_governance.ts | 189 - .../allocator/06_transfer_governance.ts | 137 +- .../deploy/allocate/allocator/07_activate.ts | 129 - .../allocate/allocator/08_allocation.ts | 70 - .../deploy/allocate/allocator/09_end.ts | 4 + .../deploy/allocate/allocator/10_status.ts | 4 + .../deploy/allocate/default/01_deploy.ts | 39 + .../deploy/allocate/default/02_upgrade.ts | 27 + .../deploy/allocate/default/04_configure.ts | 119 + .../default/05_transfer_governance.ts | 51 + .../deploy/allocate/default/09_end.ts | 4 + .../deploy/allocate/default/10_status.ts | 10 + .../deploy/allocate/direct/01_impl.ts | 98 +- .../deploy/allocate/pilot/01_deploy.ts | 45 - .../deploy/allocate/pilot/02_upgrade.ts | 32 - .../deploy/allocate/pilot/04_configure.ts | 91 - .../deploy/allocate/pilot/09_end.ts | 28 - packages/deployment/deploy/common/00_sync.ts | 134 +- packages/deployment/deploy/gip/0088/09_end.ts | 114 + .../deployment/deploy/gip/0088/10_status.ts | 182 + .../deploy/gip/0088/eligibility_integrate.ts | 74 + .../deploy/gip/0088/issuance_allocate.ts | 193 + .../deploy/gip/0088/issuance_close_guard.ts | 81 + .../deploy/gip/0088/issuance_connect.ts | 247 + .../deploy/gip/0088/upgrade/01_deploy.ts | 47 + .../deploy/gip/0088/upgrade/02_configure.ts | 40 + .../deploy/gip/0088/upgrade/03_transfer.ts | 39 + .../deploy/gip/0088/upgrade/04_upgrade.ts | 453 ++ .../deploy/gip/0088/upgrade/10_status.ts | 334 + .../deploy/horizon/curation/01_deploy.ts | 4 + .../deploy/horizon/curation/02_upgrade.ts | 4 + .../deploy/horizon/curation/09_end.ts | 4 + .../deploy/horizon/curation/10_status.ts | 4 + .../horizon/payments-escrow/01_deploy.ts | 58 + .../horizon/payments-escrow/02_upgrade.ts | 4 + .../deploy/horizon/payments-escrow/09_end.ts | 4 + .../horizon/payments-escrow/10_status.ts | 4 + .../horizon/recurring-collector/01_deploy.ts | 48 + .../horizon/recurring-collector/02_upgrade.ts | 4 + .../recurring-collector/04_configure.ts | 62 + .../05_transfer_governance.ts | 69 + .../horizon/recurring-collector/09_end.ts | 4 + .../horizon/recurring-collector/10_status.ts | 4 + .../deploy/horizon/staking/01_deploy.ts | 15 + .../deploy/horizon/staking/02_upgrade.ts | 4 + .../deploy/horizon/staking/09_end.ts | 4 + .../deploy/horizon/staking/10_status.ts | 4 + .../deploy/rewards/eligibility/01_deploy.ts | 32 - .../deploy/rewards/eligibility/02_upgrade.ts | 25 - .../rewards/eligibility/04_configure.ts | 33 - .../eligibility/05_transfer_governance.ts | 41 - .../rewards/eligibility/06_integrate.ts | 33 - .../deploy/rewards/eligibility/09_complete.ts | 32 - .../deploy/rewards/eligibility/a/01_deploy.ts | 12 + .../rewards/eligibility/a/02_upgrade.ts | 4 + .../rewards/eligibility/a/04_configure.ts | 39 + .../eligibility/a/05_transfer_governance.ts | 45 + .../deploy/rewards/eligibility/a/09_end.ts | 4 + .../deploy/rewards/eligibility/a/10_status.ts | 4 + .../deploy/rewards/eligibility/b/01_deploy.ts | 12 + .../rewards/eligibility/b/02_upgrade.ts | 4 + .../rewards/eligibility/b/04_configure.ts | 39 + .../eligibility/b/05_transfer_governance.ts | 45 + .../deploy/rewards/eligibility/b/09_end.ts | 4 + .../deploy/rewards/eligibility/b/10_status.ts | 4 + .../rewards/eligibility/mock/01_deploy.ts | 12 + .../rewards/eligibility/mock/02_upgrade.ts | 4 + .../mock/05_transfer_governance.ts | 39 + .../rewards/eligibility/mock/06_integrate.ts | 39 + .../deploy/rewards/eligibility/mock/09_end.ts | 4 + .../rewards/eligibility/mock/10_status.ts | 4 + .../deploy/rewards/manager/01_deploy.ts | 23 +- .../deploy/rewards/manager/02_upgrade.ts | 26 +- .../deploy/rewards/manager/09_end.ts | 21 +- .../deploy/rewards/manager/10_status.ts | 4 + .../deploy/rewards/reclaim/01_deploy.ts | 57 +- .../deploy/rewards/reclaim/02_upgrade.ts | 41 +- .../deploy/rewards/reclaim/04_configure.ts | 247 +- .../rewards/reclaim/05_transfer_governance.ts | 56 + .../deploy/rewards/reclaim/09_end.ts | 34 +- .../deploy/rewards/reclaim/10_status.ts | 14 + .../deploy/service/dispute/01_deploy.ts | 12 + .../deploy/service/dispute/02_upgrade.ts | 4 + .../deploy/service/dispute/09_end.ts | 4 + .../deploy/service/dispute/10_status.ts | 4 + .../deploy/service/subgraph/01_deploy.ts | 142 +- .../deploy/service/subgraph/02_upgrade.ts | 26 +- .../deploy/service/subgraph/04_configure.ts | 22 + .../deploy/service/subgraph/09_end.ts | 24 +- .../deploy/service/subgraph/10_status.ts | 4 + packages/deployment/docs/Architecture.md | 37 +- packages/deployment/docs/DeploymentSetup.md | 61 + packages/deployment/docs/Design.md | 154 +- packages/deployment/docs/Gip0088.md | 241 + .../deployment/docs/GovernanceWorkflow.md | 57 +- packages/deployment/docs/LocalForkTesting.md | 65 +- .../docs/SyncBytecodeDetectionFix.md | 149 + .../docs/deploy/ImplementationPrinciples.md | 178 +- .../deploy/IssuanceAllocatorDeployment.md | 188 +- .../RewardsEligibilityOracleDeployment.md | 45 +- packages/deployment/hardhat.config.ts | 142 +- packages/deployment/lib/abis.ts | 150 +- packages/deployment/lib/address-book-utils.ts | 168 +- .../deployment/lib/apply-configuration.ts | 8 +- packages/deployment/lib/artifact-loaders.ts | 96 +- packages/deployment/lib/bytecode-utils.ts | 118 +- packages/deployment/lib/contract-checks.ts | 93 +- packages/deployment/lib/contract-registry.ts | 178 +- packages/deployment/lib/controller-utils.ts | 29 + .../deployment/lib/deploy-implementation.ts | 76 +- packages/deployment/lib/deploy-standalone.ts | 79 + packages/deployment/lib/deployment-config.ts | 138 + packages/deployment/lib/deployment-tags.ts | 200 +- .../deployment/lib/deployment-validation.ts | 10 +- packages/deployment/lib/execute-governance.ts | 66 +- packages/deployment/lib/format.ts | 10 + .../deployment/lib/issuance-deploy-utils.ts | 189 +- packages/deployment/lib/oz-proxy-verify.ts | 39 + packages/deployment/lib/preconditions.ts | 380 ++ packages/deployment/lib/script-factories.ts | 384 ++ packages/deployment/lib/status-detail.ts | 1139 ++++ packages/deployment/lib/sync-utils.ts | 776 ++- packages/deployment/lib/task-utils.ts | 139 + .../deployment/lib/upgrade-implementation.ts | 217 +- packages/deployment/package.json | 6 +- packages/deployment/rocketh/config.ts | 20 +- packages/deployment/rocketh/deploy.ts | 61 +- packages/deployment/scripts/check-bytecode.ts | 54 + .../scripts/check-rocketh-bytecode.ts | 34 + .../deployment/scripts/debug-deploy-state.ts | 27 + packages/deployment/scripts/generate-abis.ts | 264 + packages/deployment/scripts/tag-deployment.sh | 3 +- packages/deployment/tasks/check-deployer.ts | 38 +- .../deployment/tasks/deployment-status.ts | 661 +- packages/deployment/tasks/eth-tasks.ts | 208 + .../deployment/tasks/execute-governance.ts | 60 +- packages/deployment/tasks/grant-role.ts | 86 +- packages/deployment/tasks/grt-tasks.ts | 449 ++ .../tasks/list-pending-implementations.ts | 4 + packages/deployment/tasks/list-roles.ts | 52 +- packages/deployment/tasks/reo-tasks.ts | 597 ++ packages/deployment/tasks/reset-fork.ts | 4 +- packages/deployment/tasks/revoke-role.ts | 86 +- packages/deployment/tasks/ss-tasks.ts | 306 + packages/deployment/tasks/sync.ts | 37 + packages/deployment/tasks/verify-contract.ts | 197 +- .../test/bytecode-comparison.test.ts | 56 +- .../test/chain-id-resolution.test.ts | 158 +- .../test/config-reconciliation.test.ts | 231 + .../test/should-seed-rocketh.test.ts | 126 + packages/deployment/tsconfig.json | 2 +- packages/deployment/types/rocketh.d.ts | 24 + .../ignition/modules/core/HorizonStaking.ts | 16 +- packages/subgraph-service/tasks/deploy.ts | 1 + .../toolshed/src/deployments/address-book.ts | 4 +- pnpm-lock.yaml | 5653 +---------------- 172 files changed, 12186 insertions(+), 8760 deletions(-) create mode 100644 packages/deployment/config/arbitrumOne.json5 create mode 100644 packages/deployment/config/arbitrumSepolia.json5 create mode 100644 packages/deployment/config/localNetwork.json5 create mode 100644 packages/deployment/deploy/agreement/manager/01_deploy.ts create mode 100644 packages/deployment/deploy/agreement/manager/02_upgrade.ts create mode 100644 packages/deployment/deploy/agreement/manager/04_configure.ts create mode 100644 packages/deployment/deploy/agreement/manager/05_transfer_governance.ts create mode 100644 packages/deployment/deploy/agreement/manager/09_end.ts create mode 100644 packages/deployment/deploy/agreement/manager/10_status.ts delete mode 100644 packages/deployment/deploy/allocate/allocator/03_deploy.ts delete mode 100644 packages/deployment/deploy/allocate/allocator/05_verify_governance.ts delete mode 100644 packages/deployment/deploy/allocate/allocator/07_activate.ts delete mode 100644 packages/deployment/deploy/allocate/allocator/08_allocation.ts create mode 100644 packages/deployment/deploy/allocate/allocator/09_end.ts create mode 100644 packages/deployment/deploy/allocate/allocator/10_status.ts create mode 100644 packages/deployment/deploy/allocate/default/01_deploy.ts create mode 100644 packages/deployment/deploy/allocate/default/02_upgrade.ts create mode 100644 packages/deployment/deploy/allocate/default/04_configure.ts create mode 100644 packages/deployment/deploy/allocate/default/05_transfer_governance.ts create mode 100644 packages/deployment/deploy/allocate/default/09_end.ts create mode 100644 packages/deployment/deploy/allocate/default/10_status.ts delete mode 100644 packages/deployment/deploy/allocate/pilot/01_deploy.ts delete mode 100644 packages/deployment/deploy/allocate/pilot/02_upgrade.ts delete mode 100644 packages/deployment/deploy/allocate/pilot/04_configure.ts delete mode 100644 packages/deployment/deploy/allocate/pilot/09_end.ts create mode 100644 packages/deployment/deploy/gip/0088/09_end.ts create mode 100644 packages/deployment/deploy/gip/0088/10_status.ts create mode 100644 packages/deployment/deploy/gip/0088/eligibility_integrate.ts create mode 100644 packages/deployment/deploy/gip/0088/issuance_allocate.ts create mode 100644 packages/deployment/deploy/gip/0088/issuance_close_guard.ts create mode 100644 packages/deployment/deploy/gip/0088/issuance_connect.ts create mode 100644 packages/deployment/deploy/gip/0088/upgrade/01_deploy.ts create mode 100644 packages/deployment/deploy/gip/0088/upgrade/02_configure.ts create mode 100644 packages/deployment/deploy/gip/0088/upgrade/03_transfer.ts create mode 100644 packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts create mode 100644 packages/deployment/deploy/gip/0088/upgrade/10_status.ts create mode 100644 packages/deployment/deploy/horizon/curation/01_deploy.ts create mode 100644 packages/deployment/deploy/horizon/curation/02_upgrade.ts create mode 100644 packages/deployment/deploy/horizon/curation/09_end.ts create mode 100644 packages/deployment/deploy/horizon/curation/10_status.ts create mode 100644 packages/deployment/deploy/horizon/payments-escrow/01_deploy.ts create mode 100644 packages/deployment/deploy/horizon/payments-escrow/02_upgrade.ts create mode 100644 packages/deployment/deploy/horizon/payments-escrow/09_end.ts create mode 100644 packages/deployment/deploy/horizon/payments-escrow/10_status.ts create mode 100644 packages/deployment/deploy/horizon/recurring-collector/01_deploy.ts create mode 100644 packages/deployment/deploy/horizon/recurring-collector/02_upgrade.ts create mode 100644 packages/deployment/deploy/horizon/recurring-collector/04_configure.ts create mode 100644 packages/deployment/deploy/horizon/recurring-collector/05_transfer_governance.ts create mode 100644 packages/deployment/deploy/horizon/recurring-collector/09_end.ts create mode 100644 packages/deployment/deploy/horizon/recurring-collector/10_status.ts create mode 100644 packages/deployment/deploy/horizon/staking/01_deploy.ts create mode 100644 packages/deployment/deploy/horizon/staking/02_upgrade.ts create mode 100644 packages/deployment/deploy/horizon/staking/09_end.ts create mode 100644 packages/deployment/deploy/horizon/staking/10_status.ts delete mode 100644 packages/deployment/deploy/rewards/eligibility/01_deploy.ts delete mode 100644 packages/deployment/deploy/rewards/eligibility/02_upgrade.ts delete mode 100644 packages/deployment/deploy/rewards/eligibility/04_configure.ts delete mode 100644 packages/deployment/deploy/rewards/eligibility/05_transfer_governance.ts delete mode 100644 packages/deployment/deploy/rewards/eligibility/06_integrate.ts delete mode 100644 packages/deployment/deploy/rewards/eligibility/09_complete.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/a/01_deploy.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/a/02_upgrade.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/a/04_configure.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/a/05_transfer_governance.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/a/09_end.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/a/10_status.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/b/01_deploy.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/b/02_upgrade.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/b/04_configure.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/b/05_transfer_governance.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/b/09_end.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/b/10_status.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/mock/01_deploy.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/mock/02_upgrade.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/mock/05_transfer_governance.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/mock/06_integrate.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/mock/09_end.ts create mode 100644 packages/deployment/deploy/rewards/eligibility/mock/10_status.ts create mode 100644 packages/deployment/deploy/rewards/manager/10_status.ts create mode 100644 packages/deployment/deploy/rewards/reclaim/05_transfer_governance.ts create mode 100644 packages/deployment/deploy/rewards/reclaim/10_status.ts create mode 100644 packages/deployment/deploy/service/dispute/01_deploy.ts create mode 100644 packages/deployment/deploy/service/dispute/02_upgrade.ts create mode 100644 packages/deployment/deploy/service/dispute/09_end.ts create mode 100644 packages/deployment/deploy/service/dispute/10_status.ts create mode 100644 packages/deployment/deploy/service/subgraph/04_configure.ts create mode 100644 packages/deployment/deploy/service/subgraph/10_status.ts create mode 100644 packages/deployment/docs/Gip0088.md create mode 100644 packages/deployment/docs/SyncBytecodeDetectionFix.md create mode 100644 packages/deployment/lib/deploy-standalone.ts create mode 100644 packages/deployment/lib/deployment-config.ts create mode 100644 packages/deployment/lib/format.ts create mode 100644 packages/deployment/lib/preconditions.ts create mode 100644 packages/deployment/lib/script-factories.ts create mode 100644 packages/deployment/lib/status-detail.ts create mode 100644 packages/deployment/lib/task-utils.ts create mode 100644 packages/deployment/scripts/check-bytecode.ts create mode 100644 packages/deployment/scripts/check-rocketh-bytecode.ts create mode 100644 packages/deployment/scripts/debug-deploy-state.ts create mode 100644 packages/deployment/scripts/generate-abis.ts create mode 100644 packages/deployment/tasks/eth-tasks.ts create mode 100644 packages/deployment/tasks/grt-tasks.ts create mode 100644 packages/deployment/tasks/reo-tasks.ts create mode 100644 packages/deployment/tasks/ss-tasks.ts create mode 100644 packages/deployment/tasks/sync.ts create mode 100644 packages/deployment/test/config-reconciliation.test.ts create mode 100644 packages/deployment/test/should-seed-rocketh.test.ts create mode 100644 packages/deployment/types/rocketh.d.ts diff --git a/packages/deployment/.gitignore b/packages/deployment/.gitignore index 1c6b1095e..d48c62c73 100644 --- a/packages/deployment/.gitignore +++ b/packages/deployment/.gitignore @@ -1,3 +1,4 @@ deployments/ fork/ txs/ +lib/generated/ diff --git a/packages/deployment/CLAUDE.md b/packages/deployment/CLAUDE.md index 89458a18c..598c3baf4 100644 --- a/packages/deployment/CLAUDE.md +++ b/packages/deployment/CLAUDE.md @@ -10,8 +10,9 @@ Before modifying any deployment scripts in `deploy/`, read: ## Key Rules (from principles) -- **`process.exit(1)` after generating governance TXs** - never return, always exit +- **`saveGovernanceTx` returns** - governance TX generation returns (not exit), downstream scripts check their own preconditions - **Idempotent scripts** - check on-chain state, skip if already done +- **Shared precondition checks** - use `lib/preconditions.ts` for configure/transfer checks, not inline copies - **Package imports** - use `@graphprotocol/deployment/...` not relative paths - **Contract registry** - use `Contracts.X` not string literals - **Standard numbering** - `01_deploy`, `02_upgrade`, ..., `09_end` diff --git a/packages/deployment/README.md b/packages/deployment/README.md index bf0968669..cce3d1c89 100644 --- a/packages/deployment/README.md +++ b/packages/deployment/README.md @@ -7,41 +7,54 @@ Unified deployment package for Graph Protocol contracts. ```bash cd packages/deployment -# Deploy and upgrade specific contracts -npx hardhat deploy --tags rewards-manager --network arbitrumSepolia -npx hardhat deploy --tags subgraph-service --network arbitrumSepolia - -# Deploy issuance contracts (full lifecycle with verification) -npx hardhat deploy --tags issuance-allocation --network arbitrumSepolia - -# Check status +# Read-only status (no --tags = no mutations) npx hardhat deploy:status --network arbitrumSepolia +npx hardhat deploy --tags GIP-0088 --network arbitrumSepolia + +# Component lifecycle (single contract) +npx hardhat deploy --tags IssuanceAllocator,deploy --network arbitrumSepolia +npx hardhat deploy --tags IssuanceAllocator,configure --network arbitrumSepolia +npx hardhat deploy --tags IssuanceAllocator,transfer --network arbitrumSepolia + +# Goal-driven (full GIP-0088 deployment) +npx hardhat deploy --tags GIP-0088:upgrade,deploy --network arbitrumSepolia +npx hardhat deploy --tags GIP-0088:upgrade,configure --network arbitrumSepolia +npx hardhat deploy --tags GIP-0088:upgrade,transfer --network arbitrumSepolia +npx hardhat deploy --tags GIP-0088:upgrade,upgrade --network arbitrumSepolia ``` +See [docs/Gip0088.md](./docs/Gip0088.md) for the full GIP-0088 workflow. + ## Deployment Flow +Each script is idempotent and goal-seeking: it checks on-chain state and either does what's needed or returns. Scripts that need governance authority build a TX batch and either execute it directly (deployer has permission) or save it for the Safe (`saveGovernanceTx` returns — does not exit). + ``` -sync → deploy → upgrade - │ │ │ - │ │ └─► Generate TX, try execute, sync if success - │ └─► Deploy impl if bytecode changed, store pending - └─► Check executed pendings, import from address books +sync → deploy → configure → transfer → upgrade (governance batch) + │ │ │ │ │ + │ │ │ │ └─► Bundle proxy upgrades + deferred config + │ │ │ └─► Revoke deployer role + transfer ProxyAdmin + │ │ └─► Deployer-only role grants and params + │ └─► Deploy impl + proxy if needed; store pendingImplementation + └─► Import on-chain state into address books ``` -**Stops at governance boundary** - if deployer lacks permission, stops with TX file path for Safe upload. - ## Structure ``` packages/deployment/ -├── deploy/ # hardhat-deploy scripts -│ ├── common/ # 00_sync.ts -│ ├── contracts/ # RewardsManager -│ ├── subgraph-service/ # SubgraphService -│ └── issuance/ # Issuance contracts -├── tasks/ # Hardhat tasks (deploy:*) -├── governance/ # Safe TX builders -└── test/ # Integration tests +├── deploy/ # rocketh deploy scripts (numbered per component) +│ ├── common/ # 00_sync.ts +│ ├── horizon/ # RM, HS, PE, L2Curation, RC +│ ├── service/ # SubgraphService, DisputeManager +│ ├── allocate/ # IssuanceAllocator, DefaultAllocation, DirectAllocation +│ ├── agreement/ # RecurringAgreementManager +│ ├── rewards/ # RewardsEligibilityOracle, Reclaim +│ └── gip/0088/ # GIP-0088 goal orchestration +├── lib/ # Shared utilities (preconditions, registry, tags, ABIs) +├── tasks/ # Hardhat tasks (deploy:*) +├── docs/ # Documentation +└── test/ # Unit tests ``` ## Available Tasks @@ -64,7 +77,8 @@ FORK_NETWORK=arbitrumSepolia ARBITRUM_SEPOLIA_RPC= pnpm test ## See Also -- [docs/DeploymentDesignPrinciples.md](./docs/DeploymentDesignPrinciples.md) - Core design principles and patterns +- [docs/deploy/ImplementationPrinciples.md](./docs/deploy/ImplementationPrinciples.md) - Core design principles and patterns - [docs/Architecture.md](./docs/Architecture.md) - Package structure and tags - [docs/GovernanceWorkflow.md](./docs/GovernanceWorkflow.md) - Detailed governance workflow -- [Design.md](./docs/Design.md) - Technical design documentation +- [docs/Design.md](./docs/Design.md) - Technical design documentation +- [docs/LocalForkTesting.md](./docs/LocalForkTesting.md) - Fork-based and local network testing diff --git a/packages/deployment/config/arbitrumOne.json5 b/packages/deployment/config/arbitrumOne.json5 new file mode 100644 index 000000000..2819769c4 --- /dev/null +++ b/packages/deployment/config/arbitrumOne.json5 @@ -0,0 +1,12 @@ +{ + // Deployment configuration for Arbitrum One (mainnet) + // Values here are committed for reference and reproducibility. + + "IssuanceAllocator": { + // RAM allocation: how much issuance flows to RecurringAgreementManager + // ramAllocatorMintingGrtPerBlock: GRT per block minted by IA and sent to RAM + // ramSelfMintingGrtPerBlock: 0 (RAM does not self-mint) + "ramAllocatorMintingGrtPerBlock": "6", + "ramSelfMintingGrtPerBlock": "0" + } +} diff --git a/packages/deployment/config/arbitrumSepolia.json5 b/packages/deployment/config/arbitrumSepolia.json5 new file mode 100644 index 000000000..5b3350e94 --- /dev/null +++ b/packages/deployment/config/arbitrumSepolia.json5 @@ -0,0 +1,12 @@ +{ + // Deployment configuration for Arbitrum Sepolia (testnet) + // Values here are committed for reference and reproducibility. + + "IssuanceAllocator": { + // RAM allocation: how much issuance flows to RecurringAgreementManager + // ramAllocatorMintingGrtPerBlock: GRT per block minted by IA and sent to RAM + // ramSelfMintingGrtPerBlock: GRT per block (0 = RAM does not self-mint) + "ramAllocatorMintingGrtPerBlock": "0.5", + "ramSelfMintingGrtPerBlock": "0" + } +} diff --git a/packages/deployment/config/localNetwork.json5 b/packages/deployment/config/localNetwork.json5 new file mode 100644 index 000000000..c9dcd90db --- /dev/null +++ b/packages/deployment/config/localNetwork.json5 @@ -0,0 +1,11 @@ +{ + // Deployment configuration for local-network (docker-compose dev stack) + // Local network uses generous rates for fast iteration and testing. + + "IssuanceAllocator": { + // RAM allocation: how much issuance flows to RecurringAgreementManager + // Local network uses a high rate so agreements accumulate meaningful rewards quickly + "ramAllocatorMintingGrtPerBlock": "6", + "ramSelfMintingGrtPerBlock": "0" + } +} diff --git a/packages/deployment/deploy/agreement/manager/01_deploy.ts b/packages/deployment/deploy/agreement/manager/01_deploy.ts new file mode 100644 index 000000000..dabd71cfb --- /dev/null +++ b/packages/deployment/deploy/agreement/manager/01_deploy.ts @@ -0,0 +1,16 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { requireDeployer, requireGraphToken } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createProxyDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createProxyDeployModule( + Contracts.issuance.RecurringAgreementManager, + (env) => { + const paymentsEscrow = env.getOrNull('PaymentsEscrow') + if (!paymentsEscrow) throw new Error('Missing PaymentsEscrow deployment after sync.') + return { + constructorArgs: [requireGraphToken(env).address, paymentsEscrow.address], + initializeArgs: [requireDeployer(env)], + } + }, + { prerequisites: [Contracts.horizon.L2GraphToken, Contracts.horizon.PaymentsEscrow] }, +) diff --git a/packages/deployment/deploy/agreement/manager/02_upgrade.ts b/packages/deployment/deploy/agreement/manager/02_upgrade.ts new file mode 100644 index 000000000..70b140182 --- /dev/null +++ b/packages/deployment/deploy/agreement/manager/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.issuance.RecurringAgreementManager) diff --git a/packages/deployment/deploy/agreement/manager/04_configure.ts b/packages/deployment/deploy/agreement/manager/04_configure.ts new file mode 100644 index 000000000..0d0d7b1a2 --- /dev/null +++ b/packages/deployment/deploy/agreement/manager/04_configure.ts @@ -0,0 +1,225 @@ +import { ACCESS_CONTROL_ENUMERABLE_ABI, ISSUANCE_TARGET_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { supportsInterface } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { getGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' +import { ComponentTags, DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContract, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { checkRAMConfigured } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph, tx } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' +import { encodeFunctionData, keccak256, toHex } from 'viem' + +/** + * Configure RecurringAgreementManager + * + * Grants: + * - COLLECTOR_ROLE to RecurringCollector + * - DATA_SERVICE_ROLE to SubgraphService + * - GOVERNOR_ROLE to protocol governor + * - PAUSE_ROLE to pause guardian + * + * Sets: + * - IssuanceAllocator as RAM's issuance source + * + * Idempotent: checks on-chain state, skips if already configured. + * + * Usage: + * pnpm hardhat deploy --tags RecurringAgreementManager:configure --network + */ +export default createActionModule( + Contracts.issuance.RecurringAgreementManager, + DeploymentActions.CONFIGURE, + async (env) => { + const client = graph.getPublicClient(env) as PublicClient + const governor = await getGovernor(env) + const pauseGuardian = await getPauseGuardian(env) + + const ram = requireContract(env, Contracts.issuance.RecurringAgreementManager) + const rc = requireContract(env, Contracts.horizon.RecurringCollector) + const ss = requireContract(env, Contracts['subgraph-service'].SubgraphService) + const ia = requireContract(env, Contracts.issuance.IssuanceAllocator) + + env.showMessage(`\n========== Configure ${Contracts.issuance.RecurringAgreementManager.name} ==========`) + env.showMessage(`RAM: ${ram.address}`) + env.showMessage(`RC: ${rc.address}`) + env.showMessage(`SS: ${ss.address}`) + env.showMessage(`IA: ${ia.address}`) + + // Check if already configured (shared precondition check) + const precondition = await checkRAMConfigured( + client, + ram.address, + rc.address, + ss.address, + ia.address, + governor, + pauseGuardian, + ) + if (precondition.done) { + env.showMessage(`\n✅ ${Contracts.issuance.RecurringAgreementManager.name} already configured\n`) + return + } + + // Role constants + const COLLECTOR_ROLE = keccak256(toHex('COLLECTOR_ROLE')) + const DATA_SERVICE_ROLE = keccak256(toHex('DATA_SERVICE_ROLE')) + const GOVERNOR_ROLE = keccak256(toHex('GOVERNOR_ROLE')) + const PAUSE_ROLE = keccak256(toHex('PAUSE_ROLE')) + + // Check what still needs configuring + env.showMessage('\n📋 Checking current configuration...\n') + + const rcHasCollectorRole = (await client.readContract({ + address: ram.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [COLLECTOR_ROLE, rc.address as `0x${string}`], + })) as boolean + env.showMessage(` RC COLLECTOR_ROLE: ${rcHasCollectorRole ? '✓' : '✗'}`) + + const ssHasDataServiceRole = (await client.readContract({ + address: ram.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [DATA_SERVICE_ROLE, ss.address as `0x${string}`], + })) as boolean + env.showMessage(` SS DATA_SERVICE_ROLE: ${ssHasDataServiceRole ? '✓' : '✗'}`) + + // Check role grants + const governorHasRole = (await client.readContract({ + address: ram.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [GOVERNOR_ROLE, governor as `0x${string}`], + })) as boolean + env.showMessage(` Governor GOVERNOR_ROLE: ${governorHasRole ? '✓' : '✗'}`) + + const pauseGuardianHasRole = (await client.readContract({ + address: ram.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [PAUSE_ROLE, pauseGuardian as `0x${string}`], + })) as boolean + env.showMessage(` PauseGuardian PAUSE_ROLE: ${pauseGuardianHasRole ? '✓' : '✗'}`) + + // Determine executor: deployer (fresh) or governor (prod) + const deployer = requireDeployer(env) + const deployerIsGovernor = (await client.readContract({ + address: ram.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [GOVERNOR_ROLE, deployer as `0x${string}`], + })) as boolean + + if (!deployerIsGovernor) { + env.showMessage(`\n ○ Deployer does not have GOVERNOR_ROLE — skipping (governance TX in upgrade step)\n`) + return + } + + // Build TX list for missing configuration + const txs: Array<{ to: string; data: `0x${string}`; label: string }> = [] + + if (!rcHasCollectorRole) { + txs.push({ + to: ram.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [COLLECTOR_ROLE, rc.address as `0x${string}`], + }), + label: `grantRole(COLLECTOR_ROLE, ${rc.address})`, + }) + } + + if (!ssHasDataServiceRole) { + txs.push({ + to: ram.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [DATA_SERVICE_ROLE, ss.address as `0x${string}`], + }), + label: `grantRole(DATA_SERVICE_ROLE, ${ss.address})`, + }) + } + + if (!governorHasRole) { + txs.push({ + to: ram.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [GOVERNOR_ROLE, governor as `0x${string}`], + }), + label: `grantRole(GOVERNOR_ROLE, ${governor})`, + }) + } + + if (!pauseGuardianHasRole) { + txs.push({ + to: ram.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [PAUSE_ROLE, pauseGuardian as `0x${string}`], + }), + label: `grantRole(PAUSE_ROLE, ${pauseGuardian})`, + }) + } + + // Check issuance allocator — skip if IA doesn't support the interface yet (pending upgrade) + let iaConfigured = false + try { + const currentIA = (await client.readContract({ + address: ram.address as `0x${string}`, + abi: ISSUANCE_TARGET_ABI, + functionName: 'getIssuanceAllocator', + })) as string + iaConfigured = currentIA.toLowerCase() === ia.address.toLowerCase() + env.showMessage(` IssuanceAllocator: ${iaConfigured ? '✓' : '✗'} (current: ${currentIA})`) + } catch { + env.showMessage(` IssuanceAllocator: ✗ (getter not available)`) + } + + if (!iaConfigured) { + const IISSUANCE_ALLOCATION_DISTRIBUTION_ID = '0x79da37fc' // type(IIssuanceAllocationDistribution).interfaceId + const iaSupported = await supportsInterface(client, ia.address, IISSUANCE_ALLOCATION_DISTRIBUTION_ID) + if (iaSupported) { + txs.push({ + to: ram.address, + data: encodeFunctionData({ + abi: ISSUANCE_TARGET_ABI, + functionName: 'setIssuanceAllocator', + args: [ia.address as `0x${string}`], + }), + label: `setIssuanceAllocator(${ia.address})`, + }) + } else { + env.showMessage(` ○ IA does not yet support IIssuanceAllocationDistribution — skipping setIssuanceAllocator`) + } + } + + if (txs.length === 0) return + + env.showMessage('\n🔨 Executing configuration as deployer...\n') + const txFn = tx(env) + for (const t of txs) { + await txFn({ account: deployer, to: t.to as `0x${string}`, data: t.data }) + env.showMessage(` ✓ ${t.label}`) + } + env.showMessage(`\n✅ ${Contracts.issuance.RecurringAgreementManager.name} configuration complete!\n`) + }, + { + extraDependencies: [ + ComponentTags.RECURRING_COLLECTOR, + ComponentTags.SUBGRAPH_SERVICE, + ComponentTags.ISSUANCE_ALLOCATOR, + ], + prerequisites: [ + Contracts.horizon.RecurringCollector, + Contracts['subgraph-service'].SubgraphService, + Contracts.issuance.IssuanceAllocator, + ], + }, +) diff --git a/packages/deployment/deploy/agreement/manager/05_transfer_governance.ts b/packages/deployment/deploy/agreement/manager/05_transfer_governance.ts new file mode 100644 index 000000000..50d3f7582 --- /dev/null +++ b/packages/deployment/deploy/agreement/manager/05_transfer_governance.ts @@ -0,0 +1,60 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + requireContract, + requireDeployer, + transferProxyAdminOwnership, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { checkDeployerRevoked } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { execute, graph, read } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Transfer RecurringAgreementManager governance from deployer + * + * - Revoke GOVERNOR_ROLE from deployment account + * - Transfer ProxyAdmin ownership to governor + * + * Role grants (GOVERNOR_ROLE, PAUSE_ROLE, COLLECTOR_ROLE, DATA_SERVICE_ROLE) + * happen in 04_configure.ts. This script only revokes deployer access. + * + * Idempotent: checks on-chain state, skips if already transferred. + * + * Usage: + * pnpm hardhat deploy --tags RecurringAgreementManager,transfer --network + */ +export default createActionModule( + Contracts.issuance.RecurringAgreementManager, + DeploymentActions.TRANSFER, + async (env) => { + const readFn = read(env) + const executeFn = execute(env) + const client = graph.getPublicClient(env) as PublicClient + const deployer = requireDeployer(env) + const ram = requireContract(env, Contracts.issuance.RecurringAgreementManager) + + env.showMessage(`\n========== Transfer ${Contracts.issuance.RecurringAgreementManager.name} ==========`) + + // Check if deployer GOVERNOR_ROLE already revoked (shared precondition check) + const precondition = await checkDeployerRevoked(client, ram.address, deployer) + if (precondition.done) { + env.showMessage(`✓ Deployer GOVERNOR_ROLE already revoked`) + } else { + const GOVERNOR_ROLE = (await readFn(ram, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` + + env.showMessage(`🔨 Revoking deployer GOVERNOR_ROLE...`) + await executeFn(ram, { + account: deployer, + functionName: 'revokeRole', + args: [GOVERNOR_ROLE, deployer], + }) + env.showMessage(` ✓ revokeRole(GOVERNOR_ROLE) executed`) + } + + // Transfer ProxyAdmin ownership to governor + await transferProxyAdminOwnership(env, Contracts.issuance.RecurringAgreementManager) + + env.showMessage(`\n✅ ${Contracts.issuance.RecurringAgreementManager.name} governance transferred!\n`) + }, +) diff --git a/packages/deployment/deploy/agreement/manager/09_end.ts b/packages/deployment/deploy/agreement/manager/09_end.ts new file mode 100644 index 000000000..c68c1db6a --- /dev/null +++ b/packages/deployment/deploy/agreement/manager/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.issuance.RecurringAgreementManager) diff --git a/packages/deployment/deploy/agreement/manager/10_status.ts b/packages/deployment/deploy/agreement/manager/10_status.ts new file mode 100644 index 000000000..d7e3f98bc --- /dev/null +++ b/packages/deployment/deploy/agreement/manager/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.issuance.RecurringAgreementManager) diff --git a/packages/deployment/deploy/allocate/allocator/01_deploy.ts b/packages/deployment/deploy/allocate/allocator/01_deploy.ts index 0db712c63..58bd3ca30 100644 --- a/packages/deployment/deploy/allocate/allocator/01_deploy.ts +++ b/packages/deployment/deploy/allocate/allocator/01_deploy.ts @@ -1,49 +1,12 @@ import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { SpecialTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { deployProxyContract, requireContract } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * Deploy IssuanceAllocator - Token allocation contract with transparent proxy - * - * This deploys IssuanceAllocator as an upgradeable contract using OpenZeppelin v5's - * TransparentUpgradeableProxy pattern. The contract is initialized atomically - * during proxy deployment to prevent front-running attacks. - * - * Architecture: - * - Implementation: IssuanceAllocator contract with GRT token constructor arg - * - Proxy: OZ v5 TransparentUpgradeableProxy with atomic initialization - * - Admin: Per-proxy ProxyAdmin (created by OZ v5 proxy, owned by governor) - * - * Initial Setup (IssuanceAllocator.md Step 1): - * - Governor receives initial GOVERNOR_ROLE for configuration - * - Per-proxy ProxyAdmin owned by governor (controls upgrades) - * - Default target set to address(0) (no minting until configured) - * - Governance transfer happens in separate script - * - * Deployment strategy: - * - First run: Deploy implementation + proxy (creates per-proxy ProxyAdmin) - * - Subsequent runs: - * - If implementation unchanged: No-op (reuse existing) - * - If implementation changed: Deploy new implementation, store as pending - * - Upgrades must be done via governance - * - * Usage: - * pnpm hardhat deploy --tags issuance-allocator-deploy --network - */ - -const func: DeployScriptModule = async (env) => { - const graphToken = requireContract(env, Contracts.horizon.L2GraphToken).address - - env.showMessage(`\n📦 Deploying ${Contracts.issuance.IssuanceAllocator.name} with GraphToken: ${graphToken}`) - - await deployProxyContract(env, { - contract: Contracts.issuance.IssuanceAllocator, - constructorArgs: [graphToken], - }) -} - -func.tags = Tags.issuanceAllocatorDeploy -func.dependencies = [SpecialTags.SYNC] - -export default func +import { requireContract, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createProxyDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createProxyDeployModule( + Contracts.issuance.IssuanceAllocator, + (env) => ({ + constructorArgs: [requireContract(env, Contracts.horizon.L2GraphToken).address], + initializeArgs: [requireDeployer(env)], + }), + { prerequisites: [Contracts.horizon.L2GraphToken] }, +) diff --git a/packages/deployment/deploy/allocate/allocator/02_upgrade.ts b/packages/deployment/deploy/allocate/allocator/02_upgrade.ts index 66cab6a8d..8f012a025 100644 --- a/packages/deployment/deploy/allocate/allocator/02_upgrade.ts +++ b/packages/deployment/deploy/allocate/allocator/02_upgrade.ts @@ -1,26 +1,4 @@ import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { upgradeImplementation } from '@graphprotocol/deployment/lib/upgrade-implementation.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' -// IssuanceAllocator Upgrade -// -// Generates governance TX batch and executes upgrade via per-proxy ProxyAdmin. -// -// Workflow: -// 1. Check for pending implementation in address book -// 2. Generate governance TX (upgradeAndCall to per-proxy ProxyAdmin) -// 3. Fork mode: execute via governor impersonation -// 4. Production: output TX file for Safe execution -// -// Usage: -// FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags issuance-allocator-upgrade --network localhost - -const func: DeployScriptModule = async (env) => { - await upgradeImplementation(env, Contracts.issuance.IssuanceAllocator) -} - -func.tags = Tags.issuanceAllocatorUpgrade -func.dependencies = [actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.DEPLOY)] - -export default func +export default createUpgradeModule(Contracts.issuance.IssuanceAllocator) diff --git a/packages/deployment/deploy/allocate/allocator/03_deploy.ts b/packages/deployment/deploy/allocate/allocator/03_deploy.ts deleted file mode 100644 index a3a1c6cb9..000000000 --- a/packages/deployment/deploy/allocate/allocator/03_deploy.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireUpgradeExecuted } from '@graphprotocol/deployment/lib/execute-governance.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * IssuanceAllocator end state - deployed, upgraded, configured, and governance transferred - * - * Full lifecycle (steps 1-6 from IssuanceAllocator.md): - * 1. Deploy and initialize with deployer as GOVERNOR_ROLE - * 2-3. Configure issuance rate and RewardsManager allocation - * 4-5. (Optional upgrade steps) - * 6. Transfer governance to protocol governance multisig - * - * Usage: - * pnpm hardhat deploy --tags issuance-allocator --network - */ -const func: DeployScriptModule = async (env) => { - requireUpgradeExecuted(env, 'IssuanceAllocator') - env.showMessage(`\n✓ IssuanceAllocator ready (governance transferred)`) -} - -func.tags = Tags.issuanceAllocator -func.dependencies = [ - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.DEPLOY), - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.UPGRADE), - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.CONFIGURE), - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.TRANSFER), -] - -export default func diff --git a/packages/deployment/deploy/allocate/allocator/04_configure.ts b/packages/deployment/deploy/allocate/allocator/04_configure.ts index 32076684f..d46243e74 100644 --- a/packages/deployment/deploy/allocate/allocator/04_configure.ts +++ b/packages/deployment/deploy/allocate/allocator/04_configure.ts @@ -1,157 +1,168 @@ -import { REWARDS_MANAGER_DEPRECATED_ABI, SET_TARGET_ALLOCATION_ABI } from '@graphprotocol/deployment/lib/abis.js' -import { requireRewardsManagerUpgraded } from '@graphprotocol/deployment/lib/contract-checks.js' +import { ACCESS_CONTROL_ENUMERABLE_ABI, REWARDS_MANAGER_DEPRECATED_ABI } from '@graphprotocol/deployment/lib/abis.js' import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { getGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' +import { ComponentTags, DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { execute, graph, read, tx } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { checkIAConfigured } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph, read, tx } from '@graphprotocol/deployment/rocketh/deploy.js' import type { PublicClient } from 'viem' import { encodeFunctionData } from 'viem' /** - * Configure ${Contracts.issuance.IssuanceAllocator.name} initial state (deployer account) + * Configure IssuanceAllocator * - * Configuration steps (IssuanceAllocator.md steps 2-3): - * 2. Set issuance rate to match RewardsManager - * 3. Configure RM as 100% self-minting target + * - Sets issuance rate to match RewardsManager + * - Configures RM as 100% self-minting target + * - Grants GOVERNOR_ROLE to protocol governor + * - Grants PAUSE_ROLE to pause guardian + * + * If deployer has GOVERNOR_ROLE (fresh deploy), executes directly. + * If governance transferred, generates governance TX or executes via governor. * - * Requires deployer to have GOVERNOR_ROLE (granted during initialization in step 1). - * PAUSE_ROLE will be granted in step 6 (transfer governance script). * Idempotent: checks on-chain state, skips if already configured. * * Usage: - * pnpm hardhat deploy --tags issuance-allocator-configure --network + * pnpm hardhat deploy --tags IssuanceAllocator,configure --network */ -const func: DeployScriptModule = async (env) => { - const readFn = read(env) - const executeFn = execute(env) - - const deployer = requireDeployer(env) - - const [issuanceAllocator, rewardsManager] = requireContracts(env, [ - Contracts.issuance.IssuanceAllocator, - Contracts.horizon.RewardsManager, - ]) - - // Create viem client for direct contract calls - const client = graph.getPublicClient(env) - - // Check if RewardsManager supports IIssuanceTarget (has been upgraded) - // Throws error if not upgraded - await requireRewardsManagerUpgraded(client as PublicClient, rewardsManager.address, env) - - env.showMessage(`\n========== Configure ${Contracts.issuance.IssuanceAllocator.name} ==========`) - env.showMessage(`${Contracts.issuance.IssuanceAllocator.name}: ${issuanceAllocator.address}`) - env.showMessage(`${Contracts.horizon.RewardsManager.name}: ${rewardsManager.address}`) - env.showMessage(`Deployer: ${deployer}\n`) - - // Get role constants - const GOVERNOR_ROLE = (await readFn(issuanceAllocator, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` - - // Check current state - env.showMessage('📋 Checking current configuration...\n') - - const checks = { - issuanceRate: false, - rmAllocation: false, - } - - // Check issuance rate - // Note: Use viem directly for RM because synced deployment has empty ABI - const rmIssuanceRate = (await client.readContract({ - address: rewardsManager.address as `0x${string}`, - abi: REWARDS_MANAGER_DEPRECATED_ABI, - functionName: 'issuancePerBlock', - })) as bigint - const iaIssuanceRate = (await readFn(issuanceAllocator, { functionName: 'getIssuancePerBlock' })) as bigint - checks.issuanceRate = iaIssuanceRate === rmIssuanceRate && iaIssuanceRate > 0n - env.showMessage(` Issuance rate: ${checks.issuanceRate ? '✓' : '✗'} (IA: ${iaIssuanceRate}, RM: ${rmIssuanceRate})`) - - // Check RM allocation (should be 100% self-minting) - try { - const rmAllocation = (await readFn(issuanceAllocator, { - functionName: 'getTargetAllocation', - args: [rewardsManager.address], - })) as { totalAllocationRate: bigint; allocatorMintingRate: bigint; selfMintingRate: bigint } - const expectedSelfMinting = iaIssuanceRate > 0n ? iaIssuanceRate : rmIssuanceRate - checks.rmAllocation = - rmAllocation.allocatorMintingRate === 0n && rmAllocation.selfMintingRate === expectedSelfMinting - env.showMessage( - ` RM allocation: ${checks.rmAllocation ? '✓' : '✗'} (allocator: ${rmAllocation.allocatorMintingRate}, self: ${rmAllocation.selfMintingRate})`, +export default createActionModule( + Contracts.issuance.IssuanceAllocator, + DeploymentActions.CONFIGURE, + async (env) => { + const readFn = read(env) + const deployer = requireDeployer(env) + const governor = await getGovernor(env) + const pauseGuardian = await getPauseGuardian(env) + + const [issuanceAllocator, rewardsManager] = requireContracts(env, [ + Contracts.issuance.IssuanceAllocator, + Contracts.horizon.RewardsManager, + ]) + + const client = graph.getPublicClient(env) as PublicClient + + env.showMessage(`\n========== Configure ${Contracts.issuance.IssuanceAllocator.name} ==========`) + env.showMessage(`${Contracts.issuance.IssuanceAllocator.name}: ${issuanceAllocator.address}`) + env.showMessage(`${Contracts.horizon.RewardsManager.name}: ${rewardsManager.address}`) + + // Check if already configured (shared precondition check) + const precondition = await checkIAConfigured( + client, + issuanceAllocator.address, + rewardsManager.address, + governor, + pauseGuardian, ) - } catch (error) { - env.showMessage(` RM allocation: ✗ (error reading: ${error})`) - } - - // Check deployer role (informational - determines who can execute missing config) - const deployerHasGovernorRole = (await readFn(issuanceAllocator, { - functionName: 'hasRole', - args: [GOVERNOR_ROLE, deployer], - })) as boolean - env.showMessage(` Deployer GOVERNOR_ROLE: ${deployerHasGovernorRole ? '✓' : '✗'} (${deployer})`) - - // Note: PAUSE_ROLE will be granted in step 6 (transfer governance) - - // Configuration complete? - const configurationComplete = Object.values(checks).every(Boolean) - if (configurationComplete) { - env.showMessage(`\n✅ ${Contracts.issuance.IssuanceAllocator.name} already configured\n`) - return - } - - // Check if deployer has permission to execute missing configuration - // If governance has been transferred, configuration must be done via governance TX - if (!deployerHasGovernorRole) { - env.showMessage('\n❌ Configuration incomplete but deployer does not have GOVERNOR_ROLE') - env.showMessage(' Governance has been transferred - this configuration must be done via governance TX') - env.showMessage(` Missing configuration:`) - if (!checks.issuanceRate) { - env.showMessage(` - Issuance rate (currently: ${iaIssuanceRate})`) + if (precondition.done) { + env.showMessage(`\n✅ ${Contracts.issuance.IssuanceAllocator.name} already configured\n`) + return + } + + // Get RM issuance rate (target for IA) + const rmIssuanceRate = (await client.readContract({ + address: rewardsManager.address as `0x${string}`, + abi: REWARDS_MANAGER_DEPRECATED_ABI, + functionName: 'issuancePerBlock', + })) as bigint + + if (rmIssuanceRate === 0n) { + env.showMessage(`\n ○ RM.issuancePerBlock is 0 — skipping IA configure\n`) + return + } + + // Determine what still needs configuring + env.showMessage('\n📋 Checking current configuration...\n') + + const iaIssuanceRate = (await readFn(issuanceAllocator, { functionName: 'getIssuancePerBlock' })) as bigint + const rateOk = iaIssuanceRate === rmIssuanceRate && iaIssuanceRate > 0n + env.showMessage(` Issuance rate: ${rateOk ? '✓' : '✗'} (IA: ${iaIssuanceRate}, RM: ${rmIssuanceRate})`) + + // Check role grants + const GOVERNOR_ROLE = (await readFn(issuanceAllocator, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` + const PAUSE_ROLE = (await readFn(issuanceAllocator, { functionName: 'PAUSE_ROLE' })) as `0x${string}` + + const governorHasRole = (await readFn(issuanceAllocator, { + functionName: 'hasRole', + args: [GOVERNOR_ROLE, governor], + })) as boolean + env.showMessage(` Governor GOVERNOR_ROLE: ${governorHasRole ? '✓' : '✗'}`) + + const pauseGuardianHasRole = (await readFn(issuanceAllocator, { + functionName: 'hasRole', + args: [PAUSE_ROLE, pauseGuardian], + })) as boolean + env.showMessage(` PauseGuardian PAUSE_ROLE: ${pauseGuardianHasRole ? '✓' : '✗'}`) + + // Determine executor: deployer if has GOVERNOR_ROLE, else protocol governor + const deployerHasRole = (await readFn(issuanceAllocator, { + functionName: 'hasRole', + args: [GOVERNOR_ROLE, deployer], + })) as boolean + + // Build TX data for missing configuration + const txs: Array<{ to: string; data: `0x${string}`; label: string }> = [] + + if (!rateOk) { + txs.push({ + to: issuanceAllocator.address, + data: encodeFunctionData({ + abi: [ + { + inputs: [{ type: 'uint256' }], + name: 'setIssuancePerBlock', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + ], + functionName: 'setIssuancePerBlock', + args: [rmIssuanceRate], + }), + label: `setIssuancePerBlock(${rmIssuanceRate})`, + }) + } + + if (!governorHasRole) { + txs.push({ + to: issuanceAllocator.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [GOVERNOR_ROLE, governor as `0x${string}`], + }), + label: `grantRole(GOVERNOR_ROLE, ${governor})`, + }) + } + + if (!pauseGuardianHasRole) { + txs.push({ + to: issuanceAllocator.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [PAUSE_ROLE, pauseGuardian as `0x${string}`], + }), + label: `grantRole(PAUSE_ROLE, ${pauseGuardian})`, + }) } - if (!checks.rmAllocation) { - env.showMessage(` - RM allocation (not configured)`) + + if (!deployerHasRole) { + env.showMessage(`\n ○ Deployer does not have GOVERNOR_ROLE — skipping (governance TX in upgrade step)\n`) + return } - env.showMessage(`\n This should not happen in normal deployment flow.`) - env.showMessage(` Configuration (step 5) should complete before governance transfer (step 6).\n`) - process.exit(1) - } - - // Execute configuration as deployer - env.showMessage('\n🔨 Executing configuration...\n') - - // Step 2: Set issuance rate - if (!checks.issuanceRate) { - env.showMessage(` Setting issuance rate to ${rmIssuanceRate}...`) - await executeFn(issuanceAllocator, { - account: deployer, - functionName: 'setIssuancePerBlock', - args: [rmIssuanceRate], - }) - env.showMessage(' ✓ setIssuancePerBlock executed') - } - - // Step 3: Configure RM allocation (3-arg version: target, allocatorMintingRate, selfMintingRate) - // Note: Use tx() with encoded data to select the 3-arg overload (rocketh picks wrong one) - if (!checks.rmAllocation) { + + if (txs.length === 0) return + + env.showMessage('\n🔨 Executing configuration as deployer...\n') const txFn = tx(env) - const rate = iaIssuanceRate > 0n ? iaIssuanceRate : rmIssuanceRate - env.showMessage(` Setting RM allocation (0, ${rate})...`) - const data = encodeFunctionData({ - abi: SET_TARGET_ALLOCATION_ABI, - functionName: 'setTargetAllocation', - args: [rewardsManager.address as `0x${string}`, 0n, rate], - }) - await txFn({ account: deployer, to: issuanceAllocator.address, data }) - env.showMessage(' ✓ setTargetAllocation executed') - } - - env.showMessage(`\n✅ ${Contracts.issuance.IssuanceAllocator.name} configuration complete!\n`) -} - -func.tags = Tags.issuanceAllocatorConfigure -func.dependencies = [ - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.DEPLOY), - ComponentTags.REWARDS_MANAGER_UPGRADE, -] - -export default func + for (const t of txs) { + await txFn({ account: deployer, to: t.to as `0x${string}`, data: t.data }) + env.showMessage(` ✓ ${t.label}`) + } + env.showMessage(`\n✅ ${Contracts.issuance.IssuanceAllocator.name} configuration complete!\n`) + }, + { + extraDependencies: [ComponentTags.REWARDS_MANAGER], + prerequisites: [Contracts.horizon.RewardsManager], + }, +) diff --git a/packages/deployment/deploy/allocate/allocator/05_verify_governance.ts b/packages/deployment/deploy/allocate/allocator/05_verify_governance.ts deleted file mode 100644 index 3674ffdd7..000000000 --- a/packages/deployment/deploy/allocate/allocator/05_verify_governance.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { getGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { getProxyAdminAddress, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { graph, read } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * Verify governance and configuration for all issuance contracts - * - * This implements Step 7 from IssuanceAllocator.md: - * - Bytecode verification (deployment bytecode matches expected contract) - * - Access control: - * - Governor has GOVERNOR_ROLE on all contracts - * - Deployment account does NOT have GOVERNOR_ROLE - * - Pause guardian has PAUSE_ROLE on pausable contracts - * - Off-chain: Review all RoleGranted events since deployment - * - Pause state: Verify contract is not paused - * - Issuance rate: Verify matches RewardsManager rate exactly - * - Target configuration: Verify only expected targets exist - * - Proxy configuration: Verify ProxyAdmin controls proxy and is owned by governance - * - * The issuance contracts use role-based access control (OpenZeppelin AccessControl) - * rather than ownership patterns. - * - * This script is idempotent and runs after governance transfer (step 6) to ensure - * proper access control configuration before activation (steps 8-10). - * - * Usage: - * pnpm hardhat deploy --tags verify-governance --network - * - * Or as part of full deployment: - * pnpm hardhat deploy --tags issuance-allocation --network - */ -const func: DeployScriptModule = async (env) => { - const readFn = read(env) - - const deployer = requireDeployer(env) - - // Get protocol governor and pause guardian from Controller - const governor = await getGovernor(env) - const pauseGuardian = await getPauseGuardian(env) - - const contracts = [ - Contracts.issuance.IssuanceAllocator.name, - Contracts.issuance.PilotAllocation.name, - Contracts.issuance.RewardsEligibilityOracle.name, - ] - - env.showMessage('\n========== Governance and Configuration Verification ==========\n') - - // 1. Verify GOVERNOR_ROLE (governor has, deployer does not) - env.showMessage('1. Verifying GOVERNOR_ROLE assignment...') - for (const contractName of contracts) { - const deployment = env.getOrNull(contractName) - if (!deployment) { - env.showMessage(` Skipping ${contractName} - not deployed`) - continue - } - - try { - const governorRole = (await readFn(deployment, { functionName: 'GOVERNOR_ROLE' })) as string - - // Check governor has role - const governorHasRole = (await readFn(deployment, { - functionName: 'hasRole', - args: [governorRole, governor], - })) as boolean - - // Check deployer does NOT have role - const deployerHasRole = (await readFn(deployment, { - functionName: 'hasRole', - args: [governorRole, deployer], - })) as boolean - - if (governorHasRole && !deployerHasRole) { - env.showMessage(` ✓ ${contractName}: Governor has GOVERNOR_ROLE, deployer revoked`) - } else if (governorHasRole && deployerHasRole) { - env.showMessage(` ⚠ ${contractName}: Governor has GOVERNOR_ROLE but deployer NOT revoked`) - } else if (!governorHasRole && deployerHasRole) { - env.showMessage(` ⚠ ${contractName}: Deployer has GOVERNOR_ROLE but governance NOT transferred`) - } else { - env.showMessage(` ✗ ${contractName}: WARNING - Neither governor nor deployer has GOVERNOR_ROLE`) - } - } catch (error) { - env.showMessage(` ✗ ${contractName}: Error verifying governance: ${error}`) - } - } - - // 2. Verify PAUSE_ROLE - env.showMessage('\n2. Verifying PAUSE_ROLE assignment...') - const pausableContracts = [ - Contracts.issuance.IssuanceAllocator.name, - Contracts.issuance.PilotAllocation.name, - Contracts.issuance.RewardsEligibilityOracle.name, - ] - for (const contractName of pausableContracts) { - const deployment = env.getOrNull(contractName) - if (!deployment) continue - - try { - const pauseRole = (await readFn(deployment, { functionName: 'PAUSE_ROLE' })) as string - const hasPauseRole = (await readFn(deployment, { - functionName: 'hasRole', - args: [pauseRole, pauseGuardian], - })) as boolean - - if (hasPauseRole) { - env.showMessage(` ✓ ${contractName}: Pause guardian has PAUSE_ROLE`) - } else { - env.showMessage( - ` ⚠ ${contractName}: Pause guardian does NOT have PAUSE_ROLE (will be granted in 06_transfer_governance)`, - ) - } - } catch (error) { - env.showMessage(` ⚠ ${contractName}: Cannot verify PAUSE_ROLE: ${error}`) - } - } - - // 3. Verify IssuanceAllocator configuration - env.showMessage('\n3. Verifying IssuanceAllocator configuration...') - const iaDeployment = env.getOrNull(Contracts.issuance.IssuanceAllocator.name) - if (iaDeployment) { - try { - const issuanceRate = (await readFn(iaDeployment, { functionName: 'getIssuancePerBlock' })) as bigint - const isPaused = (await readFn(iaDeployment, { functionName: 'paused' })) as boolean - - env.showMessage(` Issuance rate: ${issuanceRate} tokens/block`) - env.showMessage(` Paused: ${isPaused}`) - - if (issuanceRate === 0n) { - env.showMessage(` ⚠ Issuance rate is 0 (will be configured in step 5)`) - } else { - env.showMessage(` ✓ Issuance rate configured`) - } - - if (isPaused) { - env.showMessage(` ✗ WARNING: Contract is PAUSED`) - } else { - env.showMessage(` ✓ Contract is not paused`) - } - } catch (error) { - env.showMessage(` ✗ Error verifying IssuanceAllocator configuration: ${error}`) - } - } - - // 4. Verify per-proxy ProxyAdmin ownership (OZ v5 pattern) - env.showMessage('\n4. Verifying per-proxy ProxyAdmin ownership...') - const client = graph.getPublicClient(env) - const proxiedContracts = [ - Contracts.issuance.IssuanceAllocator.name, - Contracts.issuance.PilotAllocation.name, - Contracts.issuance.RewardsEligibilityOracle.name, - ] - for (const contractName of proxiedContracts) { - const proxyDeployment = env.getOrNull(`${contractName}_Proxy`) - if (!proxyDeployment) { - env.showMessage(` Skipping ${contractName} - proxy not deployed`) - continue - } - - try { - // Read per-proxy ProxyAdmin address from ERC1967 slot - const proxyAdminAddress = await getProxyAdminAddress(client, proxyDeployment.address) - - // Read owner from ProxyAdmin - const owner = (await client.readContract({ - address: proxyAdminAddress as `0x${string}`, - abi: [{ name: 'owner', type: 'function', inputs: [], outputs: [{ type: 'address' }] }], - functionName: 'owner', - })) as string - - if (owner.toLowerCase() === governor.toLowerCase()) { - env.showMessage(` ✓ ${contractName}: ProxyAdmin (${proxyAdminAddress}) owned by governor`) - } else { - env.showMessage(` ✗ ${contractName}: ProxyAdmin owned by ${owner}, expected ${governor}`) - } - } catch (error) { - env.showMessage(` ✗ ${contractName}: Error verifying ProxyAdmin ownership: ${error}`) - } - } - - env.showMessage('\n========== Verification Complete ==========\n') -} - -func.tags = Tags.verifyGovernance -func.dependencies = [actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.TRANSFER)] // Run after governance transfer (step 6) - -export default func diff --git a/packages/deployment/deploy/allocate/allocator/06_transfer_governance.ts b/packages/deployment/deploy/allocate/allocator/06_transfer_governance.ts index eba857f27..b960839b7 100644 --- a/packages/deployment/deploy/allocate/allocator/06_transfer_governance.ts +++ b/packages/deployment/deploy/allocate/allocator/06_transfer_governance.ts @@ -1,132 +1,61 @@ import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { getGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { execute, read } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { getGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + requireContracts, + requireDeployer, + transferProxyAdminOwnership, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { checkDeployerRevoked } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { execute, graph, read } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' /** - * Transfer governance of ${Contracts.issuance.IssuanceAllocator.name} from deployer to protocol governor (deployer account) + * Transfer IssuanceAllocator governance from deployer to protocol governor * - * Step 6 from IssuanceAllocator.md: - * - Grant PAUSE_ROLE to pause guardian (from Controller) - * - Grant GOVERNOR_ROLE to protocol governor (from Controller.getGovernor()) - * - Revoke GOVERNOR_ROLE from deployment account (MUST grant to governance first, then revoke) + * - Revoke GOVERNOR_ROLE from deployment account + * - Transfer ProxyAdmin ownership to governor * - * This is a critical security step that transfers control from the deployment account - * to the protocol governance multisig. After this step, only governance can modify - * issuance allocations and rates. + * Role grants (GOVERNOR_ROLE to governor, PAUSE_ROLE to pauseGuardian) happen + * in 04_configure.ts. This script only revokes deployer access. * - * Requires deployer to have GOVERNOR_ROLE (granted during initialization in step 1). * Idempotent: checks on-chain state, skips if already transferred. * * Usage: - * pnpm hardhat deploy --tags issuance-transfer-governance --network + * pnpm hardhat deploy --tags IssuanceAllocator,transfer --network */ -const func: DeployScriptModule = async (env) => { +export default createActionModule(Contracts.issuance.IssuanceAllocator, DeploymentActions.TRANSFER, async (env) => { const readFn = read(env) const executeFn = execute(env) + const client = graph.getPublicClient(env) as PublicClient const deployer = requireDeployer(env) - - // Get protocol governor and pause guardian from Controller const governor = await getGovernor(env) - const pauseGuardian = await getPauseGuardian(env) - const [issuanceAllocator] = requireContracts(env, [Contracts.issuance.IssuanceAllocator]) - env.showMessage(`\n========== Transfer Governance of ${Contracts.issuance.IssuanceAllocator.name} ==========`) - env.showMessage(`${Contracts.issuance.IssuanceAllocator.name}: ${issuanceAllocator.address}`) + env.showMessage(`\n========== Transfer ${Contracts.issuance.IssuanceAllocator.name} ==========`) env.showMessage(`Deployer: ${deployer}`) - env.showMessage(`Protocol Governor (from Controller): ${governor}`) - env.showMessage(`Pause Guardian: ${pauseGuardian}\n`) - - // Get role constants - const GOVERNOR_ROLE = (await readFn(issuanceAllocator, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` - const PAUSE_ROLE = (await readFn(issuanceAllocator, { functionName: 'PAUSE_ROLE' })) as `0x${string}` - - // Check current state - env.showMessage('📋 Checking current governance state...\n') - - const checks = { - pauseRole: false, - governorHasRole: false, - deployerRevoked: false, - } - - // Check pause role - checks.pauseRole = (await readFn(issuanceAllocator, { - functionName: 'hasRole', - args: [PAUSE_ROLE, pauseGuardian], - })) as boolean - env.showMessage(` Pause guardian has PAUSE_ROLE: ${checks.pauseRole ? '✓' : '✗'} (${pauseGuardian})`) - - // Check governor has GOVERNOR_ROLE - checks.governorHasRole = (await readFn(issuanceAllocator, { - functionName: 'hasRole', - args: [GOVERNOR_ROLE, governor], - })) as boolean - env.showMessage(` Governor has GOVERNOR_ROLE: ${checks.governorHasRole ? '✓' : '✗'} (${governor})`) - - // Check deployer no longer has GOVERNOR_ROLE - const deployerHasRole = (await readFn(issuanceAllocator, { - functionName: 'hasRole', - args: [GOVERNOR_ROLE, deployer], - })) as boolean - checks.deployerRevoked = !deployerHasRole - env.showMessage(` Deployer GOVERNOR_ROLE revoked: ${checks.deployerRevoked ? '✓' : '✗'} (${deployer})`) - - // All checks passed? - const allPassed = Object.values(checks).every(Boolean) - if (allPassed) { - env.showMessage(`\n✅ Governance already transferred to ${governor}\n`) - return - } + env.showMessage(`Governor: ${governor}\n`) - // Execute governance transfer - // CRITICAL: Must grant to governance BEFORE revoking from deployer - env.showMessage('\n🔨 Executing governance transfer...\n') + // Check if deployer GOVERNOR_ROLE already revoked (shared precondition check) + const precondition = await checkDeployerRevoked(client, issuanceAllocator.address, deployer) + if (precondition.done) { + env.showMessage(`✓ Deployer GOVERNOR_ROLE already revoked`) + } else { + const GOVERNOR_ROLE = (await readFn(issuanceAllocator, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` - // Step 1: Grant PAUSE_ROLE to pause guardian - if (!checks.pauseRole) { - env.showMessage(` Granting PAUSE_ROLE to ${pauseGuardian}...`) - await executeFn(issuanceAllocator, { - account: deployer, - functionName: 'grantRole', - args: [PAUSE_ROLE, pauseGuardian], - }) - env.showMessage(' ✓ grantRole(PAUSE_ROLE) executed') - } - - // Step 2: Grant GOVERNOR_ROLE to governor - if (!checks.governorHasRole) { - env.showMessage(` Granting GOVERNOR_ROLE to ${governor}...`) - await executeFn(issuanceAllocator, { - account: deployer, - functionName: 'grantRole', - args: [GOVERNOR_ROLE, governor], - }) - env.showMessage(' ✓ grantRole(GOVERNOR_ROLE) executed') - } - - // Step 3: Revoke GOVERNOR_ROLE from deployer (ONLY after governance has the role) - if (!checks.deployerRevoked) { - env.showMessage(` Revoking GOVERNOR_ROLE from deployer ${deployer}...`) + env.showMessage(`🔨 Revoking deployer GOVERNOR_ROLE...`) await executeFn(issuanceAllocator, { account: deployer, functionName: 'revokeRole', args: [GOVERNOR_ROLE, deployer], }) - env.showMessage(' ✓ revokeRole(GOVERNOR_ROLE) executed') + env.showMessage(` ✓ revokeRole(GOVERNOR_ROLE) executed`) } - env.showMessage(`\n✅ Governance transferred to ${governor}!\n`) - env.showMessage( - `⚠️ IMPORTANT: Deployer no longer has control. Only governance can modify ${Contracts.issuance.IssuanceAllocator.name}.\n`, - ) -} - -func.tags = Tags.issuanceTransfer -func.dependencies = [actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.CONFIGURE)] + // Transfer ProxyAdmin ownership to governor + await transferProxyAdminOwnership(env, Contracts.issuance.IssuanceAllocator) -export default func + env.showMessage(`\n✅ ${Contracts.issuance.IssuanceAllocator.name} governance transferred!\n`) +}) diff --git a/packages/deployment/deploy/allocate/allocator/07_activate.ts b/packages/deployment/deploy/allocate/allocator/07_activate.ts deleted file mode 100644 index 4d189166e..000000000 --- a/packages/deployment/deploy/allocate/allocator/07_activate.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { GRAPH_TOKEN_ABI, ISSUANCE_TARGET_ABI, REWARDS_MANAGER_ABI } from '@graphprotocol/deployment/lib/abis.js' -import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' -import { requireRewardsManagerUpgraded } from '@graphprotocol/deployment/lib/contract-checks.js' -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { getGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' -import { ComponentTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { createGovernanceTxBuilder, saveGovernanceTxAndExit } from '@graphprotocol/deployment/lib/execute-governance.js' -import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' -import type { PublicClient } from 'viem' -import { encodeFunctionData } from 'viem' - -/** - * Activate ${Contracts.issuance.IssuanceAllocator.name} in the protocol (governance account) - * - * Steps 8-10 from IssuanceAllocator.md: - * - Configure RewardsManager to use IssuanceAllocator - * - Grant minter role to IssuanceAllocator on GraphToken - * - (Optional) Set default target for unallocated issuance - * - * Idempotent: checks on-chain state, skips if already activated. - * Generates Safe TX batch for governance execution. - * Does NOT execute - governance must execute via Safe or deploy:execute-governance. - * - * Usage: - * pnpm hardhat deploy --tags issuance-activation --network - */ -const func: DeployScriptModule = async (env) => { - const deployer = requireDeployer(env) - - // Get protocol governor from Controller - const governor = await getGovernor(env) - - const [issuanceAllocator, rewardsManager, graphToken] = requireContracts(env, [ - Contracts.issuance.IssuanceAllocator, - Contracts.horizon.RewardsManager, - Contracts.horizon.L2GraphToken, - ]) - - const iaAddress = issuanceAllocator.address - const rmAddress = rewardsManager.address - const gtAddress = graphToken.address - - // Create viem client for direct contract calls - const client = graph.getPublicClient(env) as PublicClient - - // Check if RewardsManager supports IIssuanceTarget (has been upgraded) - // Throws error if not upgraded - await requireRewardsManagerUpgraded(client, rmAddress, env) - - const targetChainId = await getTargetChainIdFromEnv(env) - - env.showMessage(`\n========== Activate ${Contracts.issuance.IssuanceAllocator.name} ==========`) - env.showMessage(`Network: ${env.name} (chainId=${targetChainId})`) - env.showMessage(`Deployer: ${deployer}`) - env.showMessage(`Protocol Governor (from Controller): ${governor}`) - env.showMessage(`${Contracts.issuance.IssuanceAllocator.name}: ${iaAddress}`) - env.showMessage(`${Contracts.horizon.RewardsManager.name}: ${rmAddress}`) - env.showMessage(`${Contracts.horizon.L2GraphToken.name}: ${gtAddress}\n`) - - // Check current state - env.showMessage('📋 Checking current activation state...\n') - - const checks = { - iaIntegrated: false, - iaMinter: false, - } - - // Step 8: Check RM.getIssuanceAllocator() == IA - // Note: Use viem directly because synced deployments have empty ABIs - const currentIA = (await client.readContract({ - address: rmAddress as `0x${string}`, - abi: REWARDS_MANAGER_ABI, - functionName: 'getIssuanceAllocator', - })) as string - checks.iaIntegrated = currentIA.toLowerCase() === iaAddress.toLowerCase() - env.showMessage(` IA integrated: ${checks.iaIntegrated ? '✓' : '✗'} (current: ${currentIA})`) - - // Step 9: Check GraphToken.isMinter(IA) - checks.iaMinter = (await client.readContract({ - address: gtAddress as `0x${string}`, - abi: GRAPH_TOKEN_ABI, - functionName: 'isMinter', - args: [iaAddress as `0x${string}`], - })) as boolean - env.showMessage(` IA minter: ${checks.iaMinter ? '✓' : '✗'}`) - - // All checks passed? - const allPassed = Object.values(checks).every(Boolean) - if (allPassed) { - env.showMessage(`\n✅ ${Contracts.issuance.IssuanceAllocator.name} already activated\n`) - return - } - - // Build TX batch for missing activation steps - env.showMessage('\n🔨 Building activation TX batch...\n') - - const builder = await createGovernanceTxBuilder(env, `activate-${Contracts.issuance.IssuanceAllocator.name}`) - - // Step 8: RM.setIssuanceAllocator(IA) - if (!checks.iaIntegrated) { - const data = encodeFunctionData({ - abi: ISSUANCE_TARGET_ABI, - functionName: 'setIssuanceAllocator', - args: [iaAddress as `0x${string}`], - }) - builder.addTx({ to: rmAddress, value: '0', data }) - env.showMessage(` + RewardsManager.setIssuanceAllocator(${iaAddress})`) - } - - // Step 9: GraphToken.addMinter(IA) - if (!checks.iaMinter) { - const data = encodeFunctionData({ - abi: GRAPH_TOKEN_ABI, - functionName: 'addMinter', - args: [iaAddress as `0x${string}`], - }) - builder.addTx({ to: gtAddress, value: '0', data }) - env.showMessage(` + GraphToken.addMinter(${iaAddress})`) - } - - saveGovernanceTxAndExit(env, builder, `${Contracts.issuance.IssuanceAllocator.name} activation`) -} - -func.tags = Tags.issuanceActivation -func.dependencies = [ComponentTags.VERIFY_GOVERNANCE, ComponentTags.REWARDS_MANAGER_DEPLOY] // Run after governance transfer and verification (steps 6-7) - -export default func diff --git a/packages/deployment/deploy/allocate/allocator/08_allocation.ts b/packages/deployment/deploy/allocate/allocator/08_allocation.ts deleted file mode 100644 index 9b18ae5c8..000000000 --- a/packages/deployment/deploy/allocate/allocator/08_allocation.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { - checkIssuanceAllocatorActivation, - isRewardsManagerUpgraded, -} from '@graphprotocol/deployment/lib/contract-checks.js' -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { ComponentTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' -import type { PublicClient } from 'viem' - -/** - * Full IssuanceAllocator deployment - deploy, configure, transfer governance, verify, and activate - * - * This is the aggregate tag for complete IssuanceAllocator setup (IssuanceAllocator.md steps 1-10): - * 1. Deploy IssuanceAllocator proxy and implementation (deployer has initial GOVERNOR_ROLE) - * 2-3. Configure: set rate, RM allocation (deployer executes) - * 4-5. (Optional upgrade steps via governance) - * 6. Transfer governance: grant roles to governance, revoke from deployer (deployer executes) - * 7. Verify: bytecode, access control, configuration (automated verification) - * 8-10. Generate governance TX for activation: RM integration, minter role (governance must execute) - * - * Requires: - * - RewardsManager to be upgraded first (supports IIssuanceTarget) - * - Governance to execute activation TX (steps 8-10) via Safe or deploy:execute-governance - * - * Usage: - * pnpm hardhat deploy --tags issuance-allocation --network - */ -const func: DeployScriptModule = async (env) => { - const [issuanceAllocator, rewardsManager, graphToken] = requireContracts(env, [ - Contracts.issuance.IssuanceAllocator, - Contracts.horizon.RewardsManager, - Contracts.horizon.L2GraphToken, - ]) - - // Verify RM has been upgraded (supports IERC165) - const client = graph.getPublicClient(env) as PublicClient - const upgraded = await isRewardsManagerUpgraded(client, rewardsManager.address) - if (!upgraded) { - env.showMessage( - `\n❌ ${Contracts.horizon.RewardsManager.name} not upgraded - run deploy:execute-governance first\n`, - ) - process.exit(1) - } - - // Verify activation state - const activation = await checkIssuanceAllocatorActivation( - client, - issuanceAllocator.address, - rewardsManager.address, - graphToken.address, - ) - - if (!activation.iaIntegrated || !activation.iaMinter) { - env.showMessage(`\n❌ ${Contracts.issuance.IssuanceAllocator.name} not fully activated`) - env.showMessage( - ` IA integrated with ${Contracts.horizon.RewardsManager.name}: ${activation.iaIntegrated ? '✓' : '✗'}`, - ) - env.showMessage(` IA has minter role: ${activation.iaMinter ? '✓' : '✗'}\n`) - process.exit(1) - } - - env.showMessage(`\n✅ ${Contracts.issuance.IssuanceAllocator.name} fully deployed, configured, and activated\n`) -} - -func.tags = Tags.issuanceAllocation -func.dependencies = [ComponentTags.REWARDS_MANAGER, ComponentTags.ISSUANCE_ALLOCATOR, ComponentTags.ISSUANCE_ACTIVATION] - -export default func diff --git a/packages/deployment/deploy/allocate/allocator/09_end.ts b/packages/deployment/deploy/allocate/allocator/09_end.ts new file mode 100644 index 000000000..272c2915e --- /dev/null +++ b/packages/deployment/deploy/allocate/allocator/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.issuance.IssuanceAllocator) diff --git a/packages/deployment/deploy/allocate/allocator/10_status.ts b/packages/deployment/deploy/allocate/allocator/10_status.ts new file mode 100644 index 000000000..23df5d817 --- /dev/null +++ b/packages/deployment/deploy/allocate/allocator/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.issuance.IssuanceAllocator) diff --git a/packages/deployment/deploy/allocate/default/01_deploy.ts b/packages/deployment/deploy/allocate/default/01_deploy.ts new file mode 100644 index 000000000..311c11b1b --- /dev/null +++ b/packages/deployment/deploy/allocate/default/01_deploy.ts @@ -0,0 +1,39 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { deployProxyContract, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import type { DeployScriptModule } from '@rocketh/core/types' + +/** + * Deploy DefaultAllocation proxy — IA's default target for unallocated issuance + * + * Uses the shared DirectAllocation_Implementation. + * Initialized with deployer as governor (transferred in transfer step). + * + * Usage: + * pnpm hardhat deploy --tags DefaultAllocation,deploy --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + await syncComponentsFromRegistry(env, [ + Contracts.issuance.DirectAllocation_Implementation, + Contracts.issuance.DefaultAllocation, + ]) + + env.showMessage(`\n📦 Deploying DefaultAllocation proxy...`) + env.showMessage(` Shared implementation: ${Contracts.issuance.DirectAllocation_Implementation.name}`) + + await deployProxyContract(env, { + contract: Contracts.issuance.DefaultAllocation, + sharedImplementation: Contracts.issuance.DirectAllocation_Implementation, + initializeArgs: [requireDeployer(env)], + }) + + env.showMessage('\n✓ DefaultAllocation deployment complete') +} + +func.tags = [ComponentTags.DEFAULT_ALLOCATION] +func.dependencies = [ComponentTags.DIRECT_ALLOCATION_IMPL] +func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) + +export default func diff --git a/packages/deployment/deploy/allocate/default/02_upgrade.ts b/packages/deployment/deploy/allocate/default/02_upgrade.ts new file mode 100644 index 000000000..2bb15a1da --- /dev/null +++ b/packages/deployment/deploy/allocate/default/02_upgrade.ts @@ -0,0 +1,27 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { upgradeImplementation } from '@graphprotocol/deployment/lib/upgrade-implementation.js' +import type { DeployScriptModule } from '@rocketh/core/types' + +// DefaultAllocation Upgrade +// +// Upgrades DefaultAllocation proxy to DirectAllocation implementation via per-proxy ProxyAdmin. + +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.UPGRADE)) return + await syncComponentsFromRegistry(env, [ + Contracts.issuance.DirectAllocation_Implementation, + Contracts.issuance.DefaultAllocation, + ]) + await upgradeImplementation(env, Contracts.issuance.DefaultAllocation, { + implementationName: 'DirectAllocation', + }) + await syncComponentsFromRegistry(env, [Contracts.issuance.DefaultAllocation]) +} + +func.tags = [ComponentTags.DEFAULT_ALLOCATION] +func.dependencies = [ComponentTags.DIRECT_ALLOCATION_IMPL] +func.skip = async () => shouldSkipAction(DeploymentActions.UPGRADE) + +export default func diff --git a/packages/deployment/deploy/allocate/default/04_configure.ts b/packages/deployment/deploy/allocate/default/04_configure.ts new file mode 100644 index 000000000..528531ff6 --- /dev/null +++ b/packages/deployment/deploy/allocate/default/04_configure.ts @@ -0,0 +1,119 @@ +import { ACCESS_CONTROL_ENUMERABLE_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { getGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContract, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { checkDefaultAllocationConfigured } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph, read, tx } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' +import { encodeFunctionData } from 'viem' + +/** + * Configure DefaultAllocation + * + * - Grants GOVERNOR_ROLE to protocol governor + * - Grants PAUSE_ROLE to pause guardian + * + * Note: IA.setDefaultTarget(DA) is an activation step in issuance-connect, + * not a configure step (requires IA to have minter role). + * + * Idempotent: checks on-chain state, skips if already configured. + * + * Usage: + * pnpm hardhat deploy --tags DefaultAllocation,configure --network + */ +export default createActionModule(Contracts.issuance.DefaultAllocation, DeploymentActions.CONFIGURE, async (env) => { + const client = graph.getPublicClient(env) as PublicClient + const readFn = read(env) + const deployer = requireDeployer(env) + const governor = await getGovernor(env) + const pauseGuardian = await getPauseGuardian(env) + + const defaultAllocation = requireContract(env, Contracts.issuance.DefaultAllocation) + + env.showMessage(`\n========== Configure ${Contracts.issuance.DefaultAllocation.name} ==========`) + env.showMessage(`DefaultAllocation: ${defaultAllocation.address}`) + + // Check if already configured (shared precondition check) + const precondition = await checkDefaultAllocationConfigured( + client, + defaultAllocation.address, + governor, + pauseGuardian, + ) + if (precondition.done) { + env.showMessage(`\n✅ ${Contracts.issuance.DefaultAllocation.name} already configured\n`) + return + } + + env.showMessage('\n📋 Checking current configuration...\n') + + const GOVERNOR_ROLE = (await readFn(defaultAllocation, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` + const PAUSE_ROLE = (await readFn(defaultAllocation, { functionName: 'PAUSE_ROLE' })) as `0x${string}` + + const governorHasRole = (await client.readContract({ + address: defaultAllocation.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [GOVERNOR_ROLE, governor as `0x${string}`], + })) as boolean + env.showMessage(` Governor GOVERNOR_ROLE: ${governorHasRole ? '✓' : '✗'}`) + + const pauseGuardianHasRole = (await client.readContract({ + address: defaultAllocation.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [PAUSE_ROLE, pauseGuardian as `0x${string}`], + })) as boolean + env.showMessage(` PauseGuardian PAUSE_ROLE: ${pauseGuardianHasRole ? '✓' : '✗'}`) + + const deployerHasRole = (await client.readContract({ + address: defaultAllocation.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [GOVERNOR_ROLE, deployer as `0x${string}`], + })) as boolean + + const txs: Array<{ to: string; data: `0x${string}`; label: string }> = [] + + if (!governorHasRole) { + txs.push({ + to: defaultAllocation.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [GOVERNOR_ROLE, governor as `0x${string}`], + }), + label: `grantRole(GOVERNOR_ROLE, ${governor})`, + }) + } + + if (!pauseGuardianHasRole) { + txs.push({ + to: defaultAllocation.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [PAUSE_ROLE, pauseGuardian as `0x${string}`], + }), + label: `grantRole(PAUSE_ROLE, ${pauseGuardian})`, + }) + } + + if (!deployerHasRole) { + env.showMessage(`\n ○ Deployer does not have GOVERNOR_ROLE — skipping (governance TX in upgrade step)\n`) + return + } + + if (txs.length === 0) return + + env.showMessage('\n🔨 Executing role grants as deployer...\n') + const txFn = tx(env) + for (const t of txs) { + await txFn({ account: deployer, to: t.to as `0x${string}`, data: t.data }) + env.showMessage(` ✓ ${t.label}`) + } + + env.showMessage(`\n✅ ${Contracts.issuance.DefaultAllocation.name} configuration complete!\n`) +}) diff --git a/packages/deployment/deploy/allocate/default/05_transfer_governance.ts b/packages/deployment/deploy/allocate/default/05_transfer_governance.ts new file mode 100644 index 000000000..af5bcd8e6 --- /dev/null +++ b/packages/deployment/deploy/allocate/default/05_transfer_governance.ts @@ -0,0 +1,51 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + requireContract, + requireDeployer, + transferProxyAdminOwnership, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { checkDeployerRevoked } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { execute, graph, read } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Transfer DefaultAllocation governance from deployer + * + * - Revoke GOVERNOR_ROLE from deployment account + * - Transfer ProxyAdmin ownership to governor + * + * Role grants happen in 04_configure.ts. + * + * Usage: + * pnpm hardhat deploy --tags DefaultAllocation,transfer --network + */ +export default createActionModule(Contracts.issuance.DefaultAllocation, DeploymentActions.TRANSFER, async (env) => { + const readFn = read(env) + const executeFn = execute(env) + const client = graph.getPublicClient(env) as PublicClient + const deployer = requireDeployer(env) + const da = requireContract(env, Contracts.issuance.DefaultAllocation) + + env.showMessage(`\n========== Transfer ${Contracts.issuance.DefaultAllocation.name} ==========`) + + const precondition = await checkDeployerRevoked(client, da.address, deployer) + if (precondition.done) { + env.showMessage(`✓ Deployer GOVERNOR_ROLE already revoked`) + } else { + const GOVERNOR_ROLE = (await readFn(da, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` + + env.showMessage(`🔨 Revoking deployer GOVERNOR_ROLE...`) + await executeFn(da, { + account: deployer, + functionName: 'revokeRole', + args: [GOVERNOR_ROLE, deployer], + }) + env.showMessage(` ✓ revokeRole(GOVERNOR_ROLE) executed`) + } + + await transferProxyAdminOwnership(env, Contracts.issuance.DefaultAllocation) + + env.showMessage(`\n✅ ${Contracts.issuance.DefaultAllocation.name} governance transferred!\n`) +}) diff --git a/packages/deployment/deploy/allocate/default/09_end.ts b/packages/deployment/deploy/allocate/default/09_end.ts new file mode 100644 index 000000000..cacd93b61 --- /dev/null +++ b/packages/deployment/deploy/allocate/default/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.issuance.DefaultAllocation) diff --git a/packages/deployment/deploy/allocate/default/10_status.ts b/packages/deployment/deploy/allocate/default/10_status.ts new file mode 100644 index 000000000..012cc8be3 --- /dev/null +++ b/packages/deployment/deploy/allocate/default/10_status.ts @@ -0,0 +1,10 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +/** + * DefaultAllocation status — show detailed state of the default allocation proxy + * + * Usage: + * pnpm hardhat deploy --tags DefaultAllocation --network + */ +export default createStatusModule(Contracts.issuance.DefaultAllocation) diff --git a/packages/deployment/deploy/allocate/direct/01_impl.ts b/packages/deployment/deploy/allocate/direct/01_impl.ts index 413fff317..ca465ae66 100644 --- a/packages/deployment/deploy/allocate/direct/01_impl.ts +++ b/packages/deployment/deploy/allocate/direct/01_impl.ts @@ -1,82 +1,78 @@ -import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' -import { loadDirectAllocationArtifact } from '@graphprotocol/deployment/lib/artifact-loaders.js' +import { getLibraryResolver, loadDirectAllocationArtifact } from '@graphprotocol/deployment/lib/artifact-loaders.js' +import { computeBytecodeHash } from '@graphprotocol/deployment/lib/bytecode-utils.js' import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { SpecialTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' import { requireDeployer, requireGraphToken, showDeploymentStatus, } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' import { deploy, graph } from '@graphprotocol/deployment/rocketh/deploy.js' import type { DeployScriptModule } from '@rocketh/core/types' /** * Deploy shared DirectAllocation implementation * - * This implementation is shared by all DirectAllocation proxies: - * - PilotAllocation - * - ReclaimAddress_Treasury - * - (other ReclaimAddress_* instances) + * This implementation is shared by all DirectAllocation proxies + * (DefaultAllocation, ReclaimedRewards). Runs during both deploy AND upgrade + * actions — deploying the implementation is a prerequisite for proxy upgrades. * - * Deploying once and sharing reduces gas costs and ensures all instances - * are on the same version. + * Rocketh handles idempotency: if bytecode is unchanged, no redeployment occurs. * * Usage: - * pnpm hardhat deploy --tags direct-allocation-impl --network + * pnpm hardhat deploy --tags DirectAllocation_Implementation,deploy --network */ - const func: DeployScriptModule = async (env) => { - const deployFn = deploy(env) + // Run for both deploy and upgrade actions + if (shouldSkipAction(DeploymentActions.DEPLOY) && shouldSkipAction(DeploymentActions.UPGRADE)) return - const deployer = requireDeployer(env) + await syncComponentsFromRegistry(env, [ + Contracts.issuance.DirectAllocation_Implementation, + Contracts.horizon.L2GraphToken, + ]) - // Require L2GraphToken from deployments JSON (Graph Token on L2) + const deployFn = deploy(env) + const deployer = requireDeployer(env) const graphTokenDep = requireGraphToken(env) env.showMessage(`\n📦 Deploying shared ${Contracts.issuance.DirectAllocation_Implementation.name}...`) const artifact = loadDirectAllocationArtifact() - const result = await deployFn( - Contracts.issuance.DirectAllocation_Implementation.name, - { - account: deployer, - artifact, - args: [graphTokenDep.address], - }, - { - skipIfAlreadyDeployed: true, - }, - ) + const result = await deployFn(Contracts.issuance.DirectAllocation_Implementation.name, { + account: deployer, + artifact, + args: [graphTokenDep.address], + }) - showDeploymentStatus(env, Contracts.issuance.DirectAllocation_Implementation, result) - - // Set pendingImplementation for all proxies that use DirectAllocation - // This allows the upgrade scripts to read from address book instead of deployment records - const targetChainId = await getTargetChainIdFromEnv(env) - const addressBook = graph.getIssuanceAddressBook(targetChainId) + // Persist to address book — only write metadata on new deployments + // to avoid overwriting stored hash with current artifact when deploy was a no-op + if (result.newlyDeployed) { + const resolver = getLibraryResolver('issuance') + const bytecodeHash = computeBytecodeHash( + artifact.deployedBytecode ?? '0x', + artifact.deployedLinkReferences, + resolver, + ) - const proxiesToUpdate = [Contracts.issuance.PilotAllocation.name] - for (const proxyName of proxiesToUpdate) { - try { - const entry = addressBook.getEntry(proxyName as Parameters[0]) - if (entry) { - addressBook.setPendingImplementation( - proxyName as Parameters[0], - result.address, - { - txHash: result.transaction?.hash, - }, - ) - env.showMessage(` ✓ Set pendingImplementation for ${proxyName}`) - } - } catch { - // Entry doesn't exist yet - will be created by deploy script - env.showMessage(` - ${proxyName} not in address book yet, skipping`) - } + await graph.updateIssuanceAddressBook(env, { + name: Contracts.issuance.DirectAllocation_Implementation.name, + address: result.address, + deployment: { + txHash: result.transaction?.hash ?? '', + argsData: result.argsData, + bytecodeHash, + }, + }) } + + showDeploymentStatus(env, Contracts.issuance.DirectAllocation_Implementation, result) + + await syncComponentsFromRegistry(env, [Contracts.issuance.DirectAllocation_Implementation]) } -func.tags = Tags.directAllocationImpl -func.dependencies = [SpecialTags.SYNC] +func.tags = [ComponentTags.DIRECT_ALLOCATION_IMPL] +func.dependencies = [] +func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) && shouldSkipAction(DeploymentActions.UPGRADE) export default func diff --git a/packages/deployment/deploy/allocate/pilot/01_deploy.ts b/packages/deployment/deploy/allocate/pilot/01_deploy.ts deleted file mode 100644 index b59104f8e..000000000 --- a/packages/deployment/deploy/allocate/pilot/01_deploy.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { - actionTag, - ComponentTags, - DeploymentActions, - SpecialTags, - Tags, -} from '@graphprotocol/deployment/lib/deployment-tags.js' -import { deployProxyContract } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * Deploy PilotAllocation proxy using shared DirectAllocation implementation - * - * This deploys PilotAllocation as an OZ v5 TransparentUpgradeableProxy pointing to - * the shared DirectAllocation_Implementation. All DirectAllocation proxies - * share one implementation for efficiency. - * - * Architecture: - * - Implementation: Shared DirectAllocation_Implementation - * - Proxy: OZ v5 TransparentUpgradeableProxy with atomic initialization - * - Admin: Per-proxy ProxyAdmin (created by OZ v5 proxy, owned by governor) - * - * Usage: - * pnpm hardhat deploy --tags pilot-allocation-deploy --network - */ - -const func: DeployScriptModule = async (env) => { - env.showMessage(`\n📦 Deploying ${Contracts.issuance.PilotAllocation.name}...`) - - await deployProxyContract(env, { - contract: Contracts.issuance.PilotAllocation, - sharedImplementation: Contracts.issuance.DirectAllocation_Implementation, - // initializeArgs defaults to [governor] - }) -} - -func.tags = Tags.pilotAllocationDeploy -func.dependencies = [ - SpecialTags.SYNC, - ComponentTags.DIRECT_ALLOCATION_IMPL, - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.DEPLOY), -] - -export default func diff --git a/packages/deployment/deploy/allocate/pilot/02_upgrade.ts b/packages/deployment/deploy/allocate/pilot/02_upgrade.ts deleted file mode 100644 index 37e3aa593..000000000 --- a/packages/deployment/deploy/allocate/pilot/02_upgrade.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { upgradeImplementation } from '@graphprotocol/deployment/lib/upgrade-implementation.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -// PilotAllocation Upgrade -// -// Upgrades PilotAllocation proxy to DirectAllocation implementation via per-proxy ProxyAdmin. -// The implementation is shared across multiple allocation proxies. -// -// Workflow: -// 1. Check for pending implementation in address book (set by direct-allocation-impl) -// 2. Generate governance TX (upgradeAndCall to per-proxy ProxyAdmin) -// 3. Fork mode: execute via governor impersonation -// 4. Production: output TX file for Safe execution -// -// Usage: -// FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags pilot-allocation-upgrade --network localhost - -const func: DeployScriptModule = async (env) => { - await upgradeImplementation(env, Contracts.issuance.PilotAllocation, { - implementationName: 'DirectAllocation', - }) -} - -func.tags = Tags.pilotAllocationUpgrade -func.dependencies = [ - actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.DEPLOY), - ComponentTags.DIRECT_ALLOCATION_IMPL, -] - -export default func diff --git a/packages/deployment/deploy/allocate/pilot/04_configure.ts b/packages/deployment/deploy/allocate/pilot/04_configure.ts deleted file mode 100644 index 780ca72da..000000000 --- a/packages/deployment/deploy/allocate/pilot/04_configure.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { getGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { execute, read } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * Configure PilotAllocation as IssuanceAllocator target - * - * Sets up PilotAllocation to receive tokens via allocator-minting from IssuanceAllocator. - * This requires IssuanceAllocator to be configured (deployer has GOVERNOR_ROLE or governance). - * - * Idempotent: checks if already configured, skips if so. - * - * Usage: - * pnpm hardhat deploy --tags pilot-allocation-configure --network - */ -const func: DeployScriptModule = async (env) => { - const readFn = read(env) - const executeFn = execute(env) - - // Get protocol governor from Controller - const governor = await getGovernor(env) - - const [pilotAllocation, issuanceAllocator] = requireContracts(env, [ - Contracts.issuance.PilotAllocation, - Contracts.issuance.IssuanceAllocator, - ]) - - env.showMessage(`\n========== Configure ${Contracts.issuance.PilotAllocation.name} ==========`) - env.showMessage(`${Contracts.issuance.PilotAllocation.name}: ${pilotAllocation.address}`) - env.showMessage(`${Contracts.issuance.IssuanceAllocator.name}: ${issuanceAllocator.address}`) - - // Check current allocation - try { - const allocation = (await readFn(issuanceAllocator, { - functionName: 'getTargetAllocation', - args: [pilotAllocation.address], - })) as [bigint, bigint, bigint] - - if (allocation[1] > 0n || allocation[2] > 0n) { - env.showMessage(`\n✓ ${Contracts.issuance.PilotAllocation.name} already configured as target`) - env.showMessage(` allocatorMintingRate: ${allocation[1]}`) - env.showMessage(` selfMintingRate: ${allocation[2]}`) - return - } - } catch { - // Not configured yet - } - - // Get current issuance rate to determine allocation - const issuancePerBlock = (await readFn(issuanceAllocator, { functionName: 'getIssuancePerBlock' })) as bigint - if (issuancePerBlock === 0n) { - env.showMessage( - `\n⚠️ ${Contracts.issuance.IssuanceAllocator.name} rate is 0, cannot configure ${Contracts.issuance.PilotAllocation.name} allocation`, - ) - env.showMessage(` Configure ${Contracts.issuance.IssuanceAllocator.name} first with setIssuancePerBlock()`) - return - } - - // Configure PilotAllocation with allocator-minting (IA mints to it) - // Default: small allocation for pilot testing - const pilotRate = issuancePerBlock / 100n // 1% of total issuance - - env.showMessage(`\n🔨 Configuring ${Contracts.issuance.PilotAllocation.name}...`) - env.showMessage(` Setting allocatorMintingRate: ${pilotRate} (1% of ${issuancePerBlock})`) - - try { - await executeFn(issuanceAllocator, { - account: governor, - functionName: 'setTargetAllocation', - args: [pilotAllocation.address, pilotRate, 0n], // allocatorMintingRate, selfMintingRate (PA doesn't self-mint) - }) - env.showMessage( - `\n✅ ${Contracts.issuance.PilotAllocation.name} configured as ${Contracts.issuance.IssuanceAllocator.name} target`, - ) - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error) - env.showMessage(`\n⚠️ Configuration failed: ${errorMessage.slice(0, 100)}...`) - env.showMessage(` This may require governance execution if deployer no longer has GOVERNOR_ROLE`) - } -} - -func.tags = Tags.pilotAllocationConfigure -func.dependencies = [ - actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.UPGRADE), - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.CONFIGURE), -] - -export default func diff --git a/packages/deployment/deploy/allocate/pilot/09_end.ts b/packages/deployment/deploy/allocate/pilot/09_end.ts deleted file mode 100644 index 750e34f17..000000000 --- a/packages/deployment/deploy/allocate/pilot/09_end.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireUpgradeExecuted } from '@graphprotocol/deployment/lib/execute-governance.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * PilotAllocation end state - deployed, upgraded, and configured - * - * Aggregate tag that ensures PilotAllocation is fully ready: - * - Proxy and implementation deployed - * - Proxy upgraded to latest implementation - * - Configured as IssuanceAllocator target - * - * Usage: - * pnpm hardhat deploy --tags pilot-allocation --network - */ -const func: DeployScriptModule = async (env) => { - requireUpgradeExecuted(env, 'PilotAllocation') - env.showMessage(`\n✓ PilotAllocation ready`) -} - -func.tags = Tags.pilotAllocation -func.dependencies = [ - actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.DEPLOY), - actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.UPGRADE), - actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.CONFIGURE), -] - -export default func diff --git a/packages/deployment/deploy/common/00_sync.ts b/packages/deployment/deploy/common/00_sync.ts index 25be17d3e..de4ff446f 100644 --- a/packages/deployment/deploy/common/00_sync.ts +++ b/packages/deployment/deploy/common/00_sync.ts @@ -1,131 +1,25 @@ -import { existsSync } from 'node:fs' - -import { - getForkNetwork, - getForkStateDir, - getIssuanceAddressBookPath, -} from '@graphprotocol/deployment/lib/address-book-utils.js' -import { - type AddressBookType, - getContractMetadata, - getContractsByAddressBook, -} from '@graphprotocol/deployment/lib/contract-registry.js' import { SpecialTags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { - type AddressBookGroup, - buildContractSpec, - type ContractSpec, - syncContractGroups, -} from '@graphprotocol/deployment/lib/sync-utils.js' -import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import { runFullSync } from '@graphprotocol/deployment/lib/sync-utils.js' import type { DeployScriptModule } from '@rocketh/core/types' -// Sync - Synchronization between on-chain state and address books +// Sync — full reconciliation between on-chain state and address books. // -// For each address book (Horizon, SubgraphService, Issuance): -// - Sync proxy implementations with on-chain state +// For every deployable contract in every address book (Horizon, SubgraphService, +// Issuance): +// - Reconcile proxy implementations with on-chain state // - Import contract addresses into rocketh deployment records // - Validate prerequisites exist on-chain - -// Helper to filter deployable contracts from registry -function getDeployableContracts(addressBook: AddressBookType) { - return getContractsByAddressBook(addressBook) - .filter(([_, metadata]) => metadata.deployable !== false) - .map(([name]) => name) -} +// +// This script is the only one tagged with `SpecialTags.SYNC`. It runs when: +// - The user invokes `npx hardhat deploy --tags sync` directly +// - The `deploy:sync` Hardhat task is run (which delegates to the above) +// +// Per-component actions sync the contracts they touch immediately before and +// after their work, so this full sync is no longer required as an automatic +// dependency on every deployment script. const func: DeployScriptModule = async (env) => { - // Get chainId from provider (will be 31337 in fork mode) - const chainIdHex = await env.network.provider.request({ method: 'eth_chainId' }) - const providerChainId = Number(chainIdHex) - - // Determine target chain ID for address book lookups - const forkNetwork = getForkNetwork() - const isForking = graph.isForkMode() - const forkChainId = graph.getForkTargetChainId() - const targetChainId = forkChainId ?? providerChainId - - // Check for common misconfiguration: localhost without FORK_NETWORK - if (providerChainId === 31337 && !forkNetwork) { - throw new Error( - `Running on localhost (chainId 31337) without FORK_NETWORK set.\n\n` + - `If you're testing against a forked network, set the environment variable:\n` + - ` export FORK_NETWORK=arbitrumSepolia\n` + - ` npx hardhat deploy --tags sync --network localhost\n\n` + - `Or use ephemeral fork mode:\n` + - ` HARDHAT_FORK=arbitrumSepolia npx hardhat deploy --tags sync`, - ) - } - - if (forkNetwork) { - const forkStateDir = getForkStateDir(env.name, forkNetwork) - env.showMessage(`\n🔄 Sync: ${forkNetwork} fork (chainId: ${targetChainId})`) - env.showMessage(` Using fork-local address books (${forkStateDir}/)`) - } else { - env.showMessage(`\n🔄 Sync: ${env.name} (chainId: ${providerChainId})`) - } - - // Get address books (automatically uses fork-local copies in fork mode) - const horizonAddressBook = graph.getHorizonAddressBook(targetChainId) - const ssAddressBook = graph.getSubgraphServiceAddressBook(targetChainId) - - // Build contract groups - const groups: AddressBookGroup[] = [] - - // --- Horizon contracts --- - const horizonContracts: ContractSpec[] = getDeployableContracts('horizon').map((name) => { - const metadata = getContractMetadata('horizon', name) - if (!metadata) throw new Error(`Contract ${name} not found in horizon registry`) - return buildContractSpec('horizon', name, metadata, horizonAddressBook, targetChainId) - }) - groups.push({ label: 'Horizon', contracts: horizonContracts, addressBook: horizonAddressBook }) - - // --- SubgraphService contracts --- - const ssContracts: ContractSpec[] = getDeployableContracts('subgraph-service').map((name) => { - const metadata = getContractMetadata('subgraph-service', name) - if (!metadata) throw new Error(`Contract ${name} not found in subgraph-service registry`) - return buildContractSpec('subgraph-service', name, metadata, ssAddressBook, targetChainId) - }) - groups.push({ label: 'SubgraphService', contracts: ssContracts, addressBook: ssAddressBook }) - - // --- Issuance contracts --- - // Show all issuance contracts from registry (even if not deployed yet) - const issuanceBookPath = getIssuanceAddressBookPath() - const issuanceAddressBook = existsSync(issuanceBookPath) ? graph.getIssuanceAddressBook(targetChainId) : null - - if (issuanceAddressBook) { - // Show all deployable issuance contracts from registry (even if not deployed yet) - const issuanceContracts: ContractSpec[] = getDeployableContracts('issuance').map((name) => { - const metadata = getContractMetadata('issuance', name) - if (!metadata) throw new Error(`Contract ${name} not found in issuance registry`) - return buildContractSpec('issuance', name, metadata, issuanceAddressBook, targetChainId) - }) - - if (issuanceContracts.length > 0) { - groups.push({ label: 'Issuance', contracts: issuanceContracts, addressBook: issuanceAddressBook }) - } - } - - // Sync all contract groups - const result = await syncContractGroups(env, groups) - - if (!result.success) { - env.showMessage(`\n❌ Sync failed: address book does not match chain state.\n`) - env.showMessage(`The following contracts are in address book but have no code on-chain:`) - env.showMessage(` ${result.failures.join(', ')}\n`) - if (isForking) { - env.showMessage(`This is likely because the fork was restarted.\n`) - env.showMessage(`To fix, reset fork state and re-run:`) - env.showMessage(` npx hardhat deploy:reset-fork --network localhost`) - } else { - env.showMessage(`Possible causes:`) - env.showMessage(` 1. Address book has incorrect addresses for this network`) - env.showMessage(` 2. Running against wrong network`) - } - process.exit(1) - } - - env.showMessage(`\n✅ Sync complete: ${result.totalSynced} contracts synced\n`) + await runFullSync(env) } func.tags = [SpecialTags.SYNC] diff --git a/packages/deployment/deploy/gip/0088/09_end.ts b/packages/deployment/deploy/gip/0088/09_end.ts new file mode 100644 index 000000000..2cb8b7fda --- /dev/null +++ b/packages/deployment/deploy/gip/0088/09_end.ts @@ -0,0 +1,114 @@ +import { PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, REWARDS_MANAGER_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { + addressEquals, + checkIssuanceAllocatorActivation, + isRewardsManagerUpgraded, +} from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { getResolvedSettingsForEnv } from '@graphprotocol/deployment/lib/deployment-config.js' +import { DeploymentActions, GoalTags, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { DeployScriptModule } from '@rocketh/core/types' +import type { PublicClient } from 'viem' + +/** + * GIP-0088,all — Full GIP-0088 deployment verification + * + * Verifies all non-optional phases are complete: + * - Upgrade: RM upgraded (supports IIssuanceTarget) + * - Eligibility: REO integrated with RM, revertOnIneligible matches config + * - Issuance: IA connected to RM, minter role granted + * + * Does NOT verify optional goals (issuance-close-guard). + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088,all --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.ALL)) return + await syncComponentsFromRegistry(env, [ + Contracts.issuance.IssuanceAllocator, + Contracts.horizon.RewardsManager, + Contracts.horizon.L2GraphToken, + Contracts.issuance.RewardsEligibilityOracleA, + ]) + const [issuanceAllocator, rewardsManager, graphToken] = requireContracts(env, [ + Contracts.issuance.IssuanceAllocator, + Contracts.horizon.RewardsManager, + Contracts.horizon.L2GraphToken, + ]) + + const client = graph.getPublicClient(env) as PublicClient + const failures: string[] = [] + + // Verify RM has been upgraded (supports IERC165) + const upgraded = await isRewardsManagerUpgraded(client, rewardsManager.address) + if (!upgraded) { + env.showMessage(`\n❌ ${Contracts.horizon.RewardsManager.name} not upgraded - run GIP-0088:upgrade,upgrade first\n`) + process.exit(1) + } + + // Verify IA activation state (issuance phase) + const activation = await checkIssuanceAllocatorActivation( + client, + issuanceAllocator.address, + rewardsManager.address, + graphToken.address, + ) + + if (!activation.iaIntegrated) failures.push('IA not integrated with RM') + if (!activation.iaMinter) failures.push('IA missing minter role') + + // Verify REO integration (eligibility phase) + const reo = env.getOrNull(Contracts.issuance.RewardsEligibilityOracleA.name) + if (reo) { + const currentOracle = (await client.readContract({ + address: rewardsManager.address as `0x${string}`, + abi: PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + functionName: 'getProviderEligibilityOracle', + })) as string + if (!addressEquals(currentOracle, reo.address)) { + failures.push('REO not integrated with RM') + } + } else { + failures.push('RewardsEligibilityOracleA not deployed') + } + + // Verify revertOnIneligible matches config + const settings = await getResolvedSettingsForEnv(env) + const desiredRevert = settings.rewardsManager.revertOnIneligible + try { + const onChainRevert = (await client.readContract({ + address: rewardsManager.address as `0x${string}`, + abi: REWARDS_MANAGER_ABI, + functionName: 'getRevertOnIneligible', + })) as boolean + if (onChainRevert !== desiredRevert) { + failures.push(`revertOnIneligible mismatch: on-chain=${onChainRevert}, config=${desiredRevert}`) + } + } catch { + failures.push('RM does not support getRevertOnIneligible (not upgraded?)') + } + + if (failures.length > 0) { + env.showMessage(`\n❌ GIP-0088 incomplete:`) + for (const f of failures) env.showMessage(` - ${f}`) + env.showMessage('') + process.exit(1) + } + + env.showMessage(`\n✅ GIP-0088 complete: all contracts deployed, upgraded, and configured\n`) +} + +func.tags = [GoalTags.GIP_0088] +func.dependencies = [ + GoalTags.GIP_0088_UPGRADE, + GoalTags.GIP_0088_ELIGIBILITY_INTEGRATE, + GoalTags.GIP_0088_ISSUANCE_CONNECT, + GoalTags.GIP_0088_ISSUANCE_ALLOCATE, +] +func.skip = async () => shouldSkipAction(DeploymentActions.ALL) + +export default func diff --git a/packages/deployment/deploy/gip/0088/10_status.ts b/packages/deployment/deploy/gip/0088/10_status.ts new file mode 100644 index 000000000..f55ac1713 --- /dev/null +++ b/packages/deployment/deploy/gip/0088/10_status.ts @@ -0,0 +1,182 @@ +import { + IISSUANCE_TARGET_INTERFACE_ID, + ISSUANCE_TARGET_ABI, + PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + SUBGRAPH_SERVICE_CLOSE_GUARD_ABI, +} from '@graphprotocol/deployment/lib/abis.js' +import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' +import { addressEquals, isRewardsManagerUpgraded } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts, type RegistryEntry } from '@graphprotocol/deployment/lib/contract-registry.js' +import { GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { showDetailedComponentStatus, showPendingGovernanceTxs } from '@graphprotocol/deployment/lib/status-detail.js' +import { getContractStatusLine, syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * GIP-0088 Status — Phase-structured deployment state display + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088 --network + */ +export default createStatusModule(GoalTags.GIP_0088, async (env) => { + // Sync the contracts this status touches via env.getOrNull so the read paths + // work without depending on a separate global sync run. + await syncComponentsFromRegistry(env, [ + Contracts.horizon.RewardsManager, + Contracts.horizon.L2GraphToken, + Contracts['subgraph-service'].SubgraphService, + Contracts.issuance.IssuanceAllocator, + Contracts.issuance.RewardsEligibilityOracleA, + Contracts.issuance.RecurringAgreementManager, + ]) + + const client = graph.getPublicClient(env) as PublicClient + const targetChainId = await getTargetChainIdFromEnv(env) + + env.showMessage('\n========== GIP-0088: Full Deployment Status ==========') + + // --- Upgrade phase --- + env.showMessage('\nUpgrade:') + + const upgradeContracts: RegistryEntry[] = [ + Contracts.horizon.RewardsManager, + Contracts.horizon.HorizonStaking, + Contracts['subgraph-service'].SubgraphService, + Contracts['subgraph-service'].DisputeManager, + Contracts.horizon.PaymentsEscrow, + Contracts.horizon.L2Curation, + Contracts.horizon.RecurringCollector, + ] + + const rm = env.getOrNull('RewardsManager') + + for (const contract of upgradeContracts) { + const ab = + contract.addressBook === 'subgraph-service' + ? graph.getSubgraphServiceAddressBook(targetChainId) + : graph.getHorizonAddressBook(targetChainId) + + const result = await getContractStatusLine(client, contract.addressBook, ab, contract.name) + env.showMessage(` ${result.line}`) + + // RM: semantic check — does the on-chain code support IIssuanceTarget? + if (contract === Contracts.horizon.RewardsManager && result.exists && rm) { + const upgraded = await isRewardsManagerUpgraded(client, rm.address) + env.showMessage(` ${upgraded ? '✓' : '✗'} implements IIssuanceTarget (${IISSUANCE_TARGET_INTERFACE_ID})`) + } + } + + // --- Eligibility phase --- + env.showMessage('\nEligibility:') + await showDetailedComponentStatus(env, Contracts.issuance.RewardsEligibilityOracleA, { showHints: false }) + + // --- Issuance phase --- + env.showMessage('\nIssuance:') + await showDetailedComponentStatus(env, Contracts.issuance.IssuanceAllocator, { showHints: false }) + + const ram = env.getOrNull('RecurringAgreementManager') + if (ram) { + await showDetailedComponentStatus(env, Contracts.issuance.RecurringAgreementManager, { showHints: false }) + } else { + env.showMessage(` ○ RecurringAgreementManager not deployed`) + } + + // --- Activation status --- + env.showMessage('\n--- Activation ---') + + // eligibility-integrate: RM.providerEligibilityOracle == REO_A + if (rm) { + const upgraded = await isRewardsManagerUpgraded(client, rm.address) + if (upgraded) { + const reo = env.getOrNull(Contracts.issuance.RewardsEligibilityOracleA.name) + const currentOracle = (await client.readContract({ + address: rm.address as `0x${string}`, + abi: PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + functionName: 'getProviderEligibilityOracle', + })) as string + + if (reo) { + const integrated = addressEquals(currentOracle, reo.address) + env.showMessage(` ${integrated ? '✓' : '✗'} eligibility-integrate: RM.providerEligibilityOracle == REO_A`) + } else { + env.showMessage(` ○ eligibility-integrate: REO_A not deployed`) + } + + // issuance-connect: RM.issuanceAllocator == IA + minter role + const ia = env.getOrNull('IssuanceAllocator') + if (ia) { + const currentIA = (await client.readContract({ + address: rm.address as `0x${string}`, + abi: ISSUANCE_TARGET_ABI, + functionName: 'getIssuanceAllocator', + })) as string + const iaConnected = addressEquals(currentIA, ia.address) + + const gt = env.getOrNull('L2GraphToken') + let isMinter = false + if (gt) { + const { GRAPH_TOKEN_ABI } = await import('@graphprotocol/deployment/lib/abis.js') + isMinter = (await client.readContract({ + address: gt.address as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'isMinter', + args: [ia.address as `0x${string}`], + })) as boolean + } + + env.showMessage( + ` ${iaConnected && isMinter ? '✓' : '✗'} issuance-connect: RM ↔ IA${!iaConnected ? ' (not connected)' : ''}${!isMinter ? ' (no minter role)' : ''}`, + ) + } else { + env.showMessage(` ○ issuance-connect: IA not deployed`) + } + + // issuance-allocate: IA.getTargetAllocation(RAM) configured + if (ram) { + env.showMessage(` ○ issuance-allocate: check via --tags ${GoalTags.GIP_0088_ISSUANCE_ALLOCATE}`) + } else { + env.showMessage(` ○ issuance-allocate: RAM not deployed`) + } + } else { + env.showMessage(' ○ RM not upgraded (activation blocked)') + } + } else { + env.showMessage(' ○ RM not in address book') + } + + // --- Optional status --- + env.showMessage('\n--- Optional (not planned) ---') + + // issuance-close-guard + const ss = env.getOrNull('SubgraphService') + if (ss) { + try { + const closeGuard = (await client.readContract({ + address: ss.address as `0x${string}`, + abi: SUBGRAPH_SERVICE_CLOSE_GUARD_ABI, + functionName: 'getBlockClosingAllocationWithActiveAgreement', + })) as boolean + env.showMessage(` ${closeGuard ? '✓' : '○'} issuance-close-guard: blockClosingAllocation = ${closeGuard}`) + } catch { + env.showMessage(` ○ issuance-close-guard: SS not upgraded`) + } + } else { + env.showMessage(` ○ issuance-close-guard: SS not deployed`) + } + + // --- Actions --- + env.showMessage('\n--- Actions ---') + env.showMessage(' Deploy & upgrade:') + env.showMessage(' --tags GIP-0088:upgrade,') + env.showMessage(' Activation (after upgrades executed):') + env.showMessage(' --tags GIP-0088:eligibility-integrate') + env.showMessage(' --tags GIP-0088:issuance-connect') + env.showMessage(' --tags GIP-0088:issuance-allocate') + env.showMessage(' Optional:') + env.showMessage(' --tags GIP-0088:issuance-close-guard') + + showPendingGovernanceTxs(env) + env.showMessage('') +}) diff --git a/packages/deployment/deploy/gip/0088/eligibility_integrate.ts b/packages/deployment/deploy/gip/0088/eligibility_integrate.ts new file mode 100644 index 000000000..47bd81f7b --- /dev/null +++ b/packages/deployment/deploy/gip/0088/eligibility_integrate.ts @@ -0,0 +1,74 @@ +import { PROVIDER_ELIGIBILITY_MANAGEMENT_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { applyConfiguration } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { createRMIntegrationCondition } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' +import { ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + +/** + * GIP-0088:eligibility-integrate — Set RewardsEligibilityOracle on RewardsManager + * + * Governance TX: RM.setProviderEligibilityOracle(REO_A) + * + * Skips if oracle already set (any value, not just REO_A) to avoid + * accidentally overriding a live oracle configuration. + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:eligibility-integrate --network + */ +export default createActionModule( + GoalTags.GIP_0088_ELIGIBILITY_INTEGRATE, + async (env) => { + await syncComponentsFromRegistry(env, [ + Contracts.issuance.RewardsEligibilityOracleA, + Contracts.horizon.RewardsManager, + ]) + const [reo, rm] = requireContracts(env, [ + Contracts.issuance.RewardsEligibilityOracleA, + Contracts.horizon.RewardsManager, + ]) + const client = graph.getPublicClient(env) as PublicClient + + // Check if oracle already set — skip if any oracle configured (don't override) + try { + const currentOracle = (await client.readContract({ + address: rm.address as `0x${string}`, + abi: PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + functionName: 'getProviderEligibilityOracle', + })) as string + + if (currentOracle !== ZERO_ADDRESS) { + const isTarget = currentOracle.toLowerCase() === reo.address.toLowerCase() + env.showMessage(`\n ${isTarget ? '✓' : '○'} RM.providerEligibilityOracle already set: ${currentOracle}`) + if (!isTarget) { + env.showMessage(` (not REO_A — skipping to avoid override)`) + } + env.showMessage('') + return + } + } catch { + // Function not available — RM not upgraded, skip + env.showMessage(`\n ○ RM does not support getProviderEligibilityOracle — skipping\n`) + return + } + + const { governor, canSign } = await canSignAsGovernor(env) + + await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { + contractName: `${Contracts.horizon.RewardsManager.name}-REO`, + contractAddress: rm.address, + canExecuteDirectly: canSign, + executor: governor, + }) + }, + { + dependencies: [ComponentTags.REWARDS_MANAGER, ComponentTags.REWARDS_ELIGIBILITY_A], + }, +) diff --git a/packages/deployment/deploy/gip/0088/issuance_allocate.ts b/packages/deployment/deploy/gip/0088/issuance_allocate.ts new file mode 100644 index 000000000..525970477 --- /dev/null +++ b/packages/deployment/deploy/gip/0088/issuance_allocate.ts @@ -0,0 +1,193 @@ +import { ACCESS_CONTROL_ENUMERABLE_ABI, SET_TARGET_ALLOCATION_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' +import { getResolvedSettingsForEnv } from '@graphprotocol/deployment/lib/deployment-config.js' +import { ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + createGovernanceTxBuilder, + executeTxBatchDirect, + saveGovernanceTx, +} from '@graphprotocol/deployment/lib/execute-governance.js' +import { formatGRT } from '@graphprotocol/deployment/lib/format.js' +import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph, read, tx } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' +import { encodeFunctionData, keccak256, parseUnits, toHex } from 'viem' + +/** + * GIP-0088:issuance-allocate — Allocate issuance to Recurring Agreement Manager + * + * Calls setTargetAllocation(RAM, allocatorMintingRate, selfMintingRate) so IA + * distributes minted GRT to RAM for agreement-based payments. + * + * Rates are read from config/.json5 (committed per-chain config). + * Skips if rate is 0 (not yet decided). + * + * Idempotent: checks on-chain state, skips if already configured. + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:issuance-allocate --network + */ +export default createActionModule( + GoalTags.GIP_0088_ISSUANCE_ALLOCATE, + async (env) => { + await syncComponentsFromRegistry(env, [ + Contracts.issuance.IssuanceAllocator, + Contracts.issuance.RecurringAgreementManager, + Contracts.horizon.RewardsManager, + ]) + + const client = graph.getPublicClient(env) as PublicClient + const readFn = read(env) + + const iaDep = env.getOrNull(Contracts.issuance.IssuanceAllocator.name) + const ramDep = env.getOrNull(Contracts.issuance.RecurringAgreementManager.name) + if (!iaDep || !ramDep) { + const missing = [!iaDep && 'IssuanceAllocator', !ramDep && 'RecurringAgreementManager'].filter(Boolean) + env.showMessage(`\n ○ Skipping RAM allocation — not deployed: ${missing.join(', ')}\n`) + return + } + const ia = iaDep + const ram = ramDep + + env.showMessage(`\n========== GIP-0088: Issuance Allocate ==========`) + env.showMessage(`IA: ${ia.address}`) + env.showMessage(`RAM: ${ram.address}`) + + // Load resolved settings + const settings = await getResolvedSettingsForEnv(env) + const allocatorMintingRate = parseUnits(settings.issuanceAllocator.ramAllocatorMintingGrtPerBlock, 18) + const selfMintingRate = parseUnits(settings.issuanceAllocator.ramSelfMintingGrtPerBlock, 18) + + if (allocatorMintingRate === 0n && selfMintingRate === 0n) { + env.showMessage('\n⚠️ RAM allocation rates not configured (both 0).') + env.showMessage(' Set ramAllocatorMintingGrtPerBlock in config/.json5') + env.showMessage(' Skipping RAM allocation configuration.\n') + return + } + + // Check current state + env.showMessage('\n📋 Checking current configuration...\n') + env.showMessage( + ` Config: allocatorMintingRate=${formatGRT(allocatorMintingRate)}, selfMintingRate=${formatGRT(selfMintingRate)}`, + ) + + let currentRamAlloc = 0n + let currentRamSelf = 0n + let ramAllocated = false + try { + const allocation = (await readFn(ia, { + functionName: 'getTargetAllocation', + args: [ram.address], + })) as { totalAllocationRate: bigint; allocatorMintingRate: bigint; selfMintingRate: bigint } + currentRamAlloc = allocation.allocatorMintingRate + currentRamSelf = allocation.selfMintingRate + ramAllocated = currentRamAlloc === allocatorMintingRate && currentRamSelf === selfMintingRate + env.showMessage( + ` On-chain: allocator=${formatGRT(currentRamAlloc)}, self=${formatGRT(currentRamSelf)} ${ramAllocated ? '✓' : '✗'}`, + ) + } catch { + env.showMessage(` RAM allocation: ✗ (not configured)`) + } + + if (ramAllocated) { + env.showMessage(`\n✅ RAM allocation already matches config\n`) + return + } + + // The allocator enforces a 100% invariant (sum of all targets == issuancePerBlock). + // RewardsManager was given 100% as self-minting in issuance-connect, so we must + // atomically rebalance: take from RM's self-minting and give to RAM, in the same batch. + const [rewardsManager] = requireContracts(env, [Contracts.horizon.RewardsManager]) + const rmAddress = rewardsManager.address as `0x${string}` + const rmAllocation = (await readFn(ia, { + functionName: 'getTargetAllocation', + args: [rmAddress], + })) as { totalAllocationRate: bigint; allocatorMintingRate: bigint; selfMintingRate: bigint } + env.showMessage( + ` RM on-chain: allocator=${formatGRT(rmAllocation.allocatorMintingRate)}, self=${formatGRT(rmAllocation.selfMintingRate)}`, + ) + + const newRamTotal = allocatorMintingRate + selfMintingRate + const currentRamTotal = currentRamAlloc + currentRamSelf + const delta = newRamTotal - currentRamTotal // signed: >0 RAM grows, <0 RAM shrinks + if (delta > 0n && rmAllocation.selfMintingRate < delta) { + env.showMessage( + `\n❌ Insufficient RM self-minting (${formatGRT(rmAllocation.selfMintingRate)}) to fund RAM increase (${formatGRT(delta)})\n`, + ) + process.exit(1) + } + const newRmSelf = rmAllocation.selfMintingRate - delta + + // Determine executor + const deployer = requireDeployer(env) + const GOVERNOR_ROLE = keccak256(toHex('GOVERNOR_ROLE')) + let deployerIsGovernor = false + try { + deployerIsGovernor = (await client.readContract({ + address: ia.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [GOVERNOR_ROLE, deployer as `0x${string}`], + })) as boolean + } catch { + // Storage not available (stale fork) — fall through to governor path + } + + const setRamData = encodeFunctionData({ + abi: SET_TARGET_ALLOCATION_ABI, + functionName: 'setTargetAllocation', + args: [ram.address as `0x${string}`, allocatorMintingRate, selfMintingRate], + }) + const setRmData = encodeFunctionData({ + abi: SET_TARGET_ALLOCATION_ABI, + functionName: 'setTargetAllocation', + args: [rmAddress, rmAllocation.allocatorMintingRate, newRmSelf], + }) + const ramLabel = `setTargetAllocation(RAM, ${formatGRT(allocatorMintingRate)}, ${formatGRT(selfMintingRate)})` + const rmLabel = `setTargetAllocation(RM, ${formatGRT(rmAllocation.allocatorMintingRate)}, ${formatGRT(newRmSelf)})` + + // Order matters: free budget first, then consume. + // delta > 0 (RAM grows): reduce RM first so default target absorbs the slack. + // delta < 0 (RAM shrinks): reduce RAM first so default target absorbs the slack. + const txs = + delta > 0n + ? [ + { data: setRmData, label: rmLabel }, + { data: setRamData, label: ramLabel }, + ] + : [ + { data: setRamData, label: ramLabel }, + { data: setRmData, label: rmLabel }, + ] + + if (deployerIsGovernor) { + env.showMessage('\n🔨 Executing as deployer...\n') + const txFn = tx(env) + for (const t of txs) { + await txFn({ account: deployer, to: ia.address, data: t.data }) + env.showMessage(` ✓ ${t.label}`) + } + env.showMessage(`\n✅ GIP-0088: Issuance Allocate — RAM allocation configured!\n`) + } else { + const { governor, canSign } = await canSignAsGovernor(env) + + const builder = await createGovernanceTxBuilder(env, `gip-0088-issuance-allocate`) + for (const t of txs) { + builder.addTx({ to: ia.address, value: '0', data: t.data }) + env.showMessage(` + ${t.label}`) + } + + if (canSign) { + env.showMessage('\n🔨 Executing configuration TX batch...\n') + await executeTxBatchDirect(env, builder, governor) + env.showMessage(`\n✅ GIP-0088: Issuance Allocate — RAM allocation configured!\n`) + } else { + saveGovernanceTx(env, builder, `GIP-0088: issuance-allocate`) + } + } + }, + { dependencies: [GoalTags.GIP_0088_ISSUANCE_CONNECT, ComponentTags.RECURRING_AGREEMENT_MANAGER] }, +) diff --git a/packages/deployment/deploy/gip/0088/issuance_close_guard.ts b/packages/deployment/deploy/gip/0088/issuance_close_guard.ts new file mode 100644 index 000000000..55f33040a --- /dev/null +++ b/packages/deployment/deploy/gip/0088/issuance_close_guard.ts @@ -0,0 +1,81 @@ +import { SUBGRAPH_SERVICE_CLOSE_GUARD_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' +import { ComponentTags, GoalTags, shouldSkipOptionalGoal } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + createGovernanceTxBuilder, + executeTxBatchDirect, + saveGovernanceTx, +} from '@graphprotocol/deployment/lib/execute-governance.js' +import { requireContract } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { DeployScriptModule } from '@rocketh/core/types' +import type { PublicClient } from 'viem' +import { encodeFunctionData } from 'viem' + +/** + * GIP-0088:issuance-close-guard — Prevent closing allocations with active agreements + * + * Optional governance TX: SS.setBlockClosingAllocationWithActiveAgreement(true) + * + * Not activated by `all` — requires explicit `--tags GIP-0088:issuance-close-guard`. + * + * Idempotent: reads on-chain state, skips if already enabled. + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:issuance-close-guard --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipOptionalGoal(GoalTags.GIP_0088_ISSUANCE_CLOSE_GUARD)) return + await syncComponentsFromRegistry(env, [Contracts['subgraph-service'].SubgraphService]) + + const client = graph.getPublicClient(env) as PublicClient + const ss = requireContract(env, Contracts['subgraph-service'].SubgraphService) + + env.showMessage(`\n========== GIP-0088: Issuance Close Guard ==========`) + env.showMessage(`${Contracts['subgraph-service'].SubgraphService.name}: ${ss.address}`) + + // Check current state + env.showMessage('\n📋 Checking current configuration...\n') + + const enabled = (await client.readContract({ + address: ss.address as `0x${string}`, + abi: SUBGRAPH_SERVICE_CLOSE_GUARD_ABI, + functionName: 'getBlockClosingAllocationWithActiveAgreement', + })) as boolean + env.showMessage(` blockClosingAllocationWithActiveAgreement: ${enabled ? '✓ true' : '✗ false'}`) + + if (enabled) { + env.showMessage(`\n✅ ${Contracts['subgraph-service'].SubgraphService.name} close guard already enabled\n`) + return + } + + const { governor, canSign } = await canSignAsGovernor(env) + + env.showMessage('\n🔨 Building configuration TX batch...\n') + + const builder = await createGovernanceTxBuilder(env, `gip-0088-issuance-close-guard`) + + const data = encodeFunctionData({ + abi: SUBGRAPH_SERVICE_CLOSE_GUARD_ABI, + functionName: 'setBlockClosingAllocationWithActiveAgreement', + args: [true], + }) + builder.addTx({ to: ss.address, value: '0', data }) + env.showMessage(` + setBlockClosingAllocationWithActiveAgreement(true)`) + + if (canSign) { + env.showMessage('\n🔨 Executing configuration TX batch...\n') + await executeTxBatchDirect(env, builder, governor) + env.showMessage(`\n✅ GIP-0088: allocation close guard enabled\n`) + } else { + saveGovernanceTx(env, builder, `GIP-0088: allocation close guard`) + } +} + +func.tags = [GoalTags.GIP_0088_ISSUANCE_CLOSE_GUARD] +func.dependencies = [ComponentTags.SUBGRAPH_SERVICE] +func.skip = async () => shouldSkipOptionalGoal(GoalTags.GIP_0088_ISSUANCE_CLOSE_GUARD) + +export default func diff --git a/packages/deployment/deploy/gip/0088/issuance_connect.ts b/packages/deployment/deploy/gip/0088/issuance_connect.ts new file mode 100644 index 000000000..30f8c170d --- /dev/null +++ b/packages/deployment/deploy/gip/0088/issuance_connect.ts @@ -0,0 +1,247 @@ +import { + GRAPH_TOKEN_ABI, + ISSUANCE_ALLOCATOR_ABI, + ISSUANCE_TARGET_ABI, + REWARDS_MANAGER_DEPRECATED_ABI, + SET_TARGET_ALLOCATION_ABI, +} from '@graphprotocol/deployment/lib/abis.js' +import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' +import { requireRewardsManagerUpgraded } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' +import { ComponentTags, GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + createGovernanceTxBuilder, + executeTxBatchDirect, + saveGovernanceTx, +} from '@graphprotocol/deployment/lib/execute-governance.js' +import { formatGRT } from '@graphprotocol/deployment/lib/format.js' +import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' +import { encodeFunctionData } from 'viem' + +/** + * GIP-0088:issuance-connect — Connect Rewards Manager to Issuance Allocator + * + * - Configure RewardsManager to use IssuanceAllocator + * - Grant minter role to IssuanceAllocator on GraphToken + * + * Idempotent: checks on-chain state, skips if already activated. + * If the provider has access to the governor key, executes directly. + * Otherwise generates governance TX file. + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:issuance-connect --network + */ +export default createActionModule( + GoalTags.GIP_0088_ISSUANCE_CONNECT, + async (env) => { + await syncComponentsFromRegistry(env, [ + Contracts.issuance.IssuanceAllocator, + Contracts.horizon.RewardsManager, + Contracts.horizon.L2GraphToken, + Contracts.issuance.DefaultAllocation, + ]) + + const deployer = requireDeployer(env) + + // Check if the provider can sign as the protocol governor + const { governor, canSign } = await canSignAsGovernor(env) + + const [issuanceAllocator, rewardsManager, graphToken, defaultAllocation] = requireContracts(env, [ + Contracts.issuance.IssuanceAllocator, + Contracts.horizon.RewardsManager, + Contracts.horizon.L2GraphToken, + Contracts.issuance.DefaultAllocation, + ]) + + const iaAddress = issuanceAllocator.address + const rmAddress = rewardsManager.address + const gtAddress = graphToken.address + const daAddress = defaultAllocation.address + + // Create viem client for direct contract calls + const client = graph.getPublicClient(env) as PublicClient + + // Check if RewardsManager supports IIssuanceTarget (has been upgraded) + // Throws error if not upgraded + await requireRewardsManagerUpgraded(client, rmAddress, env) + + const targetChainId = await getTargetChainIdFromEnv(env) + + env.showMessage(`\n========== GIP-0088: Issuance Connect ==========`) + env.showMessage(`Network: ${env.name} (chainId=${targetChainId})`) + env.showMessage(`Deployer: ${deployer}`) + env.showMessage(`Protocol Governor (from Controller): ${governor}`) + env.showMessage(`${Contracts.issuance.IssuanceAllocator.name}: ${iaAddress}`) + env.showMessage(`${Contracts.horizon.RewardsManager.name}: ${rmAddress}`) + env.showMessage(`${Contracts.horizon.L2GraphToken.name}: ${gtAddress}\n`) + + // Check current state + env.showMessage('📋 Checking current activation state...\n') + + const checks = { + iaIntegrated: false, + iaMinter: false, + } + + // Check RM.getIssuanceAllocator() == IA + const currentIA = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: ISSUANCE_TARGET_ABI, + functionName: 'getIssuanceAllocator', + })) as string + checks.iaIntegrated = currentIA.toLowerCase() === iaAddress.toLowerCase() + env.showMessage(` IA integrated: ${checks.iaIntegrated ? '✓' : '✗'} (current: ${currentIA})`) + + // Check GraphToken.isMinter(IA) + checks.iaMinter = (await client.readContract({ + address: gtAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'isMinter', + args: [iaAddress as `0x${string}`], + })) as boolean + env.showMessage(` IA minter: ${checks.iaMinter ? '✓' : '✗'}`) + + // Check RM allocation on IA + let rmAllocationOk = false + try { + const rmAllocation = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getTargetAllocation', + args: [rmAddress as `0x${string}`], + })) as { totalAllocationRate: bigint; allocatorMintingRate: bigint; selfMintingRate: bigint } + const iaRate = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getIssuancePerBlock', + })) as bigint + rmAllocationOk = + rmAllocation.allocatorMintingRate === 0n && rmAllocation.selfMintingRate === iaRate && iaRate > 0n + env.showMessage( + ` RM allocation: ${rmAllocationOk ? '✓' : '✗'} (self: ${formatGRT(rmAllocation.selfMintingRate)}, allocator: ${formatGRT(rmAllocation.allocatorMintingRate)})`, + ) + } catch { + env.showMessage(` RM allocation: ✗ (not set)`) + } + + // All checks passed? + if (checks.iaIntegrated && checks.iaMinter && rmAllocationOk) { + env.showMessage(`\n✅ RM already connected to IssuanceAllocator\n`) + return + } + + // Migration invariant: IA rate must match RM rate before connection + if (!checks.iaIntegrated) { + const rmRate = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: REWARDS_MANAGER_DEPRECATED_ABI, + functionName: 'issuancePerBlock', + })) as bigint + + const iaRate = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getIssuancePerBlock', + })) as bigint + + if (iaRate !== rmRate) { + env.showMessage( + `\n❌ Migration invariant failed: IA.issuancePerBlock (${formatGRT(iaRate)}) != RM.issuancePerBlock (${formatGRT(rmRate)})`, + ) + env.showMessage(` IA must have the same overall rate as RM before connection.\n`) + process.exit(1) + } + + env.showMessage(` Migration invariant: ✓ IA rate == RM rate (${formatGRT(iaRate)})`) + } + + // Build TX batch — order: + // 1. IA.setTargetAllocation(RM, 0, rate) — register RM in IA first + // 2. RM.setIssuanceAllocator(IA) — flip RM to read from a fully-configured IA + // 3. GraphToken.addMinter(IA) — grant IA the minter role + // 4. IA.setDefaultTarget(DA) — install safety-net default + // Conceptually: configure IA's view of RM before RM starts reading from IA. Atomic + // within the batch either way, but this avoids a transient where RM is wired to an + // IA that has no allocation entry for it. + env.showMessage('\n🔨 Building activation TX batch...\n') + + const builder = await createGovernanceTxBuilder(env, `gip-0088-issuance-connect`) + + // 1. IA.setTargetAllocation(RM, 0, rate) — RM as 100% self-minting target + if (!rmAllocationOk) { + const iaRate = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getIssuancePerBlock', + })) as bigint + const data = encodeFunctionData({ + abi: SET_TARGET_ALLOCATION_ABI, + functionName: 'setTargetAllocation', + args: [rmAddress as `0x${string}`, 0n, iaRate], + }) + builder.addTx({ to: iaAddress, value: '0', data }) + env.showMessage(` + IA.setTargetAllocation(RM, 0, ${formatGRT(iaRate)})`) + } + + // 2. RM.setIssuanceAllocator(IA) — RM accepts IA as its allocator + if (!checks.iaIntegrated) { + const data = encodeFunctionData({ + abi: ISSUANCE_TARGET_ABI, + functionName: 'setIssuanceAllocator', + args: [iaAddress as `0x${string}`], + }) + builder.addTx({ to: rmAddress, value: '0', data }) + env.showMessage(` + RewardsManager.setIssuanceAllocator(${iaAddress})`) + } + + // 3. GraphToken.addMinter(IA) — IA needs minter role for allocator-minting + if (!checks.iaMinter) { + const data = encodeFunctionData({ + abi: GRAPH_TOKEN_ABI, + functionName: 'addMinter', + args: [iaAddress as `0x${string}`], + }) + builder.addTx({ to: gtAddress, value: '0', data }) + env.showMessage(` + GraphToken.addMinter(${iaAddress})`) + } + + // 4. IA.setDefaultTarget(DA) — safety net for unallocated issuance + let defaultTargetOk = false + try { + const currentDefault = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getTargetAt', + args: [0n], + })) as string + defaultTargetOk = currentDefault.toLowerCase() === daAddress.toLowerCase() + } catch { + // No targets yet + } + env.showMessage(` DA default target: ${defaultTargetOk ? '✓' : '✗'}`) + + if (!defaultTargetOk) { + const data = encodeFunctionData({ + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'setDefaultTarget', + args: [daAddress as `0x${string}`], + }) + builder.addTx({ to: iaAddress, value: '0', data }) + env.showMessage(` + IA.setDefaultTarget(${daAddress})`) + } + + if (canSign) { + env.showMessage('\n🔨 Executing activation TX batch...\n') + await executeTxBatchDirect(env, builder, governor) + env.showMessage(`\n✅ GIP-0088: Issuance Connect — RM connected to IssuanceAllocator!\n`) + } else { + saveGovernanceTx(env, builder, `GIP-0088: issuance-connect`) + } + }, + { dependencies: [ComponentTags.ISSUANCE_ALLOCATOR, ComponentTags.DEFAULT_ALLOCATION, ComponentTags.REWARDS_MANAGER] }, +) diff --git a/packages/deployment/deploy/gip/0088/upgrade/01_deploy.ts b/packages/deployment/deploy/gip/0088/upgrade/01_deploy.ts new file mode 100644 index 000000000..010564515 --- /dev/null +++ b/packages/deployment/deploy/gip/0088/upgrade/01_deploy.ts @@ -0,0 +1,47 @@ +import { + ComponentTags, + DeploymentActions, + GoalTags, + shouldSkipAction, +} from '@graphprotocol/deployment/lib/deployment-tags.js' +import type { DeployScriptModule } from '@rocketh/core/types' + +/** + * GIP-0088:upgrade — Deploy ALL contracts and implementations + * + * Deploys everything required for GIP-0088 in one step: + * - New implementations for existing proxies (RM, HS, SS, DM, PE, L2Curation) + * - New contracts (RC, IA, DA, Reclaim, RAM, REO A/B) + * + * The eligibility and issuance phases start from configure, not deploy. + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:upgrade,deploy --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + env.showMessage('\n✓ GIP-0088 upgrade: all contracts and implementations deployed\n') +} + +func.tags = [GoalTags.GIP_0088_UPGRADE] +func.dependencies = [ + // New implementations for existing proxies + ComponentTags.REWARDS_MANAGER, + ComponentTags.HORIZON_STAKING, + ComponentTags.SUBGRAPH_SERVICE, + ComponentTags.DISPUTE_MANAGER, + ComponentTags.PAYMENTS_ESCROW, + ComponentTags.L2_CURATION, + // New contracts (proxy + implementation) + ComponentTags.RECURRING_COLLECTOR, + ComponentTags.ISSUANCE_ALLOCATOR, + ComponentTags.DIRECT_ALLOCATION_IMPL, + ComponentTags.DEFAULT_ALLOCATION, + ComponentTags.REWARDS_RECLAIM, + ComponentTags.RECURRING_AGREEMENT_MANAGER, + ComponentTags.REWARDS_ELIGIBILITY_A, + ComponentTags.REWARDS_ELIGIBILITY_B, +] +func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) + +export default func diff --git a/packages/deployment/deploy/gip/0088/upgrade/02_configure.ts b/packages/deployment/deploy/gip/0088/upgrade/02_configure.ts new file mode 100644 index 000000000..94e431e52 --- /dev/null +++ b/packages/deployment/deploy/gip/0088/upgrade/02_configure.ts @@ -0,0 +1,40 @@ +import { + ComponentTags, + DeploymentActions, + GoalTags, + shouldSkipAction, +} from '@graphprotocol/deployment/lib/deployment-tags.js' +import type { DeployScriptModule } from '@rocketh/core/types' + +/** + * GIP-0088:upgrade — Configure all contracts (deployer-only) + * + * Checkpoint: component 04_configure scripts do the work. + * + * Only items the deployer can perform run here. Items that require GOVERNOR_ROLE + * on contracts the deployer doesn't yet control (e.g. RC.setPauseGuardian, RM + * integration with Reclaim, deferred role grants on new contracts) are bundled + * into the upgrade governance batch by `04_upgrade.ts`. RC's `04_configure` + * is read-only — it just reports state. + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:upgrade,configure --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.CONFIGURE)) return + env.showMessage('\n✓ GIP-0088 upgrade: contracts configured\n') +} + +func.tags = [GoalTags.GIP_0088_UPGRADE] +func.dependencies = [ + ComponentTags.RECURRING_COLLECTOR, + ComponentTags.ISSUANCE_ALLOCATOR, + ComponentTags.DEFAULT_ALLOCATION, + ComponentTags.REWARDS_RECLAIM, + ComponentTags.RECURRING_AGREEMENT_MANAGER, + ComponentTags.REWARDS_ELIGIBILITY_A, + ComponentTags.REWARDS_ELIGIBILITY_B, +] +func.skip = async () => shouldSkipAction(DeploymentActions.CONFIGURE) + +export default func diff --git a/packages/deployment/deploy/gip/0088/upgrade/03_transfer.ts b/packages/deployment/deploy/gip/0088/upgrade/03_transfer.ts new file mode 100644 index 000000000..272aa8f8c --- /dev/null +++ b/packages/deployment/deploy/gip/0088/upgrade/03_transfer.ts @@ -0,0 +1,39 @@ +import { + ComponentTags, + DeploymentActions, + GoalTags, + shouldSkipAction, +} from '@graphprotocol/deployment/lib/deployment-tags.js' +import type { DeployScriptModule } from '@rocketh/core/types' + +/** + * GIP-0088:upgrade — Transfer governance of all new contracts to protocol governor + * + * Checkpoint: component transfer scripts do the work. + * Covers all new contracts that were deployed with deployer as governor. + * + * Must run AFTER configure (deployer needs GOVERNOR_ROLE to configure) + * and BEFORE upgrade (governance must own proxies before upgrade TXs). + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:upgrade,transfer --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.TRANSFER)) return + env.showMessage('\n✓ GIP-0088 upgrade: governance transferred\n') +} + +func.tags = [GoalTags.GIP_0088_UPGRADE] +func.dependencies = [ + ComponentTags.RECURRING_COLLECTOR, + ComponentTags.ISSUANCE_ALLOCATOR, + ComponentTags.DEFAULT_ALLOCATION, + ComponentTags.RECURRING_AGREEMENT_MANAGER, + ComponentTags.REWARDS_RECLAIM, + ComponentTags.REWARDS_ELIGIBILITY_A, + ComponentTags.REWARDS_ELIGIBILITY_B, + ComponentTags.REWARDS_ELIGIBILITY_MOCK, +] +func.skip = async () => shouldSkipAction(DeploymentActions.TRANSFER) + +export default func diff --git a/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts b/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts new file mode 100644 index 000000000..2dbc35825 --- /dev/null +++ b/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts @@ -0,0 +1,453 @@ +import { + ACCESS_CONTROL_ENUMERABLE_ABI, + ISSUANCE_ALLOCATOR_ABI, + ISSUANCE_TARGET_ABI, + RECURRING_COLLECTOR_PAUSE_ABI, + REWARDS_MANAGER_ABI, + REWARDS_MANAGER_DEPRECATED_ABI, +} from '@graphprotocol/deployment/lib/abis.js' +import type { AnyAddressBookOps } from '@graphprotocol/deployment/lib/address-book-ops.js' +import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' +import { checkConfigurationStatus } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { getREOConditions } from '@graphprotocol/deployment/lib/contract-checks.js' +import { + type AddressBookType, + CONTRACT_REGISTRY, + type ContractMetadata, + Contracts, +} from '@graphprotocol/deployment/lib/contract-registry.js' +import { canSignAsGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' +import { getResolvedSettingsForEnv, type ResolvedSettings } from '@graphprotocol/deployment/lib/deployment-config.js' +import { DeploymentActions, GoalTags, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + createGovernanceTxBuilder, + executeTxBatchDirect, + saveGovernanceTx, +} from '@graphprotocol/deployment/lib/execute-governance.js' +import { formatGRT } from '@graphprotocol/deployment/lib/format.js' +import { + checkDefaultAllocationConfigured, + checkIAConfigured, + checkRAMConfigured, + checkReclaimRMIntegration, + checkReclaimRoles, + checkRMRevertOnIneligible, +} from '@graphprotocol/deployment/lib/preconditions.js' +import { runFullSync } from '@graphprotocol/deployment/lib/sync-utils.js' +import type { TxBuilder } from '@graphprotocol/deployment/lib/tx-builder.js' +import { buildUpgradeTxs } from '@graphprotocol/deployment/lib/upgrade-implementation.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { DeployScriptModule, Environment } from '@rocketh/core/types' +import type { PublicClient } from 'viem' +import { encodeFunctionData } from 'viem' + +/** + * GIP-0088:upgrade — Build the governance batch + * + * Single goal: assemble one TX batch that advances the deployment past the + * governance boundary. The batch contains three groups, each of which skips + * items already on-chain: + * + * 1. Proxy upgrades — every deployable proxy with a pendingImplementation + * 2. Existing-contract config — RC.setPauseGuardian, RM.setDefaultReclaimAddress + * 3. Deferred new-contract config — IA/DA/RAM/Reclaim/REO role grants and + * params that the deployer couldn't perform (no GOVERNOR_ROLE) or that + * depend on RM being upgraded + * + * Each helper takes the builder, adds zero or more TXs, and returns the count + * it added. The orchestrator just sums them, prints the result, and either + * executes or saves the batch. + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:upgrade,upgrade --network + * pnpm hardhat deploy:execute-governance --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.UPGRADE)) return + + // The orchestration batch reads every deployable contract across all three + // address books, so we need a full sync first rather than a per-component one. + await runFullSync(env) + + const targetChainId = await getTargetChainIdFromEnv(env) + const { governor, canSign } = await canSignAsGovernor(env) + const pauseGuardian = await getPauseGuardian(env) + const client = graph.getPublicClient(env) as PublicClient + + env.showMessage('\n========== GIP-0088 Upgrade: Proxy Upgrades ==========\n') + + const builder = await createGovernanceTxBuilder(env, 'gip-0088-upgrades', { + name: 'GIP-0088 Proxy Upgrades', + description: 'Upgrade all proxy contracts with pending implementations', + }) + + const proxyCount = await collectProxyUpgrades(env, builder, targetChainId) + + const settings = await getResolvedSettingsForEnv(env) + + env.showMessage('\nOutstanding configuration:') + const existingCount = await collectExistingContractConfig(env, builder, client, pauseGuardian, settings) + const newCount = await collectDeferredNewContractConfig(env, builder, client, targetChainId, governor, pauseGuardian) + + const total = proxyCount + existingCount + newCount + if (total === 0) { + env.showMessage(' No pending upgrades found\n') + return + } + + if (canSign) { + env.showMessage('\n🔨 Executing upgrade TX batch...\n') + await executeTxBatchDirect(env, builder, governor) + env.showMessage('\n✅ GIP-0088 Upgrade: All proxy upgrades executed\n') + } else { + saveGovernanceTx(env, builder, 'GIP-0088 Proxy Upgrades') + } +} + +func.tags = [GoalTags.GIP_0088_UPGRADE] +func.skip = async () => shouldSkipAction(DeploymentActions.UPGRADE) + +export default func + +// ============================================================================ +// Group 1 — Proxy upgrades +// ============================================================================ + +/** + * Iterate every deployable proxy in the registry. For each one with a + * pendingImplementation in its address book, add the proxy upgrade TX. + */ +async function collectProxyUpgrades(env: Environment, builder: TxBuilder, targetChainId: number): Promise { + let added = 0 + const addressBooks: AddressBookType[] = ['horizon', 'subgraph-service', 'issuance'] + for (const abType of addressBooks) { + const bookRegistry = CONTRACT_REGISTRY[abType] + const ab: AnyAddressBookOps = + abType === 'subgraph-service' + ? graph.getSubgraphServiceAddressBook(targetChainId) + : abType === 'issuance' + ? graph.getIssuanceAddressBook(targetChainId) + : graph.getHorizonAddressBook(targetChainId) + + for (const [name, metadata] of Object.entries(bookRegistry)) { + const meta = metadata as ContractMetadata + if (!meta.deployable || !meta.proxyType) continue + if (!ab.entryExists(name)) continue + const entry = ab.getEntry(name) + + // Skip contracts with no pending implementation unless they have a + // shared implementation that might have changed (auto-detected by buildUpgradeTxs) + if (!entry?.pendingImplementation?.address && !meta.sharedImplementation) continue + + // Derive implementationName from sharedImplementation (e.g. 'DirectAllocation_Implementation' → 'DirectAllocation') + const implementationName = meta.sharedImplementation?.replace(/_Implementation$/, '') + + const result = await buildUpgradeTxs( + env, + { + contractName: name, + proxyType: meta.proxyType, + proxyAdminName: meta.proxyAdminName, + addressBook: abType, + implementationName, + }, + builder, + ) + if (result.upgraded) added++ + } + } + return added +} + +// ============================================================================ +// Group 2 — Existing contract config (RC, RM) +// ============================================================================ + +/** + * Bundle the few governance-only configure items on contracts that already + * existed before this deployment (typically the deployer does not hold + * GOVERNOR_ROLE on them — true on networks where RM was deployed by separate + * horizon-Ignition infrastructure; the dynamic role check is the source of truth): + * + * - RC.setPauseGuardian + * - RM.setDefaultReclaimAddress (only when RM has been upgraded) + * - RM.setRevertOnIneligible (driven by config; only when RM has been upgraded) + */ +async function collectExistingContractConfig( + env: Environment, + builder: TxBuilder, + client: PublicClient, + pauseGuardian: string, + settings: ResolvedSettings, +): Promise { + let added = 0 + + // RC.setPauseGuardian + const rc = env.getOrNull(Contracts.horizon.RecurringCollector.name) + if (rc) { + const isGuardian = (await client.readContract({ + address: rc.address as `0x${string}`, + abi: RECURRING_COLLECTOR_PAUSE_ABI, + functionName: 'pauseGuardians', + args: [pauseGuardian as `0x${string}`], + })) as boolean + if (!isGuardian) { + builder.addTx({ + to: rc.address, + value: '0', + data: encodeFunctionData({ + abi: RECURRING_COLLECTOR_PAUSE_ABI, + functionName: 'setPauseGuardian', + args: [pauseGuardian as `0x${string}`, true], + }), + }) + env.showMessage(` + ${Contracts.horizon.RecurringCollector.name}.setPauseGuardian(${pauseGuardian})`) + added++ + } + } + + // RM.setDefaultReclaimAddress — only after RM upgrade lands in the same batch + const reclaim = env.getOrNull(Contracts.issuance.ReclaimedRewards.name) + const rm = env.getOrNull(Contracts.horizon.RewardsManager.name) + if (reclaim && rm) { + const reclaimRMCheck = await checkReclaimRMIntegration(client, rm.address, reclaim.address) + if (!reclaimRMCheck.done && reclaimRMCheck.reason !== 'RM not upgraded') { + builder.addTx({ + to: rm.address, + value: '0', + data: encodeFunctionData({ + abi: REWARDS_MANAGER_ABI, + functionName: 'setDefaultReclaimAddress', + args: [reclaim.address as `0x${string}`], + }), + }) + env.showMessage(` + ${Contracts.horizon.RewardsManager.name}.setDefaultReclaimAddress(${reclaim.address})`) + added++ + } + } + + // RM.setRevertOnIneligible — driven by config; only after RM upgrade lands + if (rm) { + const desiredRevert = settings.rewardsManager.revertOnIneligible + const revertCheck = await checkRMRevertOnIneligible(client, rm.address, desiredRevert) + if (!revertCheck.done && revertCheck.reason !== 'RM not upgraded') { + builder.addTx({ + to: rm.address, + value: '0', + data: encodeFunctionData({ + abi: REWARDS_MANAGER_ABI, + functionName: 'setRevertOnIneligible', + args: [desiredRevert], + }), + }) + env.showMessage(` + ${Contracts.horizon.RewardsManager.name}.setRevertOnIneligible(${desiredRevert})`) + added++ + } + } + + return added +} + +// ============================================================================ +// Group 3 — Deferred new-contract config (IA, DA, RAM, Reclaim, REO A/B) +// ============================================================================ + +/** + * Bundle the configure items on new contracts that the deployer couldn't + * perform during `02_configure` because it lacks `GOVERNOR_ROLE` on the + * proxy (typical when forking an existing deployment whose proxies were + * already transferred). + */ +async function collectDeferredNewContractConfig( + env: Environment, + builder: TxBuilder, + client: PublicClient, + targetChainId: number, + governor: string, + pauseGuardian: string, +): Promise { + const grantHelper = createRoleGrantHelper(env, builder, client) + let added = 0 + + // IA: rate + roles + const ia = env.getOrNull(Contracts.issuance.IssuanceAllocator.name) + const rm = env.getOrNull(Contracts.horizon.RewardsManager.name) + if (ia && rm) { + const iaCheck = await checkIAConfigured(client, ia.address, rm.address, governor, pauseGuardian) + if (!iaCheck.done && iaCheck.reason !== 'RM.issuancePerBlock is 0') { + const rmRate = (await client.readContract({ + address: rm.address as `0x${string}`, + abi: REWARDS_MANAGER_DEPRECATED_ABI, + functionName: 'issuancePerBlock', + })) as bigint + const iaRate = (await client.readContract({ + address: ia.address as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getIssuancePerBlock', + })) as bigint + // The outer iaCheck already returns when RM rate is 0, so rmRate > 0n here. + if (iaRate !== rmRate) { + builder.addTx({ + to: ia.address, + value: '0', + data: encodeFunctionData({ + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'setIssuancePerBlock', + args: [rmRate], + }), + }) + env.showMessage(` + IA.setIssuancePerBlock(${formatGRT(rmRate)})`) + added++ + } + added += await grantHelper(ia.address, 'IA', 'GOVERNOR_ROLE', governor, 'governor') + added += await grantHelper(ia.address, 'IA', 'PAUSE_ROLE', pauseGuardian, 'pauseGuardian') + } + } + + // DA: roles + const da = env.getOrNull(Contracts.issuance.DefaultAllocation.name) + if (da) { + const daCheck = await checkDefaultAllocationConfigured(client, da.address, governor, pauseGuardian) + if (!daCheck.done) { + added += await grantHelper(da.address, 'DA', 'GOVERNOR_ROLE', governor, 'governor') + added += await grantHelper(da.address, 'DA', 'PAUSE_ROLE', pauseGuardian, 'pauseGuardian') + } + } + + // RAM: roles + setIssuanceAllocator + const ram = env.getOrNull(Contracts.issuance.RecurringAgreementManager.name) + const rcDep = env.getOrNull(Contracts.horizon.RecurringCollector.name) + const ss = env.getOrNull(Contracts['subgraph-service'].SubgraphService.name) + if (ram && rcDep && ss) { + const ramCheck = await checkRAMConfigured( + client, + ram.address, + rcDep.address, + ss.address, + ia?.address ?? '', + governor, + pauseGuardian, + ) + if (!ramCheck.done) { + added += await grantHelper(ram.address, 'RAM', 'COLLECTOR_ROLE', rcDep.address, 'RC') + added += await grantHelper(ram.address, 'RAM', 'DATA_SERVICE_ROLE', ss.address, 'SS') + added += await grantHelper(ram.address, 'RAM', 'GOVERNOR_ROLE', governor, 'governor') + added += await grantHelper(ram.address, 'RAM', 'PAUSE_ROLE', pauseGuardian, 'pauseGuardian') + if (ia) { + try { + const currentIA = (await client.readContract({ + address: ram.address as `0x${string}`, + abi: ISSUANCE_TARGET_ABI, + functionName: 'getIssuanceAllocator', + })) as string + if (currentIA.toLowerCase() !== ia.address.toLowerCase()) { + builder.addTx({ + to: ram.address, + value: '0', + data: encodeFunctionData({ + abi: ISSUANCE_TARGET_ABI, + functionName: 'setIssuanceAllocator', + args: [ia.address as `0x${string}`], + }), + }) + env.showMessage(` + RAM.setIssuanceAllocator(${ia.address})`) + added++ + } + } catch { + /* getter not available */ + } + } + } + } + + // Reclaim: roles only — RM integration is handled by collectExistingContractConfig + const reclaim = env.getOrNull(Contracts.issuance.ReclaimedRewards.name) + if (reclaim) { + const reclaimRoles = await checkReclaimRoles(client, reclaim.address, governor, pauseGuardian) + if (!reclaimRoles.done) { + added += await grantHelper(reclaim.address, 'Reclaim', 'GOVERNOR_ROLE', governor, 'governor') + added += await grantHelper(reclaim.address, 'Reclaim', 'PAUSE_ROLE', pauseGuardian, 'pauseGuardian') + } + } + + // REO A/B: params + roles. Driven by the same condition list as `04_configure`. + const issuanceBook = graph.getIssuanceAddressBook(targetChainId) + if (issuanceBook.entryExists('NetworkOperator')) { + const reoConditions = await getREOConditions(env) + for (const [label, entry] of [ + ['REO-A', Contracts.issuance.RewardsEligibilityOracleA], + ['REO-B', Contracts.issuance.RewardsEligibilityOracleB], + ] as const) { + const reoDep = env.getOrNull(entry.name) + if (!reoDep) continue + const reoConfig = await checkConfigurationStatus(client, reoDep.address, reoConditions) + if (reoConfig.allOk) continue + for (let i = 0; i < reoConditions.length; i++) { + if (reoConfig.conditions[i].ok) continue + const cond = reoConditions[i] + if (cond.type === 'role') { + added += await grantHelper(reoDep.address, label, cond.roleGetter, cond.targetAccount, cond.description) + } else { + builder.addTx({ + to: reoDep.address, + value: '0', + data: encodeFunctionData({ + abi: cond.abi as readonly unknown[], + functionName: cond.setter, + args: [cond.target], + }), + }) + env.showMessage(` + ${label}.${cond.setter}(${cond.target})`) + added++ + } + } + } + } + + return added +} + +/** + * Returns a closure that, when called, adds a `grantRole` TX if the role is + * not already held. Returns 1 if a TX was added, 0 otherwise. + */ +function createRoleGrantHelper(env: Environment, builder: TxBuilder, client: PublicClient) { + return async function addRoleGrantIfNeeded( + contractAddr: string, + contractName: string, + roleName: string, + account: string, + accountLabel: string, + ): Promise { + try { + const role = (await client.readContract({ + address: contractAddr as `0x${string}`, + abi: [ + { inputs: [], name: roleName, outputs: [{ type: 'bytes32' }], stateMutability: 'view', type: 'function' }, + ], + functionName: roleName, + })) as `0x${string}` + const has = (await client.readContract({ + address: contractAddr as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [role, account as `0x${string}`], + })) as boolean + if (has) return 0 + builder.addTx({ + to: contractAddr, + value: '0', + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [role, account as `0x${string}`], + }), + }) + env.showMessage(` + ${contractName}.grantRole(${roleName}, ${accountLabel})`) + return 1 + } catch { + /* role getter not available — skip */ + return 0 + } + } +} diff --git a/packages/deployment/deploy/gip/0088/upgrade/10_status.ts b/packages/deployment/deploy/gip/0088/upgrade/10_status.ts new file mode 100644 index 000000000..352b04d4f --- /dev/null +++ b/packages/deployment/deploy/gip/0088/upgrade/10_status.ts @@ -0,0 +1,334 @@ +import { IISSUANCE_TARGET_INTERFACE_ID } from '@graphprotocol/deployment/lib/abis.js' +import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' +import { checkConfigurationStatus } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { + getREOConditions, + getREOTransferGovernanceConditions, + isRewardsManagerUpgraded, +} from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts, type RegistryEntry } from '@graphprotocol/deployment/lib/contract-registry.js' +import { getGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' +import { getResolvedSettingsForEnv } from '@graphprotocol/deployment/lib/deployment-config.js' +import { ComponentTags, GoalTags, noTagsRequested } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { getDeployer, getProxyAdminAddress } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { + checkDefaultAllocationConfigured, + checkDeployerRevoked, + checkIAConfigured, + checkProxyAdminTransferred, + checkRAMConfigured, + checkReclaimRMIntegration, + checkReclaimRoles, + checkRMRevertOnIneligible, +} from '@graphprotocol/deployment/lib/preconditions.js' +import { showDetailedComponentStatus, showPendingGovernanceTxs } from '@graphprotocol/deployment/lib/status-detail.js' +import { checkAllProxyStates, getContractStatusLine, runFullSync } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { DeployScriptModule } from '@rocketh/core/types' +import type { PublicClient } from 'viem' + +/** + * GIP-0088:upgrade status — full deployment state with next-step guidance + * + * Usage: + * pnpm hardhat deploy --tags GIP-0088:upgrade --network + */ +const func: DeployScriptModule = async (env) => { + if (noTagsRequested()) return + + // The upgrade status reads every contract in every address book — easier to + // run a full sync than to enumerate them. + await runFullSync(env) + + const client = graph.getPublicClient(env) as PublicClient + const targetChainId = await getTargetChainIdFromEnv(env) + + env.showMessage('\n========== GIP-0088 Upgrade ==========') + + // --- Proxy upgrades --- + env.showMessage('\nProxy upgrades:') + + const upgradeContracts: RegistryEntry[] = [ + Contracts.horizon.RewardsManager, + Contracts.horizon.HorizonStaking, + Contracts['subgraph-service'].SubgraphService, + Contracts['subgraph-service'].DisputeManager, + Contracts.horizon.PaymentsEscrow, + Contracts.horizon.L2Curation, + ] + + const rm = env.getOrNull('RewardsManager') + + for (const contract of upgradeContracts) { + const ab = + contract.addressBook === 'subgraph-service' + ? graph.getSubgraphServiceAddressBook(targetChainId) + : graph.getHorizonAddressBook(targetChainId) + + const result = await getContractStatusLine(client, contract.addressBook, ab, contract.name) + env.showMessage(` ${result.line}`) + + if (contract === Contracts.horizon.RewardsManager && result.exists && rm) { + const upgraded = await isRewardsManagerUpgraded(client, rm.address) + env.showMessage(` ${upgraded ? '✓' : '✗'} implements IIssuanceTarget (${IISSUANCE_TARGET_INTERFACE_ID})`) + } + } + + const { anyCodeChanged, anyPending } = checkAllProxyStates(targetChainId) + + // --- New contracts --- + env.showMessage('\nNew contracts:') + await showDetailedComponentStatus(env, Contracts.horizon.RecurringCollector, { showHints: false }) + await showDetailedComponentStatus(env, Contracts.issuance.IssuanceAllocator, { showHints: false }) + await showDetailedComponentStatus(env, Contracts.issuance.DefaultAllocation, { showHints: false }) + await showDetailedComponentStatus(env, Contracts.issuance.RecurringAgreementManager, { showHints: false }) + await showDetailedComponentStatus(env, Contracts.issuance.ReclaimedRewards, { showHints: false }) + await showDetailedComponentStatus(env, Contracts.issuance.RewardsEligibilityOracleA, { showHints: false }) + + // --- Next step --- + // Uses the same precondition checks as the action scripts (shared code, not copies) + const ia = env.getOrNull('IssuanceAllocator') + const da = env.getOrNull('DefaultAllocation') + const reoA = env.getOrNull('RewardsEligibilityOracleA') + const reoB = env.getOrNull('RewardsEligibilityOracleB') + const ram = env.getOrNull('RecurringAgreementManager') + const reclaim = env.getOrNull('ReclaimedRewards') + const rc = env.getOrNull('RecurringCollector') + const ss = env.getOrNull('SubgraphService') + + const anyNewContractMissing = !ia || !da || !reoA || !reoB || !ram || !reclaim + + if (anyNewContractMissing || !rm || (anyCodeChanged && !anyPending)) { + env.showMessage(`\n → Next: --tags GIP-0088:upgrade,deploy`) + const missing = [ + !ia && 'IssuanceAllocator', + !da && 'DefaultAllocation', + !reoA && 'REO-A', + !reoB && 'REO-B', + !ram && 'RAM', + !reclaim && 'Reclaim', + !rm && 'RM', + ].filter(Boolean) + if (missing.length > 0) env.showMessage(` Missing: ${missing.join(', ')}`) + if (anyCodeChanged && !anyPending) env.showMessage(` Code changed without pending implementation`) + } else { + const governor = await getGovernor(env) + const pauseGuardian = await getPauseGuardian(env) + + // Deployer address: from namedAccounts when key is loaded, otherwise infer + // from ProxyAdmin owner — if not governor, it's the deployer. + let deployer = getDeployer(env) + if (!deployer) { + try { + const proxyAdminAddr = await getProxyAdminAddress(client, ia.address) + const owner = (await client.readContract({ + address: proxyAdminAddr as `0x${string}`, + abi: [ + { inputs: [], name: 'owner', outputs: [{ type: 'address' }], stateMutability: 'view', type: 'function' }, + ], + functionName: 'owner', + })) as string + if (owner.toLowerCase() !== governor.toLowerCase()) deployer = owner + } catch { + // ProxyAdmin not readable — deployer stays undefined + } + } + + // Check configure state + // When deployer is available, classify issues as deployer-fixable vs deferred. + // When not (status-only run without deploy key), all issues are unclassified. + const configIssues: string[] = [] + const deferredIssues: string[] = [] + + // Helper: check if deployer has GOVERNOR_ROLE on a contract + // Returns false when deployer is not configured (status-only run without deploy key) + async function deployerHasGovernorRole(contractAddress: string): Promise { + if (!deployer) return false + try { + const role = (await client.readContract({ + address: contractAddress as `0x${string}`, + abi: [ + { + inputs: [], + name: 'GOVERNOR_ROLE', + outputs: [{ type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'GOVERNOR_ROLE', + })) as `0x${string}` + return (await client.readContract({ + address: contractAddress as `0x${string}`, + abi: [ + { + inputs: [{ type: 'bytes32' }, { type: 'address' }], + name: 'hasRole', + outputs: [{ type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'hasRole', + args: [role, deployer as `0x${string}`], + })) as boolean + } catch { + return false + } + } + + // Helper: classify a failing config check + async function classifyConfigIssue(label: string, reason: string, contractAddress: string): Promise { + if (await deployerHasGovernorRole(contractAddress)) { + configIssues.push(`${label}: ${reason}`) + } else { + deferredIssues.push(`${label}: ${reason}`) + } + } + + // Check each new contract + const iaConfig = await checkIAConfigured(client, ia.address, rm.address, governor, pauseGuardian) + if (!iaConfig.done && iaConfig.reason !== 'RM.issuancePerBlock is 0') { + await classifyConfigIssue('IA', iaConfig.reason!, ia.address) + } + + const daConfig = await checkDefaultAllocationConfigured(client, da.address, governor, pauseGuardian) + if (!daConfig.done) { + await classifyConfigIssue('DA', daConfig.reason!, da.address) + } + + if (rc && ss) { + const ramConfig = await checkRAMConfigured( + client, + ram.address, + rc.address, + ss.address, + ia.address, + governor, + pauseGuardian, + ) + if (!ramConfig.done) { + await classifyConfigIssue('RAM', ramConfig.reason!, ram.address) + } + } + + const reclaimRolesCheck = await checkReclaimRoles(client, reclaim.address, governor, pauseGuardian) + if (!reclaimRolesCheck.done) { + await classifyConfigIssue('Reclaim', reclaimRolesCheck.reason!, reclaim.address) + } + + // RM.setDefaultReclaimAddress — governance-only (target is RM, not Reclaim). + // Always deferred to the upgrade governance batch, never blocks configure/transfer. + const reclaimRMCheck = await checkReclaimRMIntegration(client, rm.address, reclaim.address) + if (!reclaimRMCheck.done && reclaimRMCheck.reason !== 'RM not upgraded') { + deferredIssues.push(`Reclaim: ${reclaimRMCheck.reason}`) + } + + // RM.setRevertOnIneligible — config-driven; same deferred-only treatment as + // setDefaultReclaimAddress (target is RM, governance-only setter). + const settings = await getResolvedSettingsForEnv(env) + const revertCheck = await checkRMRevertOnIneligible(client, rm.address, settings.rewardsManager.revertOnIneligible) + if (!revertCheck.done && revertCheck.reason !== 'RM not upgraded') { + deferredIssues.push(`RM: ${revertCheck.reason}`) + } + + // REO configure + const issuanceBook = graph.getIssuanceAddressBook(targetChainId) + const hasNetworkOperator = issuanceBook.entryExists('NetworkOperator') + if (hasNetworkOperator) { + const reoConditions = await getREOConditions(env) + for (const [label, addr] of [ + ['REO-A', reoA.address], + ['REO-B', reoB.address], + ] as const) { + const reoConfig = await checkConfigurationStatus(client, addr, reoConditions) + if (!reoConfig.allOk) { + const failing = reoConfig.conditions.filter((c) => !c.ok).map((c) => c.name) + await classifyConfigIssue(label, failing.join(', '), addr) + } + } + } else { + deferredIssues.push('NetworkOperator not configured') + } + + const anyConfigIssues = configIssues.length > 0 || deferredIssues.length > 0 + + // Check transfer state + // ProxyAdmin ownership is deployer-independent (checks owner vs governor). + // Deployer GOVERNOR_ROLE revocation needs the deployer address — checked + // when available, skipped otherwise (ProxyAdmin transfer is the primary signal). + let proxyAdminsTransferred = true + + for (const contract of [ia, da, ram, reclaim, reoA, reoB]) { + try { + const proxyAdminAddr = await getProxyAdminAddress(client, contract.address) + const paCheck = await checkProxyAdminTransferred(client, proxyAdminAddr, governor) + if (!paCheck.done) proxyAdminsTransferred = false + } catch { + // ProxyAdmin not readable — skip + } + } + + let deployerRolesRevoked = true + if (deployer) { + for (const contract of [ia, da, ram, reclaim]) { + const revoked = await checkDeployerRevoked(client, contract.address, deployer) + if (!revoked.done) deployerRolesRevoked = false + } + if (hasNetworkOperator) { + const reoTransferConds = getREOTransferGovernanceConditions(deployer) + const reoATransfer = await checkConfigurationStatus(client, reoA.address, reoTransferConds) + if (!reoATransfer.allOk) deployerRolesRevoked = false + const reoBTransfer = await checkConfigurationStatus(client, reoB.address, reoTransferConds) + if (!reoBTransfer.allOk) deployerRolesRevoked = false + } + } + + const needsTransfer = !proxyAdminsTransferred || !deployerRolesRevoked + + // Next-step guidance + // Lifecycle: deploy → configure → transfer → upgrade + // ProxyAdmin not transferred ⇒ deployer still has control ⇒ configure/transfer phase + // ProxyAdmin transferred ⇒ remaining issues need governance ⇒ upgrade phase + if (anyConfigIssues && !proxyAdminsTransferred) { + env.showMessage(`\n → Next: --tags GIP-0088:upgrade,configure`) + for (const issue of configIssues) env.showMessage(` ${issue}`) + if (deferredIssues.length > 0) { + env.showMessage(` Deferred (governance TX):`) + for (const issue of deferredIssues) env.showMessage(` ${issue}`) + } + } else if (needsTransfer) { + env.showMessage(`\n → Next: --tags GIP-0088:upgrade,transfer`) + } else if (anyPending || anyConfigIssues) { + env.showMessage(`\n → Next: --tags GIP-0088:upgrade,upgrade`) + if (deferredIssues.length > 0) { + env.showMessage(` Deferred config (governance TX):`) + for (const issue of deferredIssues) env.showMessage(` ${issue}`) + } + } + } + + showPendingGovernanceTxs(env) + env.showMessage(`\n Actions: --tags GIP-0088:upgrade,`) + env.showMessage('') +} + +func.tags = [GoalTags.GIP_0088_UPGRADE] +func.dependencies = [ + // Upgrade contracts + ComponentTags.RECURRING_COLLECTOR, + ComponentTags.REWARDS_MANAGER, + ComponentTags.HORIZON_STAKING, + ComponentTags.SUBGRAPH_SERVICE, + ComponentTags.DISPUTE_MANAGER, + ComponentTags.PAYMENTS_ESCROW, + ComponentTags.L2_CURATION, + // New contracts (shown in status) + ComponentTags.ISSUANCE_ALLOCATOR, + ComponentTags.DEFAULT_ALLOCATION, + ComponentTags.RECURRING_AGREEMENT_MANAGER, + ComponentTags.REWARDS_ELIGIBILITY_A, +] +func.skip = async () => noTagsRequested() + +export default func diff --git a/packages/deployment/deploy/horizon/curation/01_deploy.ts b/packages/deployment/deploy/horizon/curation/01_deploy.ts new file mode 100644 index 000000000..1a0d9c9b0 --- /dev/null +++ b/packages/deployment/deploy/horizon/curation/01_deploy.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createImplementationDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createImplementationDeployModule(Contracts.horizon.L2Curation) diff --git a/packages/deployment/deploy/horizon/curation/02_upgrade.ts b/packages/deployment/deploy/horizon/curation/02_upgrade.ts new file mode 100644 index 000000000..efb44379c --- /dev/null +++ b/packages/deployment/deploy/horizon/curation/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.horizon.L2Curation) diff --git a/packages/deployment/deploy/horizon/curation/09_end.ts b/packages/deployment/deploy/horizon/curation/09_end.ts new file mode 100644 index 000000000..bd06ed9ad --- /dev/null +++ b/packages/deployment/deploy/horizon/curation/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.horizon.L2Curation) diff --git a/packages/deployment/deploy/horizon/curation/10_status.ts b/packages/deployment/deploy/horizon/curation/10_status.ts new file mode 100644 index 000000000..8a6d9f944 --- /dev/null +++ b/packages/deployment/deploy/horizon/curation/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.horizon.L2Curation) diff --git a/packages/deployment/deploy/horizon/payments-escrow/01_deploy.ts b/packages/deployment/deploy/horizon/payments-escrow/01_deploy.ts new file mode 100644 index 000000000..91d2db38b --- /dev/null +++ b/packages/deployment/deploy/horizon/payments-escrow/01_deploy.ts @@ -0,0 +1,58 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { deployImplementation, getImplementationConfig } from '@graphprotocol/deployment/lib/deploy-implementation.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { DeployScriptModule } from '@rocketh/core/types' + +// PaymentsEscrow Implementation Deployment +// +// Deploys a new PaymentsEscrow implementation if artifact bytecode differs from on-chain. +// +// Workflow: +// 1. Read current immutable values from on-chain contract +// 2. Compare artifact bytecode with on-chain bytecode (accounting for immutables) +// 3. If different, deploy new implementation +// 4. Store as "pendingImplementation" in horizon/addresses.json +// 5. Upgrade task (separate) handles TX generation and execution + +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + await syncComponentsFromRegistry(env, [Contracts.horizon.Controller, Contracts.horizon.PaymentsEscrow]) + + const controllerDep = env.getOrNull('Controller') + const escrowDep = env.getOrNull('PaymentsEscrow') + + if (!controllerDep || !escrowDep) { + throw new Error('Missing required contract deployments (Controller, PaymentsEscrow) after sync.') + } + + // Read current immutable value from on-chain contract + const client = graph.getPublicClient(env) + const thawingPeriod = await client.readContract({ + address: escrowDep.address as `0x${string}`, + abi: [ + { + name: 'WITHDRAW_ESCROW_THAWING_PERIOD', + type: 'function', + inputs: [], + outputs: [{ name: '', type: 'uint256' }], + stateMutability: 'view', + }, + ], + functionName: 'WITHDRAW_ESCROW_THAWING_PERIOD', + }) + + env.showMessage(` PaymentsEscrow WITHDRAW_ESCROW_THAWING_PERIOD: ${thawingPeriod}`) + + await deployImplementation( + env, + getImplementationConfig('horizon', 'PaymentsEscrow', { + constructorArgs: [controllerDep.address, thawingPeriod], + }), + ) +} + +func.tags = [ComponentTags.PAYMENTS_ESCROW] +func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) +export default func diff --git a/packages/deployment/deploy/horizon/payments-escrow/02_upgrade.ts b/packages/deployment/deploy/horizon/payments-escrow/02_upgrade.ts new file mode 100644 index 000000000..25c8f13e1 --- /dev/null +++ b/packages/deployment/deploy/horizon/payments-escrow/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.horizon.PaymentsEscrow) diff --git a/packages/deployment/deploy/horizon/payments-escrow/09_end.ts b/packages/deployment/deploy/horizon/payments-escrow/09_end.ts new file mode 100644 index 000000000..95272ed2d --- /dev/null +++ b/packages/deployment/deploy/horizon/payments-escrow/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.horizon.PaymentsEscrow) diff --git a/packages/deployment/deploy/horizon/payments-escrow/10_status.ts b/packages/deployment/deploy/horizon/payments-escrow/10_status.ts new file mode 100644 index 000000000..267692139 --- /dev/null +++ b/packages/deployment/deploy/horizon/payments-escrow/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.horizon.PaymentsEscrow) diff --git a/packages/deployment/deploy/horizon/recurring-collector/01_deploy.ts b/packages/deployment/deploy/horizon/recurring-collector/01_deploy.ts new file mode 100644 index 000000000..4f96b4c35 --- /dev/null +++ b/packages/deployment/deploy/horizon/recurring-collector/01_deploy.ts @@ -0,0 +1,48 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { getResolvedSettingsForEnv } from '@graphprotocol/deployment/lib/deployment-config.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { deployProxyContract } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import type { DeployScriptModule } from '@rocketh/core/types' + +/** + * Deploy RecurringCollector proxy and implementation + * + * Deploys OZ v5 TransparentUpgradeableProxy with atomic initialization. + * Deployer is the initial ProxyAdmin owner; ownership is transferred to + * the protocol governor in a separate governance step. + * + * RecurringCollector constructor takes (controller, revokeSignerThawingPeriod). + * initialize(eip712Name, eip712Version) sets up EIP-712 domain and pausability. + * + * On subsequent runs (proxy already deployed), deploys new implementation + * and stores it as pendingImplementation for governance upgrade. + * + * Usage: + * pnpm hardhat deploy --tags RecurringCollector:deploy --network + */ +const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + await syncComponentsFromRegistry(env, [Contracts.horizon.Controller, Contracts.horizon.RecurringCollector]) + + const controllerDep = env.getOrNull('Controller') + if (!controllerDep) { + throw new Error('Missing Controller deployment after sync.') + } + + const settings = await getResolvedSettingsForEnv(env) + const { revokeSignerThawingPeriod, eip712Name, eip712Version } = settings.recurringCollector + + env.showMessage(`\n📦 Deploying ${Contracts.horizon.RecurringCollector.name}`) + + await deployProxyContract(env, { + contract: Contracts.horizon.RecurringCollector, + constructorArgs: [controllerDep.address, revokeSignerThawingPeriod], + initializeArgs: [eip712Name, eip712Version], + }) +} + +func.tags = [ComponentTags.RECURRING_COLLECTOR] +func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) + +export default func diff --git a/packages/deployment/deploy/horizon/recurring-collector/02_upgrade.ts b/packages/deployment/deploy/horizon/recurring-collector/02_upgrade.ts new file mode 100644 index 000000000..f58136aad --- /dev/null +++ b/packages/deployment/deploy/horizon/recurring-collector/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.horizon.RecurringCollector) diff --git a/packages/deployment/deploy/horizon/recurring-collector/04_configure.ts b/packages/deployment/deploy/horizon/recurring-collector/04_configure.ts new file mode 100644 index 000000000..023e95ef3 --- /dev/null +++ b/packages/deployment/deploy/horizon/recurring-collector/04_configure.ts @@ -0,0 +1,62 @@ +import { RECURRING_COLLECTOR_PAUSE_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { canSignAsGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContract } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph, tx } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' +import { encodeFunctionData } from 'viem' + +/** + * Configure RecurringCollector — set pause guardian + * + * RC uses Controller-based access control: setPauseGuardian requires + * msg.sender == Controller.getGovernor(). If the deployer is the + * Controller governor (e.g. testnet), this script sets it directly. + * Otherwise it reports the gap — the upgrade step (04_upgrade.ts) + * bundles it as a governance TX. + * + * Idempotent: checks on-chain state, skips if already set. + * + * Usage: + * pnpm hardhat deploy --tags RecurringCollector:configure --network + */ +export default createActionModule(Contracts.horizon.RecurringCollector, DeploymentActions.CONFIGURE, async (env) => { + const client = graph.getPublicClient(env) as PublicClient + const rc = requireContract(env, Contracts.horizon.RecurringCollector) + const pauseGuardian = await getPauseGuardian(env) + + env.showMessage(`\n========== Configure ${Contracts.horizon.RecurringCollector.name} ==========`) + + const isGuardian = (await client.readContract({ + address: rc.address as `0x${string}`, + abi: RECURRING_COLLECTOR_PAUSE_ABI, + functionName: 'pauseGuardians', + args: [pauseGuardian as `0x${string}`], + })) as boolean + + if (isGuardian) { + env.showMessage(` ✓ Pause guardian already set\n`) + return + } + + const { canSign } = await canSignAsGovernor(env) + if (!canSign) { + env.showMessage(` ○ Pause guardian not set — will be configured in upgrade step (governance TX)\n`) + return + } + + env.showMessage('\n🔨 Setting pause guardian as governor...\n') + const txFn = tx(env) + await txFn({ + account: 'governor', + to: rc.address as `0x${string}`, + data: encodeFunctionData({ + abi: RECURRING_COLLECTOR_PAUSE_ABI, + functionName: 'setPauseGuardian', + args: [pauseGuardian as `0x${string}`, true], + }), + }) + env.showMessage(` ✓ setPauseGuardian(${pauseGuardian})\n`) +}) diff --git a/packages/deployment/deploy/horizon/recurring-collector/05_transfer_governance.ts b/packages/deployment/deploy/horizon/recurring-collector/05_transfer_governance.ts new file mode 100644 index 000000000..672cc47d5 --- /dev/null +++ b/packages/deployment/deploy/horizon/recurring-collector/05_transfer_governance.ts @@ -0,0 +1,69 @@ +import { OZ_PROXY_ADMIN_ABI } from '@graphprotocol/deployment/lib/abis.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { getGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + getProxyAdminAddress, + requireContract, + requireDeployer, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph, tx } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' +import { encodeFunctionData } from 'viem' + +/** + * Transfer RecurringCollector ProxyAdmin to protocol governor + * + * RC doesn't use BaseUpgradeable GOVERNOR_ROLE — only ProxyAdmin needs transfer. + * + * Idempotent: checks current owner, skips if already governor. + * + * Usage: + * pnpm hardhat deploy --tags RecurringCollector,transfer --network + */ +export default createActionModule(Contracts.horizon.RecurringCollector, DeploymentActions.TRANSFER, async (env) => { + const client = graph.getPublicClient(env) as PublicClient + const deployer = requireDeployer(env) + const governor = await getGovernor(env) + const rc = requireContract(env, Contracts.horizon.RecurringCollector) + + env.showMessage(`\n========== Transfer ${Contracts.horizon.RecurringCollector.name} ==========`) + + // Read ProxyAdmin from ERC1967 slot + const proxyAdminAddress = await getProxyAdminAddress(client, rc.address) + + const currentOwner = (await client.readContract({ + address: proxyAdminAddress as `0x${string}`, + abi: OZ_PROXY_ADMIN_ABI, + functionName: 'owner', + })) as string + + if (currentOwner.toLowerCase() === governor.toLowerCase()) { + env.showMessage(` ✓ ProxyAdmin already owned by governor\n`) + return + } + + if (currentOwner.toLowerCase() !== deployer.toLowerCase()) { + env.showMessage(` ○ ProxyAdmin owned by ${currentOwner}, not deployer — skipping\n`) + return + } + + env.showMessage(` Transferring ProxyAdmin ownership to governor...`) + env.showMessage(` ProxyAdmin: ${proxyAdminAddress}`) + env.showMessage(` From: ${deployer}`) + env.showMessage(` To: ${governor}`) + + const txFn = tx(env) + await txFn({ + account: deployer, + to: proxyAdminAddress as `0x${string}`, + data: encodeFunctionData({ + abi: OZ_PROXY_ADMIN_ABI, + functionName: 'transferOwnership', + args: [governor as `0x${string}`], + }), + }) + + env.showMessage(` ✓ ProxyAdmin ownership transferred to governor\n`) +}) diff --git a/packages/deployment/deploy/horizon/recurring-collector/09_end.ts b/packages/deployment/deploy/horizon/recurring-collector/09_end.ts new file mode 100644 index 000000000..5240c729c --- /dev/null +++ b/packages/deployment/deploy/horizon/recurring-collector/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.horizon.RecurringCollector) diff --git a/packages/deployment/deploy/horizon/recurring-collector/10_status.ts b/packages/deployment/deploy/horizon/recurring-collector/10_status.ts new file mode 100644 index 000000000..da1ecafc3 --- /dev/null +++ b/packages/deployment/deploy/horizon/recurring-collector/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.horizon.RecurringCollector) diff --git a/packages/deployment/deploy/horizon/staking/01_deploy.ts b/packages/deployment/deploy/horizon/staking/01_deploy.ts new file mode 100644 index 000000000..3b9f1c9d4 --- /dev/null +++ b/packages/deployment/deploy/horizon/staking/01_deploy.ts @@ -0,0 +1,15 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createImplementationDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createImplementationDeployModule( + Contracts.horizon.HorizonStaking, + (env) => { + const controller = env.getOrNull('Controller') + const subgraphService = env.getOrNull('SubgraphService') + if (!controller || !subgraphService) { + throw new Error('Missing required contract deployments (Controller, SubgraphService) after sync.') + } + return [controller.address, subgraphService.address] + }, + { prerequisites: [Contracts.horizon.Controller, Contracts['subgraph-service'].SubgraphService] }, +) diff --git a/packages/deployment/deploy/horizon/staking/02_upgrade.ts b/packages/deployment/deploy/horizon/staking/02_upgrade.ts new file mode 100644 index 000000000..d7abe8bbe --- /dev/null +++ b/packages/deployment/deploy/horizon/staking/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.horizon.HorizonStaking) diff --git a/packages/deployment/deploy/horizon/staking/09_end.ts b/packages/deployment/deploy/horizon/staking/09_end.ts new file mode 100644 index 000000000..d374f7e79 --- /dev/null +++ b/packages/deployment/deploy/horizon/staking/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.horizon.HorizonStaking) diff --git a/packages/deployment/deploy/horizon/staking/10_status.ts b/packages/deployment/deploy/horizon/staking/10_status.ts new file mode 100644 index 000000000..22c2a940d --- /dev/null +++ b/packages/deployment/deploy/horizon/staking/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.horizon.HorizonStaking) diff --git a/packages/deployment/deploy/rewards/eligibility/01_deploy.ts b/packages/deployment/deploy/rewards/eligibility/01_deploy.ts deleted file mode 100644 index 11dd554a8..000000000 --- a/packages/deployment/deploy/rewards/eligibility/01_deploy.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { SpecialTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { deployProxyContract, requireGraphToken } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * Deploy RewardsEligibilityOracle proxy and implementation - * - * Deploys OZ v5 TransparentUpgradeableProxy with atomic initialization. - * Deployer receives GOVERNOR_ROLE (temporary, for configuration). - * - * See: docs/deploy/RewardsEligibilityOracleDeployment.md - * - * Usage: - * pnpm hardhat deploy --tags rewards-eligibility-deploy --network - */ - -const func: DeployScriptModule = async (env) => { - const graphToken = requireGraphToken(env).address - - env.showMessage(`\n📦 Deploying ${Contracts.issuance.RewardsEligibilityOracle.name} with GraphToken: ${graphToken}`) - - await deployProxyContract(env, { - contract: Contracts.issuance.RewardsEligibilityOracle, - constructorArgs: [graphToken], - }) -} - -func.tags = Tags.rewardsEligibilityDeploy -func.dependencies = [SpecialTags.SYNC] - -export default func diff --git a/packages/deployment/deploy/rewards/eligibility/02_upgrade.ts b/packages/deployment/deploy/rewards/eligibility/02_upgrade.ts deleted file mode 100644 index 4432d7391..000000000 --- a/packages/deployment/deploy/rewards/eligibility/02_upgrade.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { upgradeImplementation } from '@graphprotocol/deployment/lib/upgrade-implementation.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * Upgrade RewardsEligibilityOracle to pending implementation - * - * Generates governance TX batch for proxy upgrade, then exits. - * Execute separately via: pnpm hardhat deploy:execute-governance - * - * See: docs/deploy/RewardsEligibilityOracleDeployment.md - * - * Usage: - * pnpm hardhat deploy --tags rewards-eligibility-upgrade --network - */ - -const func: DeployScriptModule = async (env) => { - await upgradeImplementation(env, Contracts.issuance.RewardsEligibilityOracle) -} - -func.tags = Tags.rewardsEligibilityUpgrade -func.dependencies = [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.DEPLOY)] - -export default func diff --git a/packages/deployment/deploy/rewards/eligibility/04_configure.ts b/packages/deployment/deploy/rewards/eligibility/04_configure.ts deleted file mode 100644 index 849675917..000000000 --- a/packages/deployment/deploy/rewards/eligibility/04_configure.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { applyConfiguration } from '@graphprotocol/deployment/lib/apply-configuration.js' -import { checkREORole, getREOConditions } from '@graphprotocol/deployment/lib/contract-checks.js' -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' -import type { PublicClient } from 'viem' - -/** - * Configure RewardsEligibilityOracle (params + roles) - * - * See: docs/deploy/RewardsEligibilityOracleDeployment.md - */ -const func: DeployScriptModule = async (env) => { - const deployer = requireDeployer(env) - const [reo] = requireContracts(env, [Contracts.issuance.RewardsEligibilityOracle]) - const client = graph.getPublicClient(env) as PublicClient - - const canExecuteDirectly = (await checkREORole(client, reo.address, 'GOVERNOR_ROLE', deployer)).hasRole - - await applyConfiguration(env, client, await getREOConditions(env), { - contractName: Contracts.issuance.RewardsEligibilityOracle.name, - contractAddress: reo.address, - canExecuteDirectly, - executor: deployer, - }) -} - -func.tags = Tags.rewardsEligibilityConfigure -func.dependencies = [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.DEPLOY)] - -export default func diff --git a/packages/deployment/deploy/rewards/eligibility/05_transfer_governance.ts b/packages/deployment/deploy/rewards/eligibility/05_transfer_governance.ts deleted file mode 100644 index e19688c81..000000000 --- a/packages/deployment/deploy/rewards/eligibility/05_transfer_governance.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { applyConfiguration, checkConfigurationStatus } from '@graphprotocol/deployment/lib/apply-configuration.js' -import { getREOConditions, getREOTransferGovernanceConditions } from '@graphprotocol/deployment/lib/contract-checks.js' -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' -import type { PublicClient } from 'viem' - -/** - * Transfer governance of RewardsEligibilityOracle - * - * See: docs/deploy/RewardsEligibilityOracleDeployment.md - */ -const func: DeployScriptModule = async (env) => { - const deployer = requireDeployer(env) - const [reo] = requireContracts(env, [Contracts.issuance.RewardsEligibilityOracle]) - const client = graph.getPublicClient(env) as PublicClient - - // 1. Verify preconditions (same conditions as step 4) - env.showMessage(`\n📋 Verifying ${Contracts.issuance.RewardsEligibilityOracle.name} configuration...\n`) - const status = await checkConfigurationStatus(client, reo.address, await getREOConditions(env)) - for (const r of status.conditions) env.showMessage(` ${r.message}`) - if (!status.allOk) { - env.showMessage('\n❌ Configuration incomplete - run configure step first\n') - process.exit(1) - } - - // 2. Apply: revoke deployer's GOVERNOR_ROLE - await applyConfiguration(env, client, getREOTransferGovernanceConditions(deployer), { - contractName: `${Contracts.issuance.RewardsEligibilityOracle.name}-transfer-governance`, - contractAddress: reo.address, - canExecuteDirectly: true, - executor: deployer, - }) -} - -func.tags = Tags.rewardsEligibilityTransfer -func.dependencies = [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.CONFIGURE)] - -export default func diff --git a/packages/deployment/deploy/rewards/eligibility/06_integrate.ts b/packages/deployment/deploy/rewards/eligibility/06_integrate.ts deleted file mode 100644 index 3773c6982..000000000 --- a/packages/deployment/deploy/rewards/eligibility/06_integrate.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { applyConfiguration } from '@graphprotocol/deployment/lib/apply-configuration.js' -import { createRMIntegrationCondition } from '@graphprotocol/deployment/lib/contract-checks.js' -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { ComponentTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' -import type { PublicClient } from 'viem' - -/** - * Integrate RewardsEligibilityOracle with RewardsManager - * - * See: docs/deploy/RewardsEligibilityOracleDeployment.md - */ -const func: DeployScriptModule = async (env) => { - const [reo, rm] = requireContracts(env, [ - Contracts.issuance.RewardsEligibilityOracle, - Contracts.horizon.RewardsManager, - ]) - const client = graph.getPublicClient(env) as PublicClient - - // Apply: RM.providerEligibilityOracle = REO (always governance TX) - await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { - contractName: `${Contracts.horizon.RewardsManager.name}-REO`, - contractAddress: rm.address, - canExecuteDirectly: false, - }) -} - -func.tags = Tags.rewardsEligibilityIntegrate -func.dependencies = [Tags.rewardsEligibilityTransfer[0], ComponentTags.REWARDS_MANAGER] - -export default func diff --git a/packages/deployment/deploy/rewards/eligibility/09_complete.ts b/packages/deployment/deploy/rewards/eligibility/09_complete.ts deleted file mode 100644 index 0a97f6795..000000000 --- a/packages/deployment/deploy/rewards/eligibility/09_complete.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireUpgradeExecuted } from '@graphprotocol/deployment/lib/execute-governance.js' -import type { DeployScriptModule } from '@rocketh/core/types' - -/** - * RewardsEligibilityOracle complete - verifies full deployment - * - * Aggregate tag: runs deploy, upgrade, configure steps. - * Transfer-governance is separate (explicit action to relinquish control). - * - * See: docs/deploy/RewardsEligibilityOracleDeployment.md - * - * Usage: - * pnpm hardhat deploy --tags rewards-eligibility --network - */ -const func: DeployScriptModule = async (env) => { - requireUpgradeExecuted(env, Contracts.issuance.RewardsEligibilityOracle.name) - env.showMessage(`\n✓ ${Contracts.issuance.RewardsEligibilityOracle.name} ready`) -} - -func.tags = Tags.rewardsEligibility -func.dependencies = [ - actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.DEPLOY), - actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.UPGRADE), - actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.CONFIGURE), - actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.TRANSFER), - actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.INTEGRATE), - actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.VERIFY), -] - -export default func diff --git a/packages/deployment/deploy/rewards/eligibility/a/01_deploy.ts b/packages/deployment/deploy/rewards/eligibility/a/01_deploy.ts new file mode 100644 index 000000000..1bde8305b --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/a/01_deploy.ts @@ -0,0 +1,12 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { requireDeployer, requireGraphToken } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createProxyDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createProxyDeployModule( + Contracts.issuance.RewardsEligibilityOracleA, + (env) => ({ + constructorArgs: [requireGraphToken(env).address], + initializeArgs: [requireDeployer(env)], + }), + { prerequisites: [Contracts.horizon.L2GraphToken] }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/a/02_upgrade.ts b/packages/deployment/deploy/rewards/eligibility/a/02_upgrade.ts new file mode 100644 index 000000000..063a33cae --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/a/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.issuance.RewardsEligibilityOracleA) diff --git a/packages/deployment/deploy/rewards/eligibility/a/04_configure.ts b/packages/deployment/deploy/rewards/eligibility/a/04_configure.ts new file mode 100644 index 000000000..26bb1e7c7 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/a/04_configure.ts @@ -0,0 +1,39 @@ +import { applyConfiguration } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { checkREORole, getREOConditions } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Configure RewardsEligibilityOracleA (params + roles) + * + * Deployer executes directly (has GOVERNOR_ROLE from deploy). + * If deployer doesn't have the role, skips — upgrade step handles it. + */ +export default createActionModule( + Contracts.issuance.RewardsEligibilityOracleA, + DeploymentActions.CONFIGURE, + async (env) => { + const [reo] = requireContracts(env, [Contracts.issuance.RewardsEligibilityOracleA]) + const client = graph.getPublicClient(env) as PublicClient + const deployer = requireDeployer(env) + + const deployerRole = await checkREORole(client, reo.address, 'GOVERNOR_ROLE', deployer) + if (!deployerRole.hasRole) { + env.showMessage( + `\n ○ ${Contracts.issuance.RewardsEligibilityOracleA.name}: deployer does not have GOVERNOR_ROLE — skipping\n`, + ) + return + } + + await applyConfiguration(env, client, await getREOConditions(env), { + contractName: Contracts.issuance.RewardsEligibilityOracleA.name, + contractAddress: reo.address, + canExecuteDirectly: true, + executor: deployer, + }) + }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/a/05_transfer_governance.ts b/packages/deployment/deploy/rewards/eligibility/a/05_transfer_governance.ts new file mode 100644 index 000000000..e09593859 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/a/05_transfer_governance.ts @@ -0,0 +1,45 @@ +import { applyConfiguration, checkConfigurationStatus } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { getREOConditions, getREOTransferGovernanceConditions } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + requireContracts, + requireDeployer, + transferProxyAdminOwnership, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Transfer governance of RewardsEligibilityOracleA + */ +export default createActionModule( + Contracts.issuance.RewardsEligibilityOracleA, + DeploymentActions.TRANSFER, + async (env) => { + const deployer = requireDeployer(env) + const [reo] = requireContracts(env, [Contracts.issuance.RewardsEligibilityOracleA]) + const client = graph.getPublicClient(env) as PublicClient + + // 1. Verify preconditions (same conditions as step 4) + env.showMessage(`\n📋 Verifying ${Contracts.issuance.RewardsEligibilityOracleA.name} configuration...\n`) + const status = await checkConfigurationStatus(client, reo.address, await getREOConditions(env)) + for (const r of status.conditions) env.showMessage(` ${r.message}`) + if (!status.allOk) { + env.showMessage('\n ○ Configuration incomplete — skipping transfer\n') + return + } + + // 2. Apply: revoke deployer's GOVERNOR_ROLE + await applyConfiguration(env, client, getREOTransferGovernanceConditions(deployer), { + contractName: `${Contracts.issuance.RewardsEligibilityOracleA.name}-transfer-governance`, + contractAddress: reo.address, + canExecuteDirectly: true, + executor: deployer, + }) + + // 3. Transfer ProxyAdmin ownership to governor + await transferProxyAdminOwnership(env, Contracts.issuance.RewardsEligibilityOracleA) + }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/a/09_end.ts b/packages/deployment/deploy/rewards/eligibility/a/09_end.ts new file mode 100644 index 000000000..dd53f54ec --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/a/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.issuance.RewardsEligibilityOracleA) diff --git a/packages/deployment/deploy/rewards/eligibility/a/10_status.ts b/packages/deployment/deploy/rewards/eligibility/a/10_status.ts new file mode 100644 index 000000000..a42b58304 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/a/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.issuance.RewardsEligibilityOracleA) diff --git a/packages/deployment/deploy/rewards/eligibility/b/01_deploy.ts b/packages/deployment/deploy/rewards/eligibility/b/01_deploy.ts new file mode 100644 index 000000000..c360d882a --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/b/01_deploy.ts @@ -0,0 +1,12 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { requireDeployer, requireGraphToken } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createProxyDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createProxyDeployModule( + Contracts.issuance.RewardsEligibilityOracleB, + (env) => ({ + constructorArgs: [requireGraphToken(env).address], + initializeArgs: [requireDeployer(env)], + }), + { prerequisites: [Contracts.horizon.L2GraphToken] }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/b/02_upgrade.ts b/packages/deployment/deploy/rewards/eligibility/b/02_upgrade.ts new file mode 100644 index 000000000..1863d2847 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/b/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.issuance.RewardsEligibilityOracleB) diff --git a/packages/deployment/deploy/rewards/eligibility/b/04_configure.ts b/packages/deployment/deploy/rewards/eligibility/b/04_configure.ts new file mode 100644 index 000000000..e06307f45 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/b/04_configure.ts @@ -0,0 +1,39 @@ +import { applyConfiguration } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { checkREORole, getREOConditions } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContracts, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Configure RewardsEligibilityOracleB (params + roles) + * + * Deployer executes directly (has GOVERNOR_ROLE from deploy). + * If deployer doesn't have the role, skips — upgrade step handles it. + */ +export default createActionModule( + Contracts.issuance.RewardsEligibilityOracleB, + DeploymentActions.CONFIGURE, + async (env) => { + const [reo] = requireContracts(env, [Contracts.issuance.RewardsEligibilityOracleB]) + const client = graph.getPublicClient(env) as PublicClient + const deployer = requireDeployer(env) + + const deployerRole = await checkREORole(client, reo.address, 'GOVERNOR_ROLE', deployer) + if (!deployerRole.hasRole) { + env.showMessage( + `\n ○ ${Contracts.issuance.RewardsEligibilityOracleB.name}: deployer does not have GOVERNOR_ROLE — skipping\n`, + ) + return + } + + await applyConfiguration(env, client, await getREOConditions(env), { + contractName: Contracts.issuance.RewardsEligibilityOracleB.name, + contractAddress: reo.address, + canExecuteDirectly: true, + executor: deployer, + }) + }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/b/05_transfer_governance.ts b/packages/deployment/deploy/rewards/eligibility/b/05_transfer_governance.ts new file mode 100644 index 000000000..87bcb281e --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/b/05_transfer_governance.ts @@ -0,0 +1,45 @@ +import { applyConfiguration, checkConfigurationStatus } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { getREOConditions, getREOTransferGovernanceConditions } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + requireContracts, + requireDeployer, + transferProxyAdminOwnership, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Transfer governance of RewardsEligibilityOracleB + */ +export default createActionModule( + Contracts.issuance.RewardsEligibilityOracleB, + DeploymentActions.TRANSFER, + async (env) => { + const deployer = requireDeployer(env) + const [reo] = requireContracts(env, [Contracts.issuance.RewardsEligibilityOracleB]) + const client = graph.getPublicClient(env) as PublicClient + + // 1. Verify preconditions (same conditions as step 4) + env.showMessage(`\n📋 Verifying ${Contracts.issuance.RewardsEligibilityOracleB.name} configuration...\n`) + const status = await checkConfigurationStatus(client, reo.address, await getREOConditions(env)) + for (const r of status.conditions) env.showMessage(` ${r.message}`) + if (!status.allOk) { + env.showMessage('\n ○ Configuration incomplete — skipping transfer\n') + return + } + + // 2. Apply: revoke deployer's GOVERNOR_ROLE + await applyConfiguration(env, client, getREOTransferGovernanceConditions(deployer), { + contractName: `${Contracts.issuance.RewardsEligibilityOracleB.name}-transfer-governance`, + contractAddress: reo.address, + canExecuteDirectly: true, + executor: deployer, + }) + + // 3. Transfer ProxyAdmin ownership to governor + await transferProxyAdminOwnership(env, Contracts.issuance.RewardsEligibilityOracleB) + }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/b/09_end.ts b/packages/deployment/deploy/rewards/eligibility/b/09_end.ts new file mode 100644 index 000000000..3a11b891a --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/b/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.issuance.RewardsEligibilityOracleB) diff --git a/packages/deployment/deploy/rewards/eligibility/b/10_status.ts b/packages/deployment/deploy/rewards/eligibility/b/10_status.ts new file mode 100644 index 000000000..f8a4d48a8 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/b/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.issuance.RewardsEligibilityOracleB) diff --git a/packages/deployment/deploy/rewards/eligibility/mock/01_deploy.ts b/packages/deployment/deploy/rewards/eligibility/mock/01_deploy.ts new file mode 100644 index 000000000..0d687127c --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/mock/01_deploy.ts @@ -0,0 +1,12 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { requireDeployer, requireGraphToken } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createProxyDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createProxyDeployModule( + Contracts.issuance.RewardsEligibilityOracleMock, + (env) => ({ + constructorArgs: [requireGraphToken(env).address], + initializeArgs: [requireDeployer(env)], + }), + { prerequisites: [Contracts.horizon.L2GraphToken] }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/mock/02_upgrade.ts b/packages/deployment/deploy/rewards/eligibility/mock/02_upgrade.ts new file mode 100644 index 000000000..74e2374b8 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/mock/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts.issuance.RewardsEligibilityOracleMock) diff --git a/packages/deployment/deploy/rewards/eligibility/mock/05_transfer_governance.ts b/packages/deployment/deploy/rewards/eligibility/mock/05_transfer_governance.ts new file mode 100644 index 000000000..6be92ce32 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/mock/05_transfer_governance.ts @@ -0,0 +1,39 @@ +import { applyConfiguration } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { getREOTransferGovernanceConditions } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + requireContracts, + requireDeployer, + transferProxyAdminOwnership, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Transfer governance of MockRewardsEligibilityOracle + * + * Revokes deployer's GOVERNOR_ROLE and transfers ProxyAdmin ownership + * to the protocol governor. + */ +export default createActionModule( + Contracts.issuance.RewardsEligibilityOracleMock, + DeploymentActions.TRANSFER, + async (env) => { + const deployer = requireDeployer(env) + const [reo] = requireContracts(env, [Contracts.issuance.RewardsEligibilityOracleMock]) + const client = graph.getPublicClient(env) as PublicClient + + // Revoke deployer's GOVERNOR_ROLE + await applyConfiguration(env, client, getREOTransferGovernanceConditions(deployer), { + contractName: `${Contracts.issuance.RewardsEligibilityOracleMock.name}-transfer-governance`, + contractAddress: reo.address, + canExecuteDirectly: true, + executor: deployer, + }) + + // Transfer ProxyAdmin ownership to governor + await transferProxyAdminOwnership(env, Contracts.issuance.RewardsEligibilityOracleMock) + }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/mock/06_integrate.ts b/packages/deployment/deploy/rewards/eligibility/mock/06_integrate.ts new file mode 100644 index 000000000..2bd1ed3ac --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/mock/06_integrate.ts @@ -0,0 +1,39 @@ +import { applyConfiguration } from '@graphprotocol/deployment/lib/apply-configuration.js' +import { createRMIntegrationCondition } from '@graphprotocol/deployment/lib/contract-checks.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' +import { ComponentTags, DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContracts } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Integrate MockRewardsEligibilityOracle with RewardsManager (testnet only) + * + * Points RewardsManager at the mock so indexers can control their own eligibility. + */ +export default createActionModule( + Contracts.issuance.RewardsEligibilityOracleMock, + DeploymentActions.INTEGRATE, + async (env) => { + const [reo, rm] = requireContracts(env, [ + Contracts.issuance.RewardsEligibilityOracleMock, + Contracts.horizon.RewardsManager, + ]) + const client = graph.getPublicClient(env) as PublicClient + + const { governor, canSign } = await canSignAsGovernor(env) + + await applyConfiguration(env, client, [createRMIntegrationCondition(reo.address)], { + contractName: `${Contracts.horizon.RewardsManager.name}-MockREO`, + contractAddress: rm.address, + canExecuteDirectly: canSign, + executor: governor, + }) + }, + { + extraDependencies: [ComponentTags.REWARDS_MANAGER], + prerequisites: [Contracts.horizon.RewardsManager], + }, +) diff --git a/packages/deployment/deploy/rewards/eligibility/mock/09_end.ts b/packages/deployment/deploy/rewards/eligibility/mock/09_end.ts new file mode 100644 index 000000000..98cacd97f --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/mock/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts.issuance.RewardsEligibilityOracleMock) diff --git a/packages/deployment/deploy/rewards/eligibility/mock/10_status.ts b/packages/deployment/deploy/rewards/eligibility/mock/10_status.ts new file mode 100644 index 000000000..611316b02 --- /dev/null +++ b/packages/deployment/deploy/rewards/eligibility/mock/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.issuance.RewardsEligibilityOracleMock) diff --git a/packages/deployment/deploy/rewards/manager/01_deploy.ts b/packages/deployment/deploy/rewards/manager/01_deploy.ts index 3d72bc314..2223ce0ed 100644 --- a/packages/deployment/deploy/rewards/manager/01_deploy.ts +++ b/packages/deployment/deploy/rewards/manager/01_deploy.ts @@ -1,21 +1,4 @@ -import { deployImplementation, getImplementationConfig } from '@graphprotocol/deployment/lib/deploy-implementation.js' -import { SpecialTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createImplementationDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' -// RewardsManager Implementation Deployment -// -// Deploys a new RewardsManager implementation if artifact bytecode differs from on-chain. -// -// Workflow: -// 1. Compare artifact bytecode with on-chain bytecode (accounting for immutables) -// 2. If different, deploy new implementation -// 3. Store as "pendingImplementation" in horizon/addresses.json -// 4. Upgrade task (separate) handles TX generation and execution - -const func: DeployScriptModule = async (env) => { - await deployImplementation(env, getImplementationConfig('horizon', 'RewardsManager')) -} - -func.tags = Tags.rewardsManagerDeploy -func.dependencies = [SpecialTags.SYNC] -export default func +export default createImplementationDeployModule(Contracts.horizon.RewardsManager) diff --git a/packages/deployment/deploy/rewards/manager/02_upgrade.ts b/packages/deployment/deploy/rewards/manager/02_upgrade.ts index effed5fe9..5c888723b 100644 --- a/packages/deployment/deploy/rewards/manager/02_upgrade.ts +++ b/packages/deployment/deploy/rewards/manager/02_upgrade.ts @@ -1,26 +1,4 @@ import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { ComponentTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { upgradeImplementation } from '@graphprotocol/deployment/lib/upgrade-implementation.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' -// RewardsManager Upgrade -// -// Generates governance TX batch and executes upgrade. -// -// Workflow: -// 1. Check for pending implementation in address book -// 2. Generate governance TX (upgrade + acceptProxy) -// 3. Fork mode: execute via governor impersonation -// 4. Production: output TX file for Safe execution -// -// Usage: -// FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags rewards-manager-upgrade --network localhost - -const func: DeployScriptModule = async (env) => { - await upgradeImplementation(env, Contracts.horizon.RewardsManager) -} - -func.tags = Tags.rewardsManagerUpgrade -func.dependencies = [ComponentTags.REWARDS_MANAGER_DEPLOY] - -export default func +export default createUpgradeModule(Contracts.horizon.RewardsManager) diff --git a/packages/deployment/deploy/rewards/manager/09_end.ts b/packages/deployment/deploy/rewards/manager/09_end.ts index d07b4cee5..ae4996ffd 100644 --- a/packages/deployment/deploy/rewards/manager/09_end.ts +++ b/packages/deployment/deploy/rewards/manager/09_end.ts @@ -1,19 +1,4 @@ -import { ComponentTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireUpgradeExecuted } from '@graphprotocol/deployment/lib/execute-governance.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' -/** - * RewardsManager end state - deployed and upgraded - * - * Usage: - * pnpm hardhat deploy --tags rewards-manager --network - */ -const func: DeployScriptModule = async (env) => { - requireUpgradeExecuted(env, 'RewardsManager') - env.showMessage(`\n✓ RewardsManager ready`) -} - -func.tags = Tags.rewardsManager -func.dependencies = [ComponentTags.REWARDS_MANAGER_DEPLOY, ComponentTags.REWARDS_MANAGER_UPGRADE] - -export default func +export default createEndModule(Contracts.horizon.RewardsManager) diff --git a/packages/deployment/deploy/rewards/manager/10_status.ts b/packages/deployment/deploy/rewards/manager/10_status.ts new file mode 100644 index 000000000..4b47d40bb --- /dev/null +++ b/packages/deployment/deploy/rewards/manager/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts.horizon.RewardsManager) diff --git a/packages/deployment/deploy/rewards/reclaim/01_deploy.ts b/packages/deployment/deploy/rewards/reclaim/01_deploy.ts index 520eef497..3ee161636 100644 --- a/packages/deployment/deploy/rewards/reclaim/01_deploy.ts +++ b/packages/deployment/deploy/rewards/reclaim/01_deploy.ts @@ -1,50 +1,45 @@ import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { ComponentTags, SpecialTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { deployProxyContract } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { deployProxyContract, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' import type { DeployScriptModule } from '@rocketh/core/types' /** - * Deploy DirectAllocation proxies as reclaim addresses + * Deploy DirectAllocation proxy as default reclaim address * - * This script deploys DirectAllocation proxy instances for each reclaim reason. - * All proxies share the DirectAllocation_Implementation deployed by direct-allocation-impl. + * This script deploys a single DirectAllocation proxy instance used as the + * default reclaim address on RewardsManager for all reclaim reasons. + * The proxy uses the DirectAllocation_Implementation deployed by direct-allocation-impl. * * Deployed contracts: - * - ReclaimedRewardsForIndexerIneligible - * - ReclaimedRewardsForSubgraphDenied - * - ReclaimedRewardsForStalePoi - * - ReclaimedRewardsForZeroPoi - * - ReclaimedRewardsForCloseAllocation + * - ReclaimedRewards * * Usage: - * pnpm hardhat deploy --tags rewards-reclaim-deploy --network + * pnpm hardhat deploy --tags RewardsReclaim:deploy --network */ -// Reclaim contracts that share DirectAllocation implementation -const RECLAIM_CONTRACTS = [ - Contracts.issuance.ReclaimedRewardsForIndexerIneligible, - Contracts.issuance.ReclaimedRewardsForSubgraphDenied, - Contracts.issuance.ReclaimedRewardsForStalePoi, - Contracts.issuance.ReclaimedRewardsForZeroPoi, - Contracts.issuance.ReclaimedRewardsForCloseAllocation, -] as const - const func: DeployScriptModule = async (env) => { - env.showMessage(`\n📦 Deploying DirectAllocation reclaim address proxies...`) + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + await syncComponentsFromRegistry(env, [ + Contracts.issuance.DirectAllocation_Implementation, + Contracts.horizon.RewardsManager, + Contracts.issuance.ReclaimedRewards, + ]) + + env.showMessage(`\n📦 Deploying DirectAllocation reclaim address proxy...`) env.showMessage(` Shared implementation: ${Contracts.issuance.DirectAllocation_Implementation.name}`) - for (const contract of RECLAIM_CONTRACTS) { - await deployProxyContract(env, { - contract, - sharedImplementation: Contracts.issuance.DirectAllocation_Implementation, - // initializeArgs defaults to [governor] - }) - } + await deployProxyContract(env, { + contract: Contracts.issuance.ReclaimedRewards, + sharedImplementation: Contracts.issuance.DirectAllocation_Implementation, + initializeArgs: [requireDeployer(env)], + }) - env.showMessage('\n✓ Reclaim addresses deployment complete') + env.showMessage('\n✓ Reclaim address deployment complete') } -func.tags = Tags.rewardsReclaimDeploy -func.dependencies = [SpecialTags.SYNC, ComponentTags.DIRECT_ALLOCATION_IMPL, ComponentTags.REWARDS_MANAGER] +func.tags = [ComponentTags.REWARDS_RECLAIM] +func.dependencies = [ComponentTags.DIRECT_ALLOCATION_IMPL, ComponentTags.REWARDS_MANAGER] +func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) export default func diff --git a/packages/deployment/deploy/rewards/reclaim/02_upgrade.ts b/packages/deployment/deploy/rewards/reclaim/02_upgrade.ts index 7fa17437f..bc27987a0 100644 --- a/packages/deployment/deploy/rewards/reclaim/02_upgrade.ts +++ b/packages/deployment/deploy/rewards/reclaim/02_upgrade.ts @@ -1,43 +1,36 @@ import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' import { upgradeImplementation } from '@graphprotocol/deployment/lib/upgrade-implementation.js' import type { DeployScriptModule } from '@rocketh/core/types' // ReclaimedRewards Upgrade // -// Upgrades ReclaimedRewardsFor* proxies to DirectAllocation implementation via per-proxy ProxyAdmin. -// The implementation is shared across multiple allocation proxies. +// Upgrades ReclaimedRewards proxy to DirectAllocation implementation via per-proxy ProxyAdmin. // // Workflow: // 1. Check for pending implementation in address book (set by direct-allocation-impl) -// 2. Generate governance TX (upgradeAndCall to per-proxy ProxyAdmin) for each proxy +// 2. Generate governance TX (upgradeAndCall to per-proxy ProxyAdmin) // 3. Fork mode: execute via governor impersonation // 4. Production: output TX file for Safe execution // // Usage: -// FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags rewards-reclaim-upgrade --network localhost - -// Reclaim contracts that share DirectAllocation implementation -const RECLAIM_CONTRACTS = [ - Contracts.issuance.ReclaimedRewardsForIndexerIneligible, - Contracts.issuance.ReclaimedRewardsForSubgraphDenied, - Contracts.issuance.ReclaimedRewardsForStalePoi, - Contracts.issuance.ReclaimedRewardsForZeroPoi, - Contracts.issuance.ReclaimedRewardsForCloseAllocation, -] as const +// FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags RewardsReclaim:upgrade --network localhost const func: DeployScriptModule = async (env) => { - for (const contract of RECLAIM_CONTRACTS) { - await upgradeImplementation(env, contract, { - implementationName: 'DirectAllocation', - }) - } + if (shouldSkipAction(DeploymentActions.UPGRADE)) return + await syncComponentsFromRegistry(env, [ + Contracts.issuance.DirectAllocation_Implementation, + Contracts.issuance.ReclaimedRewards, + ]) + await upgradeImplementation(env, Contracts.issuance.ReclaimedRewards, { + implementationName: 'DirectAllocation', + }) + await syncComponentsFromRegistry(env, [Contracts.issuance.ReclaimedRewards]) } -func.tags = Tags.rewardsReclaimUpgrade -func.dependencies = [ - actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.DEPLOY), - ComponentTags.DIRECT_ALLOCATION_IMPL, -] +func.tags = [ComponentTags.REWARDS_RECLAIM] +func.dependencies = [ComponentTags.DIRECT_ALLOCATION_IMPL] +func.skip = async () => shouldSkipAction(DeploymentActions.UPGRADE) export default func diff --git a/packages/deployment/deploy/rewards/reclaim/04_configure.ts b/packages/deployment/deploy/rewards/reclaim/04_configure.ts index e545cd970..ad1afee4d 100644 --- a/packages/deployment/deploy/rewards/reclaim/04_configure.ts +++ b/packages/deployment/deploy/rewards/reclaim/04_configure.ts @@ -1,145 +1,144 @@ -import { REWARDS_MANAGER_ABI } from '@graphprotocol/deployment/lib/abis.js' -import { - getReclaimAddress, - RECLAIM_CONTRACT_NAMES, - RECLAIM_REASONS, - type ReclaimReasonKey, -} from '@graphprotocol/deployment/lib/contract-checks.js' +import { ACCESS_CONTROL_ENUMERABLE_ABI, REWARDS_MANAGER_ABI } from '@graphprotocol/deployment/lib/abis.js' import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { getGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { createGovernanceTxBuilder } from '@graphprotocol/deployment/lib/execute-governance.js' -import { requireContract } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' -import { execute, graph } from '@graphprotocol/deployment/rocketh/deploy.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { getGovernor, getPauseGuardian } from '@graphprotocol/deployment/lib/controller-utils.js' +import { ComponentTags, DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { requireContract, requireDeployer } from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { checkReclaimConfigured } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { graph, read, tx } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' import { encodeFunctionData } from 'viem' /** - * Configure RewardsManager with reclaim addresses + * Configure ReclaimedRewards — role grants only * - * Sets the reclaim addresses on RewardsManager for token recovery. - * This requires RewardsManager to be upgraded (governance operation). + * Grants GOVERNOR_ROLE to protocol governor and PAUSE_ROLE to pause guardian. + * Deployer executes directly (has GOVERNOR_ROLE from deploy). + * If deployer doesn't have the role, skips — upgrade step handles it. * - * Configured reasons: - * - INDEXER_INELIGIBLE → ReclaimedRewardsForIndexerIneligible - * - SUBGRAPH_DENIED → ReclaimedRewardsForSubgraphDenied - * - STALE_POI → ReclaimedRewardsForStalePoi - * - ZERO_POI → ReclaimedRewardsForZeroPoi - * - CLOSE_ALLOCATION → ReclaimedRewardsForCloseAllocation - * - * Idempotent: checks if already configured, skips if so. - * Generates Safe TX batch if direct execution fails. + * RM.setDefaultReclaimAddress is a governance TX bundled in the upgrade step. * * Usage: - * pnpm hardhat deploy --tags rewards-reclaim-configure --network + * pnpm hardhat deploy --tags RewardsReclaim:configure --network */ -const func: DeployScriptModule = async (env) => { - const executeFn = execute(env) - const client = graph.getPublicClient(env) - - // Get protocol governor from Controller - const governor = await getGovernor(env) - - const rewardsManager = requireContract(env, Contracts.horizon.RewardsManager) - - env.showMessage(`\n========== Configure ${Contracts.horizon.RewardsManager.name} Reclaim ==========`) - env.showMessage(`${Contracts.horizon.RewardsManager.name}: ${rewardsManager.address}`) - - // Find deployed reclaim addresses - const reclaimAddresses: { name: string; address: string; reasonKey: ReclaimReasonKey }[] = [] - - for (const [reasonKey, contractName] of Object.entries(RECLAIM_CONTRACT_NAMES)) { - const deployment = env.getOrNull(contractName) - if (deployment) { - reclaimAddresses.push({ - name: contractName, - address: deployment.address, - reasonKey: reasonKey as ReclaimReasonKey, - }) - } - } - - if (reclaimAddresses.length === 0) { - env.showMessage(`\n⚠️ No reclaim addresses deployed, skipping configuration`) - return - } - - env.showMessage(`\nFound ${reclaimAddresses.length} reclaim address(es):`) - for (const { name, address } of reclaimAddresses) { - env.showMessage(` ${name}: ${address}`) - } - - // Check current configuration - const needsConfiguration: typeof reclaimAddresses = [] - - for (const reclaim of reclaimAddresses) { - const reason = RECLAIM_REASONS[reclaim.reasonKey] - - // Check if RM has this reclaim address configured for this reason - const currentReclaim = await getReclaimAddress(client, rewardsManager.address, reason) - if (currentReclaim && currentReclaim.toLowerCase() === reclaim.address.toLowerCase()) { - env.showMessage(`\n✓ ${reclaim.name} already configured on RewardsManager`) - continue +export default createActionModule( + Contracts.issuance.ReclaimedRewards, + DeploymentActions.CONFIGURE, + async (env) => { + const client = graph.getPublicClient(env) as PublicClient + const readFn = read(env) + const deployer = requireDeployer(env) + const governor = await getGovernor(env) + const pauseGuardian = await getPauseGuardian(env) + + const rewardsManager = requireContract(env, Contracts.horizon.RewardsManager) + const reclaimedRewards = requireContract(env, Contracts.issuance.ReclaimedRewards) + + env.showMessage(`\n========== Configure ${Contracts.issuance.ReclaimedRewards.name} ==========`) + env.showMessage(`ReclaimedRewards: ${reclaimedRewards.address}`) + + // Check if fully configured (shared precondition check) + const precondition = await checkReclaimConfigured( + client, + rewardsManager.address, + reclaimedRewards.address, + governor, + pauseGuardian, + ) + if (precondition.done) { + env.showMessage(`\n✅ ${Contracts.issuance.ReclaimedRewards.name} already configured\n`) + return } - needsConfiguration.push(reclaim) - } - - if (needsConfiguration.length === 0) { - env.showMessage(`\n✓ All reclaim addresses already configured`) - return - } - - // Build TX batch - env.showMessage(`\n🔨 Building configuration TX batch...`) - - const builder = await createGovernanceTxBuilder(env, `configure-${Contracts.horizon.RewardsManager.name}-Reclaim`) - - for (const reclaim of needsConfiguration) { - const reason = RECLAIM_REASONS[reclaim.reasonKey] + // Check role grants + env.showMessage('\n📋 Checking configuration...\n') + + const GOVERNOR_ROLE = (await readFn(reclaimedRewards, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` + const PAUSE_ROLE = (await readFn(reclaimedRewards, { functionName: 'PAUSE_ROLE' })) as `0x${string}` + + const governorHasRole = (await client.readContract({ + address: reclaimedRewards.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [GOVERNOR_ROLE, governor as `0x${string}`], + })) as boolean + env.showMessage(` Governor GOVERNOR_ROLE: ${governorHasRole ? '✓' : '✗'}`) + + const pauseGuardianHasRole = (await client.readContract({ + address: reclaimedRewards.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [PAUSE_ROLE, pauseGuardian as `0x${string}`], + })) as boolean + env.showMessage(` PauseGuardian PAUSE_ROLE: ${pauseGuardianHasRole ? '✓' : '✗'}`) + + // RM integration status (informational — handled by upgrade step) try { - const data = encodeFunctionData({ + const currentDefault = (await client.readContract({ + address: rewardsManager.address as `0x${string}`, abi: REWARDS_MANAGER_ABI, - functionName: 'setReclaimAddress', - args: [reason as `0x${string}`, reclaim.address as `0x${string}`], - }) - builder.addTx({ to: rewardsManager.address, value: '0', data }) - env.showMessage(` + setReclaimAddress(${reclaim.reasonKey}, ${reclaim.address})`) + functionName: 'getDefaultReclaimAddress', + })) as string + const rmOk = currentDefault.toLowerCase() === reclaimedRewards.address.toLowerCase() + env.showMessage(` RM default reclaim: ${rmOk ? '✓' : '○ will be set in upgrade step (governance TX)'}`) } catch { - env.showMessage(` ⚠️ setReclaimAddress not available on RewardsManager interface`) - return + env.showMessage(` RM default reclaim: ○ RM not upgraded — will be set in upgrade step`) } - } - const txFile = builder.saveToFile() - env.showMessage(`\n✓ TX batch saved: ${txFile}`) + // Execute role grants as deployer + const deployerHasRole = (await client.readContract({ + address: reclaimedRewards.address as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [GOVERNOR_ROLE, deployer as `0x${string}`], + })) as boolean + + if (!deployerHasRole) { + env.showMessage( + `\n ○ Deployer does not have GOVERNOR_ROLE — skipping role grants (governance TX in upgrade step)\n`, + ) + return + } - // Try direct execution - env.showMessage(`\n🔐 Attempting direct execution...`) - try { - for (const reclaim of needsConfiguration) { - const reason = RECLAIM_REASONS[reclaim.reasonKey] + const txs: Array<{ to: string; data: `0x${string}`; label: string }> = [] + + if (!governorHasRole) { + txs.push({ + to: reclaimedRewards.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [GOVERNOR_ROLE, governor as `0x${string}`], + }), + label: `grantRole(GOVERNOR_ROLE, ${governor})`, + }) + } - await executeFn(rewardsManager, { - account: governor, - functionName: 'setReclaimAddress', - args: [reason, reclaim.address], + if (!pauseGuardianHasRole) { + txs.push({ + to: reclaimedRewards.address, + data: encodeFunctionData({ + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'grantRole', + args: [PAUSE_ROLE, pauseGuardian as `0x${string}`], + }), + label: `grantRole(PAUSE_ROLE, ${pauseGuardian})`, }) - env.showMessage(` ✓ setReclaimAddress(${reclaim.reasonKey}, ${reclaim.address}) executed`) } - env.showMessage(`\n✅ ${Contracts.horizon.RewardsManager.name} reclaim configuration complete!`) - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error) - env.showMessage(`\n⚠️ Direct execution failed: ${errorMessage.slice(0, 100)}...`) - env.showMessage(`\n📋 GOVERNANCE ACTION REQUIRED:`) - env.showMessage(` The ${Contracts.horizon.RewardsManager.name} reclaim configuration must be executed via Safe.`) - env.showMessage(` TX batch file: ${txFile}`) - env.showMessage(` Import this file into Safe Transaction Builder.`) - } -} - -func.tags = Tags.rewardsReclaimConfigure -func.dependencies = [actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.UPGRADE), ComponentTags.REWARDS_MANAGER] - -export default func + if (txs.length > 0) { + env.showMessage('\n🔨 Executing role grants as deployer...\n') + const txFn = tx(env) + for (const t of txs) { + await txFn({ account: deployer, to: t.to as `0x${string}`, data: t.data }) + env.showMessage(` ✓ ${t.label}`) + } + } + + env.showMessage(`\n✅ ${Contracts.issuance.ReclaimedRewards.name} role grants complete\n`) + }, + { + extraDependencies: [ComponentTags.REWARDS_MANAGER], + prerequisites: [Contracts.horizon.RewardsManager], + }, +) diff --git a/packages/deployment/deploy/rewards/reclaim/05_transfer_governance.ts b/packages/deployment/deploy/rewards/reclaim/05_transfer_governance.ts new file mode 100644 index 000000000..bdcd728b2 --- /dev/null +++ b/packages/deployment/deploy/rewards/reclaim/05_transfer_governance.ts @@ -0,0 +1,56 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { + requireContract, + requireDeployer, + transferProxyAdminOwnership, +} from '@graphprotocol/deployment/lib/issuance-deploy-utils.js' +import { checkDeployerRevoked } from '@graphprotocol/deployment/lib/preconditions.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { execute, graph, read } from '@graphprotocol/deployment/rocketh/deploy.js' +import type { PublicClient } from 'viem' + +/** + * Transfer ReclaimedRewards governance from deployer + * + * - Revoke GOVERNOR_ROLE from deployment account + * - Transfer ProxyAdmin ownership to governor + * + * Role grants (GOVERNOR_ROLE, PAUSE_ROLE) happen in 04_configure.ts. + * This script only revokes deployer access. + * + * Idempotent: checks on-chain state, skips if already transferred. + * + * Usage: + * pnpm hardhat deploy --tags RewardsReclaim,transfer --network + */ +export default createActionModule(Contracts.issuance.ReclaimedRewards, DeploymentActions.TRANSFER, async (env) => { + const readFn = read(env) + const executeFn = execute(env) + const client = graph.getPublicClient(env) as PublicClient + const deployer = requireDeployer(env) + const reclaim = requireContract(env, Contracts.issuance.ReclaimedRewards) + + env.showMessage(`\n========== Transfer ${Contracts.issuance.ReclaimedRewards.name} ==========`) + + // Check if deployer GOVERNOR_ROLE already revoked (shared precondition check) + const precondition = await checkDeployerRevoked(client, reclaim.address, deployer) + if (precondition.done) { + env.showMessage(`✓ Deployer GOVERNOR_ROLE already revoked`) + } else { + const GOVERNOR_ROLE = (await readFn(reclaim, { functionName: 'GOVERNOR_ROLE' })) as `0x${string}` + + env.showMessage(`🔨 Revoking deployer GOVERNOR_ROLE...`) + await executeFn(reclaim, { + account: deployer, + functionName: 'revokeRole', + args: [GOVERNOR_ROLE, deployer], + }) + env.showMessage(` ✓ revokeRole(GOVERNOR_ROLE) executed`) + } + + // Transfer ProxyAdmin ownership to governor + await transferProxyAdminOwnership(env, Contracts.issuance.ReclaimedRewards) + + env.showMessage(`\n✅ ${Contracts.issuance.ReclaimedRewards.name} governance transferred!\n`) +}) diff --git a/packages/deployment/deploy/rewards/reclaim/09_end.ts b/packages/deployment/deploy/rewards/reclaim/09_end.ts index 5043dfde4..46d6aa2dc 100644 --- a/packages/deployment/deploy/rewards/reclaim/09_end.ts +++ b/packages/deployment/deploy/rewards/reclaim/09_end.ts @@ -1,32 +1,4 @@ -import { RECLAIM_CONTRACT_NAMES } from '@graphprotocol/deployment/lib/contract-checks.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireUpgradeExecuted } from '@graphprotocol/deployment/lib/execute-governance.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' -/** - * RewardsReclaim end state - deployed, upgraded, and configured - * - * Aggregate tag that ensures ReclaimedRewardsFor* contracts are fully ready: - * - Proxies and shared implementation deployed - * - Proxies upgraded to latest implementation - * - Configured on RewardsManager - * - * Usage: - * pnpm hardhat deploy --tags rewards-reclaim --network - */ -const func: DeployScriptModule = async (env) => { - // Check all reclaim address proxies for pending upgrades - for (const contractName of Object.values(RECLAIM_CONTRACT_NAMES)) { - requireUpgradeExecuted(env, contractName) - } - env.showMessage(`\n✓ RewardsReclaim ready`) -} - -func.tags = Tags.rewardsReclaim -func.dependencies = [ - actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.DEPLOY), - actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.UPGRADE), - actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.CONFIGURE), -] - -export default func +export default createEndModule(Contracts.issuance.ReclaimedRewards) diff --git a/packages/deployment/deploy/rewards/reclaim/10_status.ts b/packages/deployment/deploy/rewards/reclaim/10_status.ts new file mode 100644 index 000000000..c5f778ac9 --- /dev/null +++ b/packages/deployment/deploy/rewards/reclaim/10_status.ts @@ -0,0 +1,14 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { ComponentTags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' +import { showDetailedComponentStatus } from '@graphprotocol/deployment/lib/status-detail.js' + +/** + * RewardsReclaim status - show detailed state of reclaim contract + * + * Usage: + * pnpm hardhat deploy --tags RewardsReclaim --network + */ +export default createStatusModule(ComponentTags.REWARDS_RECLAIM, async (env) => { + await showDetailedComponentStatus(env, Contracts.issuance.ReclaimedRewards) +}) diff --git a/packages/deployment/deploy/service/dispute/01_deploy.ts b/packages/deployment/deploy/service/dispute/01_deploy.ts new file mode 100644 index 000000000..3158750b9 --- /dev/null +++ b/packages/deployment/deploy/service/dispute/01_deploy.ts @@ -0,0 +1,12 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createImplementationDeployModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createImplementationDeployModule( + Contracts['subgraph-service'].DisputeManager, + (env) => { + const controller = env.getOrNull('Controller') + if (!controller) throw new Error('Missing Controller deployment after sync.') + return [controller.address] + }, + { prerequisites: [Contracts.horizon.Controller] }, +) diff --git a/packages/deployment/deploy/service/dispute/02_upgrade.ts b/packages/deployment/deploy/service/dispute/02_upgrade.ts new file mode 100644 index 000000000..99c75d9e3 --- /dev/null +++ b/packages/deployment/deploy/service/dispute/02_upgrade.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createUpgradeModule(Contracts['subgraph-service'].DisputeManager) diff --git a/packages/deployment/deploy/service/dispute/09_end.ts b/packages/deployment/deploy/service/dispute/09_end.ts new file mode 100644 index 000000000..5a1afb1a4 --- /dev/null +++ b/packages/deployment/deploy/service/dispute/09_end.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createEndModule(Contracts['subgraph-service'].DisputeManager) diff --git a/packages/deployment/deploy/service/dispute/10_status.ts b/packages/deployment/deploy/service/dispute/10_status.ts new file mode 100644 index 000000000..1039074c0 --- /dev/null +++ b/packages/deployment/deploy/service/dispute/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts['subgraph-service'].DisputeManager) diff --git a/packages/deployment/deploy/service/subgraph/01_deploy.ts b/packages/deployment/deploy/service/subgraph/01_deploy.ts index e90a2dbef..ff1b46b95 100644 --- a/packages/deployment/deploy/service/subgraph/01_deploy.ts +++ b/packages/deployment/deploy/service/subgraph/01_deploy.ts @@ -1,44 +1,146 @@ -import { deployImplementation, getImplementationConfig } from '@graphprotocol/deployment/lib/deploy-implementation.js' -import { SpecialTags, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { linkArtifactLibraries } from '@graphprotocol/deployment/lib/artifact-loaders.js' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { + deployImplementation, + getImplementationConfig, + loadArtifactFromSource, +} from '@graphprotocol/deployment/lib/deploy-implementation.js' +import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { syncComponentsFromRegistry } from '@graphprotocol/deployment/lib/sync-utils.js' +import { deploy } from '@graphprotocol/deployment/rocketh/deploy.js' import type { DeployScriptModule } from '@rocketh/core/types' // SubgraphService Implementation Deployment // -// Deploys a new SubgraphService implementation if artifact bytecode differs from on-chain. +// SubgraphService uses external Solidity libraries that must be deployed first +// and linked into the implementation bytecode before deployment. +// +// Library dependency order: +// 1. StakeClaims (standalone, from horizon) +// 2. AllocationHandler (standalone) +// 3. IndexingAgreementDecoderRaw (standalone) +// 4. IndexingAgreementDecoder (links IndexingAgreementDecoderRaw) +// 5. IndexingAgreement (links IndexingAgreementDecoder) +// 6. SubgraphService (links all above) // // Workflow: -// 1. Compare artifact bytecode with on-chain bytecode (accounting for immutables) -// 2. If different, deploy new implementation +// 1. Deploy libraries in dependency order +// 2. Deploy SS implementation with linked libraries // 3. Store as "pendingImplementation" in subgraph-service/addresses.json // 4. Upgrade task (separate) handles TX generation and execution const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + await syncComponentsFromRegistry(env, [ + Contracts.horizon.Controller, + Contracts['subgraph-service'].DisputeManager, + Contracts.horizon.GraphTallyCollector, + Contracts.horizon.L2Curation, + Contracts.horizon.RecurringCollector, + Contracts['subgraph-service'].SubgraphService, + ]) + // Get constructor args from imported deployments const controllerDep = env.getOrNull('Controller') const disputeManagerDep = env.getOrNull('DisputeManager') const graphTallyCollectorDep = env.getOrNull('GraphTallyCollector') const curationDep = env.getOrNull('L2Curation') + const recurringCollectorDep = env.getOrNull('RecurringCollector') - if (!controllerDep || !disputeManagerDep || !graphTallyCollectorDep || !curationDep) { + if (!controllerDep || !disputeManagerDep || !graphTallyCollectorDep || !curationDep || !recurringCollectorDep) { throw new Error( - 'Missing required contract deployments (Controller, DisputeManager, GraphTallyCollector, L2Curation). ' + - 'The sync step should have imported these.', + 'Missing required contract deployments after sync ' + + '(Controller, DisputeManager, GraphTallyCollector, L2Curation, RecurringCollector).', ) } - await deployImplementation( - env, - getImplementationConfig('subgraph-service', 'SubgraphService', { - constructorArgs: [ - controllerDep.address, - disputeManagerDep.address, - graphTallyCollectorDep.address, - curationDep.address, - ], - }), + // Deploy libraries in dependency order + const deployFn = deploy(env) + const deployer = env.namedAccounts.deployer + if (!deployer) throw new Error('No deployer account configured') + + env.showMessage('\n📚 Deploying SubgraphService libraries...') + + // 1. StakeClaims (from horizon, standalone) + const stakeClaimsArtifact = loadArtifactFromSource({ + type: 'horizon', + path: 'contracts/data-service/libraries/StakeClaims.sol/StakeClaims', + }) + const stakeClaims = await deployFn('StakeClaims', { + account: deployer, + artifact: stakeClaimsArtifact, + args: [], + }) + env.showMessage(` StakeClaims: ${stakeClaims.address}`) + + // 2. AllocationHandler (standalone) + const allocationHandlerArtifact = loadArtifactFromSource({ + type: 'subgraph-service', + name: 'libraries/AllocationHandler', + }) + const allocationHandler = await deployFn('AllocationHandler', { + account: deployer, + artifact: allocationHandlerArtifact, + args: [], + }) + env.showMessage(` AllocationHandler: ${allocationHandler.address}`) + + // 3. IndexingAgreementDecoderRaw (standalone) + const decoderRawArtifact = loadArtifactFromSource({ + type: 'subgraph-service', + name: 'libraries/IndexingAgreementDecoderRaw', + }) + const decoderRaw = await deployFn('IndexingAgreementDecoderRaw', { + account: deployer, + artifact: decoderRawArtifact, + args: [], + }) + env.showMessage(` IndexingAgreementDecoderRaw: ${decoderRaw.address}`) + + // 4. IndexingAgreementDecoder (links IndexingAgreementDecoderRaw) + // Pre-link libraries into artifact so rocketh stores linked bytecode + // (rocketh's bytecode comparison breaks for unlinked artifacts — see linkArtifactLibraries) + const decoderArtifact = linkArtifactLibraries( + loadArtifactFromSource({ type: 'subgraph-service', name: 'libraries/IndexingAgreementDecoder' }), + { IndexingAgreementDecoderRaw: decoderRaw.address as `0x${string}` }, + ) + const decoder = await deployFn('IndexingAgreementDecoder', { account: deployer, artifact: decoderArtifact, args: [] }) + env.showMessage(` IndexingAgreementDecoder: ${decoder.address}`) + + // 5. IndexingAgreement (links IndexingAgreementDecoder) + const indexingAgreementArtifact = linkArtifactLibraries( + loadArtifactFromSource({ type: 'subgraph-service', name: 'libraries/IndexingAgreement' }), + { IndexingAgreementDecoder: decoder.address as `0x${string}` }, ) + const indexingAgreement = await deployFn('IndexingAgreement', { + account: deployer, + artifact: indexingAgreementArtifact, + args: [], + }) + env.showMessage(` IndexingAgreement: ${indexingAgreement.address}`) + + env.showMessage(' ✓ Libraries deployed\n') + + // 6. Deploy SubgraphService implementation with all libraries linked + const config = getImplementationConfig('subgraph-service', 'SubgraphService', { + constructorArgs: [ + controllerDep.address, + disputeManagerDep.address, + graphTallyCollectorDep.address, + curationDep.address, + recurringCollectorDep.address, + ], + }) + + await deployImplementation(env, config, { + StakeClaims: stakeClaims.address, + AllocationHandler: allocationHandler.address, + IndexingAgreement: indexingAgreement.address, + IndexingAgreementDecoder: decoder.address, + }) } -func.tags = Tags.subgraphServiceDeploy -func.dependencies = [SpecialTags.SYNC] +func.tags = [ComponentTags.SUBGRAPH_SERVICE] +func.dependencies = [ComponentTags.RECURRING_COLLECTOR] +func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) export default func diff --git a/packages/deployment/deploy/service/subgraph/02_upgrade.ts b/packages/deployment/deploy/service/subgraph/02_upgrade.ts index 6f4ece5d9..1395af76c 100644 --- a/packages/deployment/deploy/service/subgraph/02_upgrade.ts +++ b/packages/deployment/deploy/service/subgraph/02_upgrade.ts @@ -1,26 +1,4 @@ import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { upgradeImplementation } from '@graphprotocol/deployment/lib/upgrade-implementation.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' -// SubgraphService Upgrade -// -// Generates governance TX batch and executes upgrade. -// -// Workflow: -// 1. Check for pending implementation in address book -// 2. Generate governance TX (upgradeAndCall) -// 3. Fork mode: execute via governor impersonation -// 4. Production: output TX file for Safe execution -// -// Usage: -// FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags subgraph-service-upgrade --network localhost - -const func: DeployScriptModule = async (env) => { - await upgradeImplementation(env, Contracts['subgraph-service'].SubgraphService) -} - -func.tags = Tags.subgraphServiceUpgrade -func.dependencies = [actionTag(ComponentTags.SUBGRAPH_SERVICE, DeploymentActions.DEPLOY)] - -export default func +export default createUpgradeModule(Contracts['subgraph-service'].SubgraphService) diff --git a/packages/deployment/deploy/service/subgraph/04_configure.ts b/packages/deployment/deploy/service/subgraph/04_configure.ts new file mode 100644 index 000000000..61dfc3f17 --- /dev/null +++ b/packages/deployment/deploy/service/subgraph/04_configure.ts @@ -0,0 +1,22 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { DeploymentActions } from '@graphprotocol/deployment/lib/deployment-tags.js' +import { createActionModule } from '@graphprotocol/deployment/lib/script-factories.js' + +/** + * Configure SubgraphService + * + * In the current contract version, RecurringCollector is set as an immutable + * constructor argument — no runtime authorization is needed. + * + * This script is a no-op placeholder for future configuration needs. + * + * Usage: + * pnpm hardhat deploy --tags SubgraphService:configure --network + */ +export default createActionModule( + Contracts['subgraph-service'].SubgraphService, + DeploymentActions.CONFIGURE, + async (env) => { + env.showMessage(`\n✅ SubgraphService: RecurringCollector is set at construction time, no configuration needed\n`) + }, +) diff --git a/packages/deployment/deploy/service/subgraph/09_end.ts b/packages/deployment/deploy/service/subgraph/09_end.ts index 0a34b344e..786490018 100644 --- a/packages/deployment/deploy/service/subgraph/09_end.ts +++ b/packages/deployment/deploy/service/subgraph/09_end.ts @@ -1,22 +1,4 @@ -import { actionTag, ComponentTags, DeploymentActions, Tags } from '@graphprotocol/deployment/lib/deployment-tags.js' -import { requireUpgradeExecuted } from '@graphprotocol/deployment/lib/execute-governance.js' -import type { DeployScriptModule } from '@rocketh/core/types' +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createEndModule } from '@graphprotocol/deployment/lib/script-factories.js' -/** - * SubgraphService end state - deployed and upgraded - * - * Usage: - * pnpm hardhat deploy --tags subgraph-service --network - */ -const func: DeployScriptModule = async (env) => { - requireUpgradeExecuted(env, 'SubgraphService') - env.showMessage(`\n✓ SubgraphService ready`) -} - -func.tags = Tags.subgraphService -func.dependencies = [ - actionTag(ComponentTags.SUBGRAPH_SERVICE, DeploymentActions.DEPLOY), - actionTag(ComponentTags.SUBGRAPH_SERVICE, DeploymentActions.UPGRADE), -] - -export default func +export default createEndModule(Contracts['subgraph-service'].SubgraphService) diff --git a/packages/deployment/deploy/service/subgraph/10_status.ts b/packages/deployment/deploy/service/subgraph/10_status.ts new file mode 100644 index 000000000..aa66de54e --- /dev/null +++ b/packages/deployment/deploy/service/subgraph/10_status.ts @@ -0,0 +1,4 @@ +import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { createStatusModule } from '@graphprotocol/deployment/lib/script-factories.js' + +export default createStatusModule(Contracts['subgraph-service'].SubgraphService) diff --git a/packages/deployment/docs/Architecture.md b/packages/deployment/docs/Architecture.md index 4486b7afb..2704a722f 100644 --- a/packages/deployment/docs/Architecture.md +++ b/packages/deployment/docs/Architecture.md @@ -12,27 +12,32 @@ Unified deployment package for Graph Protocol contracts. ``` packages/deployment/ -├── deploy/ # hardhat-deploy scripts -│ ├── common/ # Validation, imports -│ ├── issuance/ # Issuance contracts -│ ├── contracts/ # Core protocol (RewardsManager) -│ └── subgraph-service/ # SubgraphService +├── deploy/ # hardhat-deploy / rocketh scripts +│ ├── common/ # 00_sync.ts +│ ├── horizon/ # RM, HS, PE, L2Curation, RC +│ ├── service/ # SubgraphService, DisputeManager +│ ├── allocate/ # IssuanceAllocator, DefaultAllocation, DirectAllocation +│ ├── agreement/ # RecurringAgreementManager +│ ├── rewards/ # RewardsEligibilityOracle (A/B/mock), Reclaim +│ └── gip/0088/ # GIP-0088 goal orchestration (upgrade phase + activation) +├── lib/ # Shared utilities (preconditions, contract registry, tags, ABIs, ...) ├── tasks/ # Hardhat tasks (deploy:*) -├── governance/ # Safe TX builders -├── deployments/ # Per-network artifacts -└── test/ # Integration tests +├── docs/ # This documentation +└── test/ # Unit tests (bytecode, registry, tx-builder, ...) ``` ## Tags -| Tag | Deploys | -| ---------------------- | ------------------------------------ | -| `sync` | Sync address books, import contracts | -| `rewards-manager` | RewardsManager implementation | -| `subgraph-service` | SubgraphService implementation | -| `upgrade` | Generate TX, execute upgrades | -| `issuance-proxy-admin` | GraphIssuanceProxyAdmin | -| `issuance-core` | All issuance contracts | +Two-dimensional tag model. See [`lib/deployment-tags.ts`](../lib/deployment-tags.ts) for the source of truth. + +| Kind | Examples | Purpose | +| --------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | +| Special | `sync` | Sync address books, import contracts | +| Component | `IssuanceAllocator`, `RewardsManager`, `RecurringAgreementManager`, `RewardsEligibilityOracleA`, ... | One per deployable contract | +| Action verb | `deploy`, `upgrade`, `configure`, `transfer`, `integrate`, `all` | Combined with a component or goal tag to gate work | +| Goal scope | `GIP-0088`, `GIP-0088:upgrade` | Multi-component orchestration for a deployment | +| Activation goal | `GIP-0088:eligibility-integrate`, `GIP-0088:issuance-connect`, `GIP-0088:issuance-allocate` | Per-step governance TX for the activation phases | +| Optional goal | `GIP-0088:eligibility-revert`, `GIP-0088:issuance-close-guard` | Excluded from `--tags ...,all` — must be requested explicitly | ## External Artifacts diff --git a/packages/deployment/docs/DeploymentSetup.md b/packages/deployment/docs/DeploymentSetup.md index c9a2534f3..4b4fd4f4d 100644 --- a/packages/deployment/docs/DeploymentSetup.md +++ b/packages/deployment/docs/DeploymentSetup.md @@ -124,6 +124,7 @@ npx hardhat deploy --skip-prompts --network arbitrumSepolia --tags | Network | Chain ID | RPC (default) | | --------------- | -------- | ---------------------------------------- | +| localNetwork | 1337 | `http://chain:8545` | | arbitrumSepolia | 421614 | | | arbitrumOne | 42161 | | @@ -157,6 +158,66 @@ export ARBISCAN_API_KEY=$(npx hardhat keystore get ARBISCAN_API_KEY) npx hardhat deploy --skip-prompts --network arbitrumSepolia --tags ``` +## Tagging Deployments (WIP) + +> This convention is a work in progress — feedback and changes welcome. + +After a deployment is committed, create an annotated git tag to record the deployment. +Tags use `deploy/{mainnet|testnet}/YYYY-MM-DD` format. The annotation is auto-generated +from address book diffs, listing which contracts changed. + +**Requires:** `jq` (`sudo apt install jq` / `brew install jq`) + +### Usage + +```bash +# Preview first +./scripts/tag-deployment.sh \ + --deployer "packages/deployment --tags RewardsManager" \ + --network arbitrumSepolia \ + --base main \ + --dry-run + +# Create the tag +./scripts/tag-deployment.sh \ + --deployer "packages/deployment --tags RewardsManager" \ + --network arbitrumSepolia \ + --base main + +# Push +git push origin deploy/testnet/2026-03-02 +``` + +The `--deployer` argument is free-form — describe what performed the deployment: + +- `"packages/deployment --tags RewardsManager,SubgraphService"` +- `"packages/horizon ignition migrate"` +- `"manual: forge script DeployFoo"` + +### Workflow + +1. Deploy contracts and update address books +2. Commit the address book changes +3. Run `tag-deployment.sh` (tag must point to a finalized commit) +4. Push branch and tag + +### Options + +| Option | Description | +| ------------------- | --------------------------------------------- | +| `--deployer ` | What performed the deployment (required) | +| `--network ` | `arbitrumOne` or `arbitrumSepolia` (required) | +| `--base ` | Git ref to diff against (default: `HEAD~1`) | +| `--dry-run` | Preview without creating tag | +| `--sign` | Force-sign the tag with `-s` | + +### Viewing tags + +```bash +git tag -l 'deploy/*' # List all deployment tags +git show --no-patch deploy/testnet/... # View tag annotation +``` + ## See Also - [LocalForkTesting.md](./LocalForkTesting.md) - Fork-based testing workflow diff --git a/packages/deployment/docs/Design.md b/packages/deployment/docs/Design.md index d53d22125..6eec92811 100644 --- a/packages/deployment/docs/Design.md +++ b/packages/deployment/docs/Design.md @@ -5,7 +5,7 @@ High-level architecture for the unified deployment system. **See also:** - [Architecture.md](./Architecture.md) - Package structure and organization -- [../deploy/ImplementationPrinciples.md](../deploy/ImplementationPrinciples.md) - Deploy script patterns and conventions +- [deploy/ImplementationPrinciples.md](./deploy/ImplementationPrinciples.md) - Deploy script patterns and conventions ## Components @@ -13,8 +13,8 @@ High-level architecture for the unified deployment system. - IssuanceAllocator - Upgradeable proxy managing issuance distribution - RewardsEligibilityOracle - Upgradeable proxy for eligibility verification -- PilotAllocation - Upgradeable proxy for allocation testing -- GraphIssuanceProxyAdmin - Shared proxy admin for issuance contracts +- ReclaimedRewards (DirectAllocation) - Upgradeable proxy for default reclaim address +- RecurringAgreementManager - Upgradeable proxy for agreement-based payments **Referenced contracts** (already deployed): @@ -26,16 +26,19 @@ High-level architecture for the unified deployment system. ``` packages/deployment/ -├── deploy/ # Numbered deployment scripts -│ ├── admin/ # GraphIssuanceProxyAdmin -│ ├── allocate/ # IssuanceAllocator, PilotAllocation -│ ├── common/ # Validation, external imports -│ ├── rewards/ # RewardsManager, RewardsEligibilityOracle -│ ├── service/ # SubgraphService -│ └── ImplementationPrinciples.md # Script patterns -├── lib/ # Shared utilities, Safe TX builder -├── tasks/ # Hardhat tasks -└── docs/ # Architecture documentation +├── deploy/ # Numbered deployment scripts (rocketh + hardhat-deploy) +│ ├── common/ # 00_sync.ts +│ ├── horizon/ # RewardsManager, HorizonStaking, PaymentsEscrow, L2Curation, RecurringCollector +│ ├── service/ # SubgraphService, DisputeManager +│ ├── allocate/ # IssuanceAllocator, DefaultAllocation, DirectAllocation impl +│ ├── agreement/ # RecurringAgreementManager +│ ├── rewards/ # RewardsEligibilityOracle (A/B/mock), Reclaim +│ └── gip/0088/ # GIP-0088 goal orchestration +├── lib/ # Shared utilities (preconditions, registry, tags, ABIs, governance) +├── tasks/ # Hardhat tasks (deploy:*) +├── docs/ # Architecture and operational documentation +│ └── deploy/ # Deploy-script principles and per-component design notes +└── test/ # Unit tests ``` ## Governance Model @@ -48,54 +51,46 @@ packages/deployment/ ### Proxy Administration -```mermaid -graph TB - Gov[Governance Multi-sig] - ExistingAdmin[GraphProxyAdmin] - NewAdmin[GraphIssuanceProxyAdmin] - - Gov -->|owns| ExistingAdmin - Gov -->|owns| NewAdmin - - LegacyContracts[Staking, Curation, EpochManager, RewardsManager] - IssuanceContracts[IssuanceAllocator, RewardsEligibilityOracle, PilotAllocation] - - ExistingAdmin -->|manages| LegacyContracts - NewAdmin -->|manages| IssuanceContracts -``` - -**Key principle:** Separate proxy admins for legacy vs new issuance contracts, both governance-owned. +Two distinct proxy patterns coexist: -### Component Administration +- **Legacy `GraphProxy`** (custom Graph Protocol pattern) — used by RewardsManager, HorizonStaking, L2Curation, EpochManager. A single shared `GraphProxyAdmin` (owned by governance) controls upgrades for all of them. +- **OZ v5 `TransparentUpgradeableProxy`** — used by every new contract this package deploys (IssuanceAllocator, DefaultAllocation, ReclaimedRewards, RecurringAgreementManager, RewardsEligibilityOracle A/B, RecurringCollector, SubgraphService, DisputeManager, PaymentsEscrow). Each proxy gets its own per-proxy `ProxyAdmin` created by the proxy constructor; ownership is transferred to governance in the transfer step. ```mermaid graph TB - ProxyAdmin[GraphIssuanceProxyAdmin] - - subgraph "Issuance Allocation" - IA[IssuanceAllocator] - IA_Impl[IssuanceAllocatorImplementation] - end + Gov[Governance Multi-sig] + GraphAdmin[GraphProxyAdmin] - subgraph "Allocation Instances" - PA[PilotAllocation] - PA_Impl[DirectAllocation shared impl] + subgraph "Legacy GraphProxy" + RM[RewardsManager] + HS[HorizonStaking] + L2C[L2Curation] end - subgraph "Rewards Eligibility" - REO[RewardsEligibilityOracle] - REO_Impl[RewardsEligibilityOracleImplementation] + subgraph "OZ v5 TransparentUpgradeableProxy
(per-proxy admin)" + IA[IssuanceAllocator] + DA[DefaultAllocation] + Reclaim[ReclaimedRewards] + RAM[RecurringAgreementManager] + REO[RewardsEligibilityOracle A/B] + RC[RecurringCollector] end - ProxyAdmin -->|upgrades| IA - ProxyAdmin -->|upgrades| PA - ProxyAdmin -->|upgrades| REO - - IA -.->|delegates to| IA_Impl - PA -.->|delegates to| PA_Impl - REO -.->|delegates to| REO_Impl + Gov -->|owns| GraphAdmin + GraphAdmin -->|upgrades| RM + GraphAdmin -->|upgrades| HS + GraphAdmin -->|upgrades| L2C + + Gov -.->|owns each per-proxy admin| IA + Gov -.->|owns each per-proxy admin| DA + Gov -.->|owns each per-proxy admin| Reclaim + Gov -.->|owns each per-proxy admin| RAM + Gov -.->|owns each per-proxy admin| REO + Gov -.->|owns each per-proxy admin| RC ``` +**Key principle:** Every proxy admin is governance-owned. Legacy contracts share a single `GraphProxyAdmin`; new contracts each have their own per-proxy admin created at construction. + ## Contract Integration ### RewardsEligibilityOracle Integration @@ -120,7 +115,7 @@ graph TB IA[IssuanceAllocator] subgraph "Allocator Minting" - PA[PilotAllocation] + RAM[RecurringAgreementManager] end subgraph "Self Minting" @@ -128,7 +123,7 @@ graph TB end GT -->|minting authority| IA - IA -->|distributes to| PA + IA -->|distributes to| RAM IA -->|allocates to| RM ``` @@ -146,13 +141,13 @@ graph TD RewardsEligibilityOracle[RewardsEligibilityOracle] IssuanceAllocator[IssuanceAllocator] - PilotAllocation[PilotAllocation] + RecurringAgreementManager[RecurringAgreementManager] RewardsManager -.->|queries| RewardsEligibilityOracle IssuanceAllocator -.->|integrates with| RewardsManager IssuanceAllocator -.->|mints from| GraphToken - IssuanceAllocator -.->|distributes to| PilotAllocation - PilotAllocation -.->|holds| GraphToken + IssuanceAllocator -.->|distributes to| RecurringAgreementManager + RecurringAgreementManager -.->|funds| PaymentsEscrow ``` ## Address Book Management @@ -206,41 +201,44 @@ sequenceDiagram ```mermaid sequenceDiagram participant Deployer - participant Deploy as hardhat-deploy - participant Admin as GraphIssuanceProxyAdmin + participant Deploy as rocketh + participant Admin as ProxyAdmin (per-proxy) participant Impl as Implementation participant Proxy as TransparentUpgradeableProxy participant Gov as Governance Note over Deployer,Gov: Initial Deployment - Deployer->>Deploy: Run deployment scripts - Deploy->>Impl: Deploy contract bytecode - Deploy->>Proxy: Deploy proxy with init - Proxy->>Impl: Initialize + Deployer->>Deploy: --tags Component,deploy + Deploy->>Impl: Deploy implementation + Deploy->>Proxy: Deploy proxy (constructor creates per-proxy Admin) + Proxy->>Impl: Initialize with deployer as governor - Note over Deployer,Gov: Configuration - Deploy->>Proxy: Perform initial configuration - Deploy->>Proxy: Grant GOVERNOR_ROLE to governance + Note over Deployer,Gov: Configure + Deployer->>Deploy: --tags Component,configure + Deploy->>Proxy: Set params, grant roles to gov + pause guardian - Note over Deployer,Gov: Governance Update - Deployer->>Deploy: Generate update proposal - Gov->>Proxy: Execute configuration update + Note over Deployer,Gov: Transfer + Deployer->>Deploy: --tags Component,transfer + Deploy->>Proxy: Revoke deployer GOVERNOR_ROLE + Deploy->>Admin: Transfer ProxyAdmin ownership to Gov Note over Deployer,Gov: Implementation Upgrade - Deployer->>Deploy: Deploy new implementation - Deploy->>Deploy: Generate upgrade proposal - Gov->>Admin: Execute upgrade - Admin->>Proxy: Upgrade to new implementation - - Note over Deployer,Gov: Verification - Deployer->>Deploy: Run sync (--tags sync) - Deploy->>Proxy: Check current implementation - Deploy->>Deploy: Update address book + Deployer->>Deploy: --tags Component,upgrade + Deploy->>Impl: Deploy new implementation + Deploy->>Deploy: Save governance TX batch + Gov->>Admin: Execute upgrade TX + Admin->>Proxy: upgradeAndCall(newImpl) + + Note over Deployer,Gov: Sync + Deployer->>Deploy: --tags sync + Deploy->>Proxy: Read current implementation + Deploy->>Deploy: Update address book (pending → active) ``` ## Conventions - TypeScript throughout (.ts) - TitleCase for documentation -- Deploy script patterns: [ImplementationPrinciples.md](../deploy/ImplementationPrinciples.md) -- All 01_deploy.ts scripts MUST depend on SpecialTags.SYNC +- Deploy script patterns: [ImplementationPrinciples.md](./deploy/ImplementationPrinciples.md) +- Deploy scripts sync the contracts they touch immediately before/after their action via `syncComponentFromRegistry`/`syncComponentsFromRegistry`. The full + global sync is opt-in via `npx hardhat deploy:sync` and is no longer an automatic dependency of every component script. diff --git a/packages/deployment/docs/Gip0088.md b/packages/deployment/docs/Gip0088.md new file mode 100644 index 000000000..3afd7d815 --- /dev/null +++ b/packages/deployment/docs/Gip0088.md @@ -0,0 +1,241 @@ +# GIP-0088: Deployment Guide + +Protocol upgrade deploying the Issuance Allocator, Rewards Eligibility Oracle, and on-chain indexing agreements, as specified by [GIP-0088](https://github.com/graphprotocol/graph-improvement-proposals/blob/main/gips/0088.md). + +## Related GIPs + +| GIP | Title | What it specifies | +| ----------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| [GIP-0076](https://github.com/graphprotocol/graph-improvement-proposals/blob/main/gips/0076.md) | Issuance Allocator | Contract spec: governance-controlled issuance distribution across self-minting and allocator-minting targets | +| [GIP-0079](https://github.com/graphprotocol/graph-improvement-proposals/blob/main/gips/0079.md) | Rewards Eligibility Oracle | Contract spec: quality-of-service gating on indexing rewards via authorized oracle | +| [GIP-0086](https://github.com/graphprotocol/graph-improvement-proposals/blob/main/gips/0086.md) | RM and SS Upgrade | Contract upgrades: RM gains eligibility oracle hook + issuance allocator integration; SS gains agreement support | +| [GIP-0087](https://github.com/graphprotocol/graph-improvement-proposals/blob/main/gips/0087.md) | On-Chain Indexing Agreements | Contract spec: RecurringCollector, RecurringAgreementManager, indexing agreement lifecycle in SubgraphService | +| [GIP-0088](https://github.com/graphprotocol/graph-improvement-proposals/blob/main/gips/0088.md) | IA Deployment and IP Config | **Deployment proposal**: deploy IA (0076), connect to upgraded RM (0086), allocate to RAM (0087) | + +## Contracts + +### New contracts (deploy) + +| Contract | Package | GIP | Purpose | +| ------------------------------ | -------- | ---- | ----------------------------------------------------------- | +| IssuanceAllocator | issuance | 0076 | Governance-managed issuance distribution across targets | +| DefaultAllocation | issuance | 0076 | Default target safety net for unallocated issuance | +| ReclaimedRewards | issuance | 0076 | Default reclaim destination for reclaimed rewards | +| RecurringCollector | horizon | 0087 | EIP-712 collector for recurring payment agreement lifecycle | +| RecurringAgreementManager | issuance | 0087 | Protocol-funded indexing agreements and escrow management | +| RewardsEligibilityOracle (A/B) | issuance | 0079 | Quality-of-service gating on indexing rewards | + +### Existing contracts (upgrade implementation) + +| Contract | Package | GIP | Key changes | +| --------------- | ---------------- | --------- | ------------------------------------------------------------------------------------------------- | +| RewardsManager | contracts | 0086 | `setIssuanceAllocator()`, `IProviderEligibility` integration, `revertOnIneligible`, reclaim infra | +| SubgraphService | subgraph-service | 0086/0087 | Indexing agreement lifecycle, `enforceService`, `recurringCollector` integration | +| DisputeManager | subgraph-service | 0086/0087 | `createIndexingFeeDisputeV1()`, removes legacy dispute creation | +| HorizonStaking | horizon | 0086 | Removes HorizonStakingExtension, consolidates functionality | +| PaymentsEscrow | horizon | 0087 | `adjustThaw()` for payer thaw modification | +| L2Curation | contracts | 0086 | Removes staking as authorized `collect()` caller | + +## Deploy Scripts + +### GIP-0088 scripts (`deploy/gip/0088/`) + +**Upgrade phase** (`upgrade/`) — deploys, configures, transfers, and upgrades ALL contracts: + +| Script | `--tags` | What it does | +| -------------- | ---------------------------- | ------------------------------------------------------------------------------------- | +| `01_deploy` | `GIP-0088:upgrade,deploy` | Deploy all new contracts + implementations | +| `02_configure` | `GIP-0088:upgrade,configure` | Deployer-only configure: role grants and params on contracts where deployer is gov | +| `03_transfer` | `GIP-0088:upgrade,transfer` | Transfer governance of new contracts (revoke deployer role + ProxyAdmin to gov) | +| `04_upgrade` | `GIP-0088:upgrade,upgrade` | Bundle proxy upgrades + all deferred configure into one governance TX batch (details) | +| `10_status` | `GIP-0088:upgrade` | Show upgrade state and next step | + +`04_upgrade` builds a single governance TX batch containing: + +| Group | Items | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Proxy upgrades | Iterates registry; for any deployable proxy with `pendingImplementation`, adds the proxy upgrade TX | +| Existing-contract config | `RC.setPauseGuardian`, `RM.setDefaultReclaimAddress` | +| Deferred new-contract config | IA: `setIssuancePerBlock`, role grants. DA: role grants. RAM: role grants + `setIssuanceAllocator`. Reclaim: role grants. REO A/B: params + role grants | + +Items in groups 2 and 3 are added only when not already on-chain. The bundle exists because configure runs as the deployer and skips anything that requires `GOVERNOR_ROLE` on contracts the deployer doesn't yet control (or that depend on RM being upgraded). + +**Activation goals** — governance TXs that change protocol behaviour (after upgrade complete): + +| Script | `--tags` | What it does | +| ----------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `eligibility_integrate` | `GIP-0088:eligibility-integrate` | `RM.setProviderEligibilityOracle(REO_A)` | +| `issuance_connect` | `GIP-0088:issuance-connect` | `GraphToken.addMinter(IA)` → `RM.setIssuanceAllocator(IA)` → `IA.setTargetAllocation(RM, 0, rate)` (RM as 100% self-minting target) → `IA.setDefaultTarget(DA)` (safety net) | +| `issuance_allocate` | `GIP-0088:issuance-allocate` | `IA.setTargetAllocation(RAM, allocatorRate, selfRate)` (rates from `config/.json5`) | + +**Optional goals** — not planned for initial deployment: + +| Script | `--tags` | What it does | +| ---------------------- | ------------------------------- | ------------------------------------------------------- | +| `eligibility_revert` | `GIP-0088:eligibility-revert` | `RM.setRevertOnIneligible(true)` | +| `issuance_close_guard` | `GIP-0088:issuance-close-guard` | `SS.setBlockClosingAllocationWithActiveAgreement(true)` | + +**Overall** — `09_end` (`GIP-0088,all`) verifies all non-optional goals. `10_status` (`GIP-0088`) shows full deployment state. + +### Component lifecycle scripts + +Each contract has its own lifecycle scripts under `deploy/`. The GIP-0088 upgrade phase depends on component tags — it orchestrates the component scripts rather than duplicating their logic. + +## Deployment Process + +### How `--tags` drives the deployment + +The upgrade phase tag (`GIP-0088:upgrade`) combined with an action verb (`deploy`, `configure`, `transfer`, `upgrade`) selects which lifecycle step runs. Activation goals have their own tags. + +- `--tags GIP-0088:upgrade,deploy` — deploy all contracts +- `--tags GIP-0088:upgrade,configure` — configure all contracts +- `--tags GIP-0088:upgrade,transfer` — transfer to governance control +- `--tags GIP-0088:upgrade,upgrade` — generate proxy upgrade TX batch +- `--tags GIP-0088:upgrade` — show status and next step +- `--tags GIP-0088:eligibility-integrate` — integrate REO with RM (governance TX) +- `--tags GIP-0088:issuance-connect` — connect IA to RM + minter role (governance TX) +- `--tags GIP-0088:issuance-allocate` — allocate issuance to RAM (governance TX) +- `--tags GIP-0088` — overall status + +All scripts are idempotent — they check on-chain state and skip if already done. Scripts do not presume a particular starting state. + +Sync runs automatically as a dependency of all scripts. + +### Deployment sequence + +```bash +# Deploy and configure all contracts +pnpm hardhat deploy --tags GIP-0088:upgrade,deploy --network +pnpm hardhat deploy --tags GIP-0088:upgrade,configure --network + +# Check status before transferring governance +pnpm hardhat deploy --tags GIP-0088:upgrade --network + +# Transfer governance — after this, deployer has no special access +pnpm hardhat deploy --tags GIP-0088:upgrade,transfer --network + +# Generate proxy upgrade governance TX batch +pnpm hardhat deploy --tags GIP-0088:upgrade,upgrade --network +# → execute governance TXs (see Environments below) + +# Activation goals (each generates governance TXs independently) +pnpm hardhat deploy --tags GIP-0088:eligibility-integrate --network +pnpm hardhat deploy --tags GIP-0088:issuance-connect --network +pnpm hardhat deploy --tags GIP-0088:issuance-allocate --network +# → execute governance TXs + +# Verify +pnpm hardhat deploy --tags GIP-0088 --network +``` + +### Preconditions + +Each script checks its own preconditions and skips if not met. Scripts do not presume a particular starting state — they are goal-seeking, not sequential steps. + +#### Deploy (`GIP-0088:upgrade,deploy`) + +| Contract | Precondition | Notes | +| ------------------------------------------ | ------------ | ----------------------------------------------------- | +| RC | — | No dependencies | +| SS implementation | RC deployed | SS has RC address baked into bytecode via `Directory` | +| RM, HS, DM, PE, L2Curation implementations | — | No deploy-time dependencies | +| IA, DefaultAllocation, Reclaim | — | Independent | +| RAM | — | Independent | +| REO A, REO B | — | Independent | + +#### Configure (`GIP-0088:upgrade,configure`) + +| Contract | Precondition | Notes | +| -------- | --------------------------------- | ---------------------------------------------------------------------------------------------- | +| RC | Deployed | setPauseGuardian | +| IA | Deployed, 0 < RM.issuancePerBlock | Rates, RM as 100% self-minting target, grant governor/pause roles | +| DA | Deployed (+ IA deployed) | Grant governor/pause roles, set as IA default target | +| REO A/B | Deployed | Grant governor/pause/operator roles. Validation enabled by operator post-deploy. | +| RAM | Deployed (+ RC, SS, IA deployed) | Grant governor/pause/collector/data-service roles, set issuance allocator | +| Reclaim | Deployed | Grant governor/pause roles | +| Reclaim | RM upgraded | Sets RM.defaultReclaimAddress — skips if RM not yet upgraded (handled by `04_upgrade` instead) | + +#### Transfer (`GIP-0088:upgrade,transfer`) + +| Contract | Precondition | Notes | +| -------- | ------------------------------- | --------------------------------------------------------------------------- | +| RC | Deployed | ProxyAdmin only — RC has no `GOVERNOR_ROLE`. Skips if owner is not deployer | +| IA | Configured | Revokes deployer GOVERNOR_ROLE, transfers ProxyAdmin | +| DA | Configured | Revokes deployer GOVERNOR_ROLE, transfers ProxyAdmin | +| RAM | Configured | Revokes deployer GOVERNOR_ROLE, transfers ProxyAdmin | +| Reclaim | Configured | Revokes deployer GOVERNOR_ROLE, transfers ProxyAdmin | +| REO A | Configured (all conditions met) | Revokes deployer GOVERNOR_ROLE, transfers ProxyAdmin | +| REO B | Configured (all conditions met) | Revokes deployer GOVERNOR_ROLE, transfers ProxyAdmin | + +#### Upgrade (`GIP-0088:upgrade,upgrade`) + +State-driven: builds a single governance TX batch from three groups. Each group skips items already on-chain. + +| Group | Items | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Proxy upgrades | Iterates registry; for any deployable proxy with `pendingImplementation`, adds proxy upgrade TX | +| Existing-contract config | `RC.setPauseGuardian(pauseGuardian)`; `RM.setDefaultReclaimAddress(reclaim)` (only after RM upgrade — bundle order means RM upgrade executes first in the same batch) | +| Deferred new-contract config | IA: `setIssuancePerBlock`, `grantRole(GOVERNOR/PAUSE)`. DA: `grantRole(GOVERNOR/PAUSE)`. RAM: `grantRole(COLLECTOR/DATA_SERVICE/GOVERNOR/PAUSE)` + `setIssuanceAllocator`. Reclaim: `grantRole(GOVERNOR/PAUSE)`. REO A/B: param setters + role grants. | + +These deferred items exist because configure runs as the deployer and skips items requiring `GOVERNOR_ROLE` on contracts the deployer doesn't yet control, or items that depend on RM being upgraded. + +#### Activation goals + +| Goal | Precondition | Notes | +| ----------------------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `eligibility-integrate` | RM upgraded, REO A deployed, oracle not already set | `RM.setProviderEligibilityOracle(REO_A)`. Skips if any oracle already set (does not override). | +| `issuance-connect` | RM upgraded, IA deployed + configured (rate matches RM) | Builds TX batch in order: `GraphToken.addMinter(IA)` → `RM.setIssuanceAllocator(IA)` → `IA.setTargetAllocation(RM, 0, rate)` → `IA.setDefaultTarget(DA)`. Order matters: `setTargetAllocation` calls `RM.onIssuanceChange` which requires the allocator already be set. **Exits on invariant failure** (IA rate ≠ RM rate). | +| `issuance-allocate` | IA deployed, RAM deployed, issuance-connect done | `IA.setTargetAllocation(RAM, allocatorMintingRate, selfMintingRate)`. Rates from `config/.json5`, skips if both are 0. | + +#### Optional goals + +| Goal | Precondition | Notes | +| ---------------------- | -------------------------------------- | ----------------------------------------------------- | +| `eligibility-revert` | RM upgraded (supports IRewardsManager) | RM.setRevertOnIneligible(true) | +| `issuance-close-guard` | SS upgraded | SS.setBlockClosingAllocationWithActiveAgreement(true) | + +### Environments + +The same commands apply to all environments. What differs is how governance TXs are executed. + +| Environment | Governance execution | Speed | +| ----------------- | ------------------------------------------------- | -------- | +| Fork (localhost) | `deploy:execute-governance` impersonates governor | Instant | +| Testnet (Sepolia) | `deploy:execute-governance` signs with EOA key | ~minutes | +| Mainnet (Arb One) | TX batch uploaded to Safe for council multisig | ~days | + +#### Fork testing + +Validates the full flow using account impersonation. See [LocalForkTesting.md](LocalForkTesting.md). + +```bash +anvil --fork-url --chain-id 31337 +pnpm hardhat deploy:reset-fork --network localhost + +# Deploy, configure, transfer +pnpm hardhat deploy --tags GIP-0088:upgrade,deploy --network localhost --skip-prompts +pnpm hardhat deploy --tags GIP-0088:upgrade,configure --network localhost --skip-prompts +pnpm hardhat deploy --tags GIP-0088:upgrade,transfer --network localhost --skip-prompts + +# Proxy upgrades +pnpm hardhat deploy --tags GIP-0088:upgrade,upgrade --network localhost --skip-prompts +pnpm hardhat deploy:execute-governance --network localhost + +# Activation +pnpm hardhat deploy --tags GIP-0088:eligibility-integrate --network localhost --skip-prompts +pnpm hardhat deploy:execute-governance --network localhost +pnpm hardhat deploy --tags GIP-0088:issuance-connect --network localhost --skip-prompts +pnpm hardhat deploy:execute-governance --network localhost +pnpm hardhat deploy --tags GIP-0088:issuance-allocate --network localhost --skip-prompts +pnpm hardhat deploy:execute-governance --network localhost + +# Verify +pnpm hardhat deploy --tags GIP-0088 --network localhost --skip-prompts +``` + +## See Also + +- [GovernanceWorkflow.md](GovernanceWorkflow.md) — governance TX generation and execution across environments +- [LocalForkTesting.md](LocalForkTesting.md) — fork mode testing setup and workflow +- [Architecture.md](Architecture.md) — deployment package architecture +- [deploy/ImplementationPrinciples.md](deploy/ImplementationPrinciples.md) — patterns and rules for deploy scripts diff --git a/packages/deployment/docs/GovernanceWorkflow.md b/packages/deployment/docs/GovernanceWorkflow.md index cceb117a0..7b4ade2ed 100644 --- a/packages/deployment/docs/GovernanceWorkflow.md +++ b/packages/deployment/docs/GovernanceWorkflow.md @@ -13,12 +13,11 @@ In fork mode, governance transactions can be executed automatically via account ### Setup ```bash -# Start a fork of arbitrumSepolia -FORK_NETWORK=arbitrumSepolia npx hardhat node --network fork +# Ephemeral: run deployment directly (state lost on exit) +FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags IssuanceAllocator:deploy --network fork -# In another terminal, run deployments -export FORK_NETWORK=arbitrumSepolia -npx hardhat deploy --tags issuance-allocator-deploy --network fork +# Or persistent: start anvil in Terminal 1, run deploys in Terminal 2 +# See LocalForkTesting.md for persistent fork setup ``` ### Execution @@ -26,15 +25,15 @@ npx hardhat deploy --tags issuance-allocator-deploy --network fork When a deployment generates a governance TX batch: 1. The TX batch is saved to `fork/fork/arbitrumSepolia/txs/*.json` -2. The deployment exits with code 1 (expected state - waiting for governance) -3. Execute the governance TXs automatically: +2. The script returns (it does **not** exit) — subsequent scripts in the run keep going and check their own preconditions, so a single command can produce several TX batches +3. Execute the saved governance TXs: ```bash npx hardhat deploy:execute-governance --network fork ``` 4. This uses `hardhat_impersonateAccount` to execute as the governor -5. Continue with deployments +5. Re-run the deployment command to continue past the governance boundary ## Testnet Mode with EOA Governor @@ -93,14 +92,14 @@ On mainnet (and testnets where Safe is deployed), governance transactions with S ```bash export DEPLOYER_PRIVATE_KEY=0xYOUR_PRIVATE_KEY -npx hardhat deploy --tags issuance-allocator-deploy --network arbitrumSepolia +npx hardhat deploy --tags IssuanceAllocator:deploy --network arbitrumSepolia ``` When governance action is required, the deployment will: - Generate a TX batch file in `txs/arbitrumSepolia/*.json` - Display the file path -- Exit with code 1 +- Return (not exit) — the run continues and other scripts check their own preconditions #### 2. Review the TX Batch @@ -156,7 +155,7 @@ This updates the address books with the new on-chain state. Re-run the original deployment command: ```bash -npx hardhat deploy --tags issuance-allocator-deploy --network arbitrumSepolia +npx hardhat deploy --tags IssuanceAllocator:deploy --network arbitrumSepolia ``` The deployment will detect that governance has executed and continue to the next steps. @@ -167,7 +166,7 @@ The deployment will detect that governance has executed and continue to the next ```bash # 1. Deploy new implementation -npx hardhat deploy --tags rewards-manager-deploy --network arbitrumSepolia +npx hardhat deploy --tags RewardsManager:deploy --network arbitrumSepolia # This generates: txs/arbitrumSepolia/upgrade-RewardsManager.json @@ -181,7 +180,7 @@ npx hardhat deploy --tags sync --network arbitrumSepolia ```bash # Deploy and configure (generates governance TX if needed) -npx hardhat deploy --tags issuance-activation --network arbitrumSepolia +npx hardhat deploy --tags IssuanceActivation --network arbitrumSepolia # Execute via Safe UI @@ -223,15 +222,16 @@ txs//executed/*.json | **EOA Direct** | Testnet with EOA governor | Automatic with private key | `GOVERNOR_PRIVATE_KEY=0x...` | | **Safe Multisig** | Production/mainnet | Manual via Safe Transaction Builder | None (auto-detected) | +**Fork mode is network-aware**: `FORK_NETWORK` is automatically ignored on real networks (arbitrumSepolia, arbitrumOne). Fork mode only activates on local networks (localhost, fork, hardhat), so you don't need to unset it when switching to real deployments. + **Transaction batch files** (Safe Transaction Builder JSON format) are always created in `txs//*.json` regardless of execution mode. ### Usage Examples -**Local fork testing:** +**Local fork testing (ephemeral):** ```bash -FORK_NETWORK=arbitrumSepolia npx hardhat node --network fork -npx hardhat deploy:execute-governance --network fork +FORK_NETWORK=arbitrumSepolia npx hardhat deploy:execute-governance --network fork ``` **Fast testnet iteration (EOA):** @@ -287,13 +287,15 @@ npx hardhat deploy:execute-governance --network arbitrumSepolia # Governor: 0x... (EOA) ``` -### Exit Code 1 +### No Exit on Governance Save + +When a script generates a governance TX batch, it **returns** rather than exiting. This: -When a deployment generates a governance TX batch, it exits with code 1. This: +- Lets a single command produce multiple governance TX batches in one run (one per script that needs governance authority) +- Avoids implicit ordering coupling — every script checks its own on-chain preconditions and skips if they aren't met +- Is normal flow, not an error condition -- Signals to CI/CD that manual intervention is required -- Prevents subsequent deployment steps from running -- Is not an error - it's expected state when waiting for governance +To detect "needs governance" in CI/CD, check whether any files exist under `txs//` after a run, or use the goal status scripts (`--tags GIP-0088`). ## Troubleshooting @@ -355,18 +357,17 @@ npx hardhat deploy:execute-governance --network arbitrumSepolia Before executing on mainnet, always test in fork mode: ```bash -# 1. Fork mainnet -FORK_NETWORK=arbitrumOne npx hardhat node --network fork - -# 2. Deploy (generates governance TXs) +# 1. Deploy (generates governance TXs) export FORK_NETWORK=arbitrumOne -npx hardhat deploy --tags issuance-allocator-deploy --network fork +npx hardhat deploy --tags IssuanceAllocator:deploy --network fork -# 3. Execute governance TXs automatically +# 2. Execute governance TXs automatically npx hardhat deploy:execute-governance --network fork -# 4. Verify state +# 3. Verify state npx hardhat deploy:status --network fork ``` +For persistent fork testing (state survives across commands), see [LocalForkTesting.md](./LocalForkTesting.md). + This tests the full governance workflow without touching real funds or requiring actual Safe signatures. diff --git a/packages/deployment/docs/LocalForkTesting.md b/packages/deployment/docs/LocalForkTesting.md index 7e7d70fe6..d6dbcdc09 100644 --- a/packages/deployment/docs/LocalForkTesting.md +++ b/packages/deployment/docs/LocalForkTesting.md @@ -8,7 +8,7 @@ State is lost when the command exits. Good for quick testing. ```bash # Run full deployment flow against forked arbitrumSepolia -FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags sync,rewards-manager-deploy --network fork +FORK_NETWORK=arbitrumSepolia npx hardhat deploy --tags sync,RewardsManager:deploy --network fork ``` ## Persistent Fork (multiple sessions) @@ -23,12 +23,10 @@ anvil --fork-url https://sepolia-rollup.arbitrum.io/rpc --chain-id 31337 ```bash # Terminal 2 - run deploys against it -# FORK_NETWORK tells deploy scripts which address books to use -export FORK_NETWORK=arbitrumSepolia npx hardhat deploy:reset-fork --network localhost npx hardhat deploy:status --network localhost npx hardhat deploy --network localhost --skip-prompts --tags sync -npx hardhat deploy --network localhost --skip-prompts --tags rewards-manager +npx hardhat deploy --network localhost --skip-prompts --tags RewardsManager npx hardhat deploy:execute-governance --network localhost ``` @@ -38,18 +36,22 @@ Or for Arbitrum One: anvil --fork-url https://arb1.arbitrum.io/rpc --chain-id 31337 ``` -```bash -export FORK_NETWORK=arbitrumOne -# ... -``` - **Important**: - Terminal 1: Use anvil (from Foundry) instead of `hardhat node` - Hardhat v3's node command doesn't properly support the `--fork` flag - Terminal 1: Use `--chain-id 31337` - anvil defaults to the forked chain's ID (421614) but hardhat's localhost expects 31337 -- Terminal 2: Set `FORK_NETWORK` env var - tells deploy scripts to: - - Load the correct network's address books (not localhost's empty ones) - - Generate Safe TX files with the correct chainId (421614, not 31337) + +### Fork Network Detection + +The fork network (which chain is being forked) is **auto-detected** from anvil's RPC metadata. When you run against localhost, deploy scripts query `anvil_nodeInfo` to get the fork URL and match it against known network RPC hostnames. + +You can also set `FORK_NETWORK` explicitly to override auto-detection: + +```bash +export FORK_NETWORK=arbitrumSepolia +``` + +**Safe on real networks**: `FORK_NETWORK` is automatically ignored when running against real networks (`--network arbitrumSepolia`, `--network arbitrumOne`). Fork mode only activates on local networks (localhost, fork, hardhat), so you don't need to unset `FORK_NETWORK` when switching between fork testing and real deployments. ## Architecture @@ -80,12 +82,12 @@ deployments/ # Managed by rocketh (deployment records, .chain f ## Key Points -| Setting | Value | Purpose | -| --------------------- | ---------------------------------- | -------------------------------- | -| `FORK_NETWORK` | `arbitrumSepolia` or `arbitrumOne` | Which network to fork | -| `SHOW_ADDRESSES` | `0`, `1` (default), or `2` | Address display: none/short/full | -| `--network fork` | in-process EDR | Ephemeral, fast startup | -| `--network localhost` | external node | Persistent state | +| Setting | Value | Purpose | +| --------------------- | ---------------------------------- | -------------------------------------------------------------- | +| `FORK_NETWORK` | `arbitrumSepolia` or `arbitrumOne` | Override auto-detected fork network (ignored on real networks) | +| `SHOW_ADDRESSES` | `0`, `1` (default), or `2` | Address display: none/short/full | +| `--network fork` | in-process EDR | Ephemeral, fast startup | +| `--network localhost` | external node | Persistent state | ## Configuration @@ -136,6 +138,33 @@ npx hardhat deploy:reset-fork --network fork - **Foundry**: Install via `curl -L https://foundry.paradigm.xyz | bash && foundryup` +## Local Network (rem-local-network) + +The `localNetwork` network targets the Graph local network docker-compose stack (chain ID 1337). +Unlike fork mode, contracts are deployed fresh from scratch. + +```bash +# Deploy a single contract via its component lifecycle +npx hardhat deploy --tags IssuanceAllocator,deploy --network localNetwork + +# Or run the full GIP-0088 upgrade phase +npx hardhat deploy --tags GIP-0088:upgrade,deploy --network localNetwork +``` + +**Key differences from fork mode:** + +- Chain ID 1337 (not 31337) +- No `FORK_NETWORK` env var needed +- Address books use `addresses-local-network.json` files (symlinked to mounted config) +- Deployer is also governor (direct execution, no governance batch files) +- Uses standard test mnemonic (`test test test ... junk`) + +**Environment:** + +- RPC: `http://chain:8545` (override with `LOCAL_NETWORK_RPC`) +- Address books are populated by Phase 1 (hardhat-graph-protocol deploys Horizon + SubgraphService) +- Phase 2+ deployment scripts use this package to deploy additional contracts (e.g., issuance) + ## See Also - [GovernanceWorkflow.md](./GovernanceWorkflow.md) - Production deployment flow diff --git a/packages/deployment/docs/SyncBytecodeDetectionFix.md b/packages/deployment/docs/SyncBytecodeDetectionFix.md new file mode 100644 index 000000000..5c4498fd1 --- /dev/null +++ b/packages/deployment/docs/SyncBytecodeDetectionFix.md @@ -0,0 +1,149 @@ +# Sync Bytecode Detection Fix + +## Issues Identified + +### Issue 1: Local Bytecode Changes Ignored + +**Problem**: Deploy incorrectly reported "implementation unchanged" when local bytecode had actually changed. + +**Evidence**: + +``` +Local artifact: 0x9c25d2f93e6a2a34cc19d00224872e288a8392d5d99b2df680b7e978d148d450 +On-chain: 0xfafdeb48fae37e277e007e7b977f3cd124065ac1c27ed5208982c2965cf07008 +Address book: 0x4805a902756c8f4421c2a2710dcc76885ffd01d7777bbe6cab010fe9748b7efa +``` + +All three hashes are different, yet deploy said "unchanged", meaning local changes would be ignored. + +### Issue 2: Confusing Sync Behavior + +**Problem**: Sync showed "code changed" but didn't handle the state appropriately: + +1. Showed △ (code changed) indicator +2. But didn't sync implementation to rocketh +3. Saved proxy record with wrong bytecode +4. This confused rocketh's change detection + +## Root Causes + +### Cause 1: Missing/Stale Bytecode Hash + +When the address book had no bytecode hash (or wrong hash): + +- Sync detected "code changed" ([sync-utils.ts:475-477](../lib/sync-utils.ts#L475-L477)) +- But only synced to rocketh if hash matched ([sync-utils.ts:653](../lib/sync-utils.ts#L653)) +- This left rocketh with incomplete/wrong state + +### Cause 2: Wrong Bytecode Stored for Proxy + +The sync step saved the **implementation's bytecode** under the **proxy's deployment record**: + +- Lines 508-532: Created proxy record with implementation artifact bytecode +- This is wrong - proxy should have its own bytecode (or none) +- Rocketh then compared wrong bytecode and gave incorrect results + +## Fixes Applied + +### Fix 1: Hash Comparison and Stale Record Cleanup ([sync-utils.ts:645-679](../lib/sync-utils.ts#L645-L679)) + +When sync processes an implementation: + +1. **Compare local artifact hash to address-book-stored hash** +2. **If hashes match**: sync the implementation record to rocketh normally +3. **If hashes don't match**: overwrite any stale rocketh record with empty bytecode, forcing a fresh deployment + + ```typescript + if (storedHash && localHash) { + hashMatches = storedHash === localHash + } + + // Clean up stale rocketh record if hash doesn't match + if (!hashMatches && existingImpl) { + // Overwrite stale record with empty bytecode - forces fresh deployment + await env.save(`${spec.name}_Implementation`, { + address: existingImpl.address, + bytecode: '0x', + deployedBytecode: undefined, + ... + }) + } + ``` + +This ensures rocketh correctly detects when local code has changed and triggers a new deployment. + +### Fix 2: Don't Store Wrong Bytecode for Proxy ([sync-utils.ts:508-532](../lib/sync-utils.ts#L508-L532)) + +Changed proxy record creation to **NOT include implementation bytecode**: + +```typescript +// Before: +bytecode: artifact.bytecode // ← Wrong! This is implementation bytecode +deployedBytecode: artifact.deployedBytecode + +// After: +bytecode: '0x' // ← Correct! Proxy record doesn't need bytecode +deployedBytecode: undefined +``` + +This ensures rocketh only uses implementation bytecode for the actual implementation record. + +## Expected Behavior After Fix + +### Scenario 1: Local Matches Address Book + +When local artifact hash matches the stored hash, sync proceeds normally and rocketh +correctly reports the implementation as unchanged. + +### Scenario 2: Local Code Changed + +**Before**: + +``` +△ SubgraphService @ 0xc24A3dAC... → 0x2af1b0ed... (code changed) +✓ SubgraphService implementation unchanged ← WRONG! +``` + +**After**: + +``` +△ SubgraphService @ 0xc24A3dAC... → 0x2af1b0ed... (local code changed) +📋 New SubgraphService implementation deployed: 0x... ← NEW! + Storing as pending implementation... +``` + +Deploy correctly detects the change and deploys new implementation. + +### Scenario 3: Stale Rocketh Record + +When the hash doesn't match and a stale rocketh record exists, sync overwrites it +with empty bytecode. This forces the next deploy to create a fresh implementation +record rather than incorrectly reporting "unchanged". + +## Testing + +To verify the fix works: + +```bash +# Clean build +cd packages/deployment +pnpm build + +# Run sync - should now show clearer messages +npx hardhat deploy --skip-prompts --network arbitrumSepolia --tags sync + +# Run deploy - should correctly detect local changes +npx hardhat deploy --skip-prompts --network arbitrumSepolia --tags SubgraphService +``` + +## Migration Notes + +- **No manual migration needed** - stale rocketh records are cleaned up automatically +- First sync after fix will detect hash mismatches and clear stale records +- Subsequent deploys will create fresh implementation records + +## Related Files + +- [sync-utils.ts](../lib/sync-utils.ts) - Main fix implementation +- [deploy-implementation.ts](../lib/deploy-implementation.ts) - Deploy logic (unchanged, now works correctly) +- [check-bytecode.ts](../scripts/check-bytecode.ts) - Diagnostic script for manual verification diff --git a/packages/deployment/docs/deploy/ImplementationPrinciples.md b/packages/deployment/docs/deploy/ImplementationPrinciples.md index 1c3134e2e..9226611a9 100644 --- a/packages/deployment/docs/deploy/ImplementationPrinciples.md +++ b/packages/deployment/docs/deploy/ImplementationPrinciples.md @@ -16,104 +16,134 @@ This document defines the core principles and patterns for writing deployment sc **Standard step objectives:** -- **01_deploy.ts** - Deploy proxy + implementation, initialize with deployer or governor - - MUST explicitly depend on `SpecialTags.SYNC` (even if also available transitively through other dependencies) +- **01_deploy.ts** - Deploy proxy + implementation, initialize with deployer + - Sync the contract being deployed (and any contracts it reads) immediately + before acting via `syncComponentFromRegistry` / + `syncComponentsFromRegistry`. The script factories + (`createProxyDeployModule`, `createImplementationDeployModule`, + `createUpgradeModule`, etc.) handle this automatically. + - For a global pre-deploy reconciliation, use `npx hardhat deploy:sync` + explicitly — it is no longer pulled in as an automatic dependency. - Each script should declare its own prerequisites explicitly, not rely on transitive dependencies - **02_upgrade.ts** - Handle proxy upgrades via governance (generates TX batch) -- **03-08 (flexible)** - Intermediate steps vary by component: - - Configure integration with other contracts - - Verify governance state - - Transfer governance roles - - Generate activation TX batches - - Deploy shared implementations +- **04_configure.ts** - Deployer-only configure: role grants and params on contracts where the deployer is governor +- **05_transfer_governance.ts** - Revoke deployer GOVERNOR_ROLE; transfer ProxyAdmin to protocol governor +- **06_integrate.ts** (optional) - Wire the contract into the rest of the protocol - **09_end.ts** - End state aggregate (only has dependencies and verification, no execution) +- **10_status.ts** - Read-only status display (see below) + +The `03_*` slot is intentionally left empty so that `02_upgrade` can be inserted as a clearly distinct phase without renumbering. The `04_configure` numbering is the actual convention used throughout the tree. + +### Principle: Status Scripts Are Read-Only + +**Rule**: `10_status.ts` scripts MUST be purely read-only. They MUST NOT make on-chain changes, write transactions, or modify any state. + +**Why**: When `--tags ` is run without an action verb, only status scripts execute. Users rely on this for safe inspection of deployment state at any time — during planning, mid-deployment, and in production. Any mutation in a status script would violate this trust and could cause unintended state changes. + +**How it works**: + +1. Status scripts use `createStatusModule()`, which gates on `noTagsRequested()` — they only run when tags are present but no action verb is included +2. Stage scripts (01-08) use `shouldSkipAction(verb)` — they skip when their action verb is absent from `--tags` +3. Combined: `--tags GIP-0088` alone runs only `10_status.ts` (status reads on-chain directly and does not need a global sync first) + +**Pattern**: + +```typescript +// Component status — delegates to showDetailedComponentStatus (reads only) +export default createStatusModule(Contracts.issuance.IssuanceAllocator) + +// Goal status — custom handler, must only use readContract/getCode +export default createStatusModule(GoalTags.GIP_0088, async (env) => { + const client = graph.getPublicClient(env) as PublicClient + // ✅ Read on-chain state and display + const value = await client.readContract({ ... }) + env.showMessage(` ${value ? '✓' : '✗'} check description`) + // ❌ NEVER: execute(), tx(), deploy(), process.exit(1), TxBuilder +}) +``` + +**Invariant**: If a script is named `10_status.ts`, it contains zero writes. No exceptions. #### Example: RewardsEligibilityOracle (simple - 4 steps) ``` -01_deploy.ts - Deploy proxy + implementation, initialize with governor -02_upgrade.ts - Handle upgrades -03_configure.ts - Integrate with RewardsManager +01_deploy.ts - Deploy proxy + implementation +02_upgrade.ts - Handle proxy upgrades (governance TX batch) +04_configure.ts - Deployer-only configure (params, role grants) 09_end.ts - End state aggregate +10_status.ts - Read-only status display ``` -#### Example: IssuanceAllocator (complex - 8 steps) +#### Example: RewardsEligibilityOracle (full lifecycle) ``` 01_deploy.ts - Deploy proxy + implementation -02_upgrade.ts - Handle upgrades -03_deploy.ts - Deploy DirectAllocation implementation -04_configure.ts - Configure issuance rate and allocations -05_verify_governance.ts - Verify governance state -06_transfer_governance.ts - Transfer roles to governance -07_activate.ts - Generate activation TX batch +02_upgrade.ts - Handle proxy upgrades +04_configure.ts - Configure params + role grants +05_transfer_governance.ts - Revoke deployer role + transfer ProxyAdmin +06_integrate.ts - Wire into RewardsManager (governance TX) 09_end.ts - End state aggregate +10_status.ts - Read-only status display ``` -**Note:** Steps 04-08 are flexible and vary by component. Always use `09_end.ts` for the final aggregate. +**Note:** Step `03_*` is intentionally left empty so `02_upgrade` stays a clearly separate phase. Steps 04-08 are flexible and vary by component. Always use `09_end.ts` for the aggregate and `10_status.ts` for read-only status. #### Tag structure in deployment-tags.ts ```typescript -// Example: RewardsEligibilityOracle lifecycle -rewardsEligibilityDeploy: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.DEPLOY)], -rewardsEligibilityUpgrade: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.UPGRADE)], -rewardsEligibilityConfigure: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.CONFIGURE)], -rewardsEligibility: [ComponentTags.REWARDS_ELIGIBILITY], // Aggregate end state +// Component tags are PascalCase contract names matching the registry +ComponentTags = { + REWARDS_ELIGIBILITY_A: 'RewardsEligibilityOracleA', + // ... +} + +// Action verbs are appended via --tags Component,verb +// e.g. --tags RewardsEligibilityOracleA,deploy ``` ## Exit Codes and Flow Control -### Principle: Clean Exits for Expected Prerequisites +### Principle: Scripts Are Goal-Seeking, Not Sequential Steps -**Rule**: When a deployment step cannot complete due to an expected prerequisite state (NOT an exception), it MUST exit with code 1 to prevent subsequent steps from running. +**Rule**: Each script checks its own preconditions and skips if not met. Scripts return (not exit) when work cannot proceed — subsequent scripts check their own state independently. -**Rationale**: Steps should be able to rely on prerequisite steps stopping if not complete. This prevents cascading failures and incorrect state. +**Rationale**: Scripts run in sequence but must not assume a particular starting state. Each script is idempotent and goal-seeking: it checks on-chain state, does what's needed, and returns. **Examples**: ```typescript -// CORRECT: Exit with code 1 when prerequisite not met -export async function requireRewardsManagerUpgraded( - client: PublicClient, - rmAddress: string, - env: Environment, -): Promise { - const upgraded = await isRewardsManagerUpgraded(client, rmAddress) - if (!upgraded) { - env.showMessage(`\n❌ RewardsManager has not been upgraded yet`) - env.showMessage(` Run: npx hardhat deploy:execute-governance --network ${env.name}`) - process.exit(1) // Clean exit - prevents next steps - } -} - -// CORRECT: Exit after generating governance TX -const txFile = builder.saveToFile() -env.showMessage(`\n✓ TX batch saved: ${txFile}`) -env.showMessage('\n📋 GOVERNANCE ACTION REQUIRED') -process.exit(1) // Prevents next steps until governance TX executed +// CORRECT: Save governance TX and return (allows subsequent scripts to run) +saveGovernanceTx(env, builder, `ContractName activation`) +// Returns — subsequent scripts check their own preconditions -// WRONG: Returning allows next steps to run +// CORRECT: Skip when precondition not met if (!prerequisiteMet) { - env.showMessage('⚠️ Prerequisite not met') - return // ❌ Next step will still run! + env.showMessage(' ○ Prerequisite not met — skipping') + return +} + +// CORRECT: Use shared precondition check to skip if done +const precondition = await checkIAConfigured(client, ia.address, rm.address) +if (precondition.done) { + env.showMessage('✅ Already configured') + return } ``` ### When to Use Exit Code 1 -Use `process.exit(1)` when: +Use `process.exit(1)` only for: -- Waiting for a governance TX to be executed -- Waiting for a contract upgrade to complete -- Checking a required prerequisite state -- External action needed before continuing +- **Migration invariant violations** (data corruption risk, e.g. IA rate != RM rate before connection) +- **Verification failures** in `09_end` scripts +- **Sync failures** (can't proceed without address books) -Do NOT use `process.exit(1)` when: +Do NOT use `process.exit(1)` for: +- Governance TX generation (use `saveGovernanceTx` which returns) +- Preconditions not met (return/skip, let subsequent scripts check their own preconditions) - Configuration already correct (idempotent check passed) - Script successfully completed its work -- Skipping optional steps ### When to Throw Exceptions @@ -274,15 +304,17 @@ const value = (await client.readContract({ **Pattern**: ```typescript -import { createGovernanceTxBuilder, saveGovernanceTxAndExit } from '@graphprotocol/deployment/lib/execute-governance.js' -import { getGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' -import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { + createGovernanceTxBuilder, + executeTxBatchDirect, + saveGovernanceTx, +} from '@graphprotocol/deployment/lib/execute-governance.js' +import { canSignAsGovernor } from '@graphprotocol/deployment/lib/controller-utils.js' -// Get protocol governor -const governor = await getGovernor(env) +const { governor, canSign } = await canSignAsGovernor(env) // Create TX builder (handles chainId, outputDir, template automatically) -const builder = createGovernanceTxBuilder(env, `action-${Contracts.ContractName.name}`, { +const builder = await createGovernanceTxBuilder(env, `action-${contractName}`, { name: 'Human Readable Name', description: 'What this TX batch does', }) @@ -291,9 +323,13 @@ const builder = createGovernanceTxBuilder(env, `action-${Contracts.ContractName. builder.addTx({ to: contractAddress, value: '0', data: encodedCalldata }) env.showMessage(` + ContractName.functionName(args)`) -// Save and exit using utility -saveGovernanceTxAndExit(env, builder, `${Contracts.ContractName.name} activation`) -// Never returns - exits with code 1 to prevent next steps +// Execute directly if possible, otherwise save for governance +if (canSign) { + await executeTxBatchDirect(env, builder, governor) +} else { + saveGovernanceTx(env, builder, `${contractName} activation`) +} +// Returns — does NOT exit. Subsequent scripts check their own preconditions. ``` ### Metadata Standards @@ -485,7 +521,7 @@ const contract = requireContract(env, 'RewardsManager') ``` deploy/ docs/deploy/ allocate/ IssuanceAllocatorDeployment.md - allocator/ PilotAllocationDeployment.md + allocator/ DirectAllocationDeployment.md 01_deploy.ts rewards/ 02_upgrade.ts RewardsEligibilityOracleDeployment.md 09_end.ts @@ -541,7 +577,7 @@ For contract architecture and technical details, see [IssuanceAllocator.md](../. For every deployment script: -- [ ] Uses `process.exit(1)` for expected prerequisite states +- [ ] Uses `return` (not `process.exit`) for precondition skips and governance TX saves - [ ] Throws exceptions only for unexpected errors - [ ] Is idempotent (checks state, skips if done) - [ ] Uses package imports (`@graphprotocol/deployment`) not relative paths @@ -551,13 +587,15 @@ For every deployment script: - [ ] Works in both fork and production modes - [ ] Has clear, actionable error messages with dynamic values - [ ] Includes comprehensive documentation -- [ ] Follows standard script structure (01_deploy, 02_upgrade, ..., 09_end) +- [ ] Follows standard script structure (01_deploy, 02_upgrade, ..., 09_end, 10_status) - [ ] Properly configures tags and dependencies - [ ] End state script is always `09_end.ts` with only dependencies +- [ ] `10_status.ts` is purely read-only (zero writes, zero TXs, zero exits) ### Anti-Patterns to Avoid -❌ Returning early without exit code when prerequisite not met +❌ Using `process.exit(1)` for precondition skips or governance TX saves (use `return`) +❌ Duplicating precondition checks instead of using shared functions from `lib/preconditions.ts` ❌ Duplicating code instead of using shared utilities ❌ Using relative imports (`../../lib/`) instead of package imports ❌ Using string literals instead of `Contracts` registry @@ -568,5 +606,5 @@ For every deployment script: ❌ Direct address book imports instead of `graph.get*AddressBook()` ❌ Vague error messages without actionable next steps ❌ Non-idempotent scripts that fail on re-run -❌ Generating governance TXs without exiting with code 1 ❌ Using non-standard end script numbering (use `09_end.ts` always) +❌ Any mutation (write, TX, deploy, exit) in a `10_status.ts` script diff --git a/packages/deployment/docs/deploy/IssuanceAllocatorDeployment.md b/packages/deployment/docs/deploy/IssuanceAllocatorDeployment.md index 553157fbd..60a110de5 100644 --- a/packages/deployment/docs/deploy/IssuanceAllocatorDeployment.md +++ b/packages/deployment/docs/deploy/IssuanceAllocatorDeployment.md @@ -1,160 +1,82 @@ # IssuanceAllocator Deployment -This document describes the deployment sequence for IssuanceAllocator. For contract architecture, behavior, and technical details, see [IssuanceAllocator.md](../../../../issuance/contracts/allocate/IssuanceAllocator.md). +This document describes how `IssuanceAllocator` is deployed by this package. For contract architecture, behaviour, and technical details, see [IssuanceAllocator.md](../../../issuance/contracts/allocate/IssuanceAllocator.md). -## Prerequisites +For the goal-level GIP-0088 workflow that orchestrates IA together with the rest of the upgrade, see [Gip0088.md](../Gip0088.md). -- GraphToken contract deployed -- RewardsManager upgraded with `setIssuanceAllocator()` function -- GraphIssuanceProxyAdmin deployed with protocol governance as owner +## Component overview -## Deployment Overview +`IssuanceAllocator` is a deployable proxy in the `issuance` address book: -The deployment strategy safely replicates existing issuance configuration during RewardsManager migration: +- Pattern: OpenZeppelin v5 `TransparentUpgradeableProxy` with a per-proxy `ProxyAdmin` created in the constructor. +- Access control: `BaseUpgradeable` (`GOVERNOR_ROLE`, `PAUSE_ROLE`). +- Component tag: `IssuanceAllocator`. Lifecycle actions: `deploy`, `upgrade`, `configure`, `transfer`. +- Default target: a separate `DefaultAllocation` proxy ([../../deploy/allocate/default/](../../deploy/allocate/default/)) that holds any unallocated issuance as a safety net. -- Default target starts as `address(0)` (that will not be minted to), allowing initial configuration without minting to any targets -- Deployment uses atomic initialization via proxy constructor (prevents front-running) -- Deployment account performs initial configuration, then transfers control to governance -- Granting of minter role can be delayed until replication of initial configuration with upgraded RewardsManager is verified to allow seamless transition to use of IssuanceAllocator -- **Governance control**: This contract uses OpenZeppelin's TransparentUpgradeableProxy pattern (not custom GraphProxy). GraphIssuanceProxyAdmin (owned by protocol governance) controls upgrades, while GOVERNOR_ROLE controls operations. The same governance address should have both roles. +## Lifecycle scripts -For the general governance-gated upgrade workflow, see [GovernanceWorkflow.md](../../../docs/GovernanceWorkflow.md). +| Script | Tag | Actor | Purpose | +| -------------------------------------------------------------------------------------- | ----------------------------- | ---------- | -------------------------------------------------------------------------- | +| [01_deploy.ts](../../deploy/allocate/allocator/01_deploy.ts) | `IssuanceAllocator,deploy` | Deployer | Deploy proxy + implementation, initialize with deployer as governor | +| [02_upgrade.ts](../../deploy/allocate/allocator/02_upgrade.ts) | `IssuanceAllocator,upgrade` | Governance | Build governance TX batch upgrading the proxy to its pendingImplementation | +| [04_configure.ts](../../deploy/allocate/allocator/04_configure.ts) | `IssuanceAllocator,configure` | Deployer | Set issuance rate (matches RM), grant `GOVERNOR_ROLE` and `PAUSE_ROLE` | +| [06_transfer_governance.ts](../../deploy/allocate/allocator/06_transfer_governance.ts) | `IssuanceAllocator,transfer` | Deployer | Revoke deployer `GOVERNOR_ROLE`, transfer per-proxy ProxyAdmin to gov | +| [09_end.ts](../../deploy/allocate/allocator/09_end.ts) | `IssuanceAllocator,all` | - | Aggregate end state — verifies upgrade has been executed | +| [10_status.ts](../../deploy/allocate/allocator/10_status.ts) | `IssuanceAllocator` | - | Read-only status display | -## Deployment Sequence +`03_*`, `05_*`, and `07_08_*` slots are intentionally empty (per [ImplementationPrinciples.md](ImplementationPrinciples.md)). -### Step 1: Deploy and Initialize (deployment account) +## What does NOT happen here -**Script:** [01_deploy.ts](./01_deploy.ts) +The following operations are part of GIP-0088 activation, not the IA component lifecycle. They live in [../../deploy/gip/0088/](../../deploy/gip/0088/) and are governance TXs: -- Deploy IssuanceAllocator implementation with GraphToken address -- Deploy TransparentUpgradeableProxy with implementation, GraphIssuanceProxyAdmin, and initialization data -- **Atomic initialization**: `initialize(deploymentAccountAddress)` called via proxy constructor -- Deployment account receives GOVERNOR_ROLE (temporary, for configuration) -- Automatically creates default target at `targetAddresses[0] = address(0)` -- Sets `lastDistributionBlock = block.number` -- **Security**: Front-running prevented by atomic deployment + initialization +- `IA.setTargetAllocation(RM, 0, rate)` — registers RM as the 100% self-minting target +- `IA.setDefaultTarget(DA)` — wires the safety net +- `RM.setIssuanceAllocator(IA)` — RM starts querying IA for its issuance rate +- `GraphToken.addMinter(IA)` — gives IA minter authority (only needed for allocator-minting targets) +- `IA.setTargetAllocation(RAM, allocatorRate, selfRate)` — distributes issuance to `RecurringAgreementManager` -### Step 2: Set Issuance Rate (deployment account) +These are bundled into the `GIP-0088:upgrade,upgrade` and `GIP-0088:issuance-connect` / `GIP-0088:issuance-allocate` governance batches. See [Gip0088.md](../Gip0088.md) for the full picture. -**Script:** [02_configure.ts](./02_configure.ts) +## Single-component usage -- Query current rate from RewardsManager: `rate = rewardsManager.issuancePerBlock()` -- Call `setIssuancePerBlock(rate)` to replicate existing rate -- All issuance allocated to default target (`address(0)`) -- No tokens minted (default target cannot receive mints) +```bash +# Read-only status +pnpm hardhat deploy --tags IssuanceAllocator --network -### Step 3: Assign RewardsManager Allocation (deployment account) +# Lifecycle steps +pnpm hardhat deploy --tags IssuanceAllocator,deploy --network +pnpm hardhat deploy --tags IssuanceAllocator,configure --network +pnpm hardhat deploy --tags IssuanceAllocator,transfer --network +pnpm hardhat deploy --tags IssuanceAllocator,upgrade --network +``` -**Script:** [02_configure.ts](./02_configure.ts) +The same scripts run as part of the goal-level GIP-0088 flow when invoked via `--tags GIP-0088:upgrade,`. -- Call `setTargetAllocation(rewardsManagerAddress, 0, issuancePerBlock)` -- `allocatorMintingRate = 0` (RewardsManager will self-mint) -- `selfMintingRate = issuancePerBlock` (RewardsManager receives 100% allocation) -- Default target automatically adjusts to zero allocation +## Verification checklist -### Step 4: Verify Configuration Before Transfer (deployment account) +Run `--tags IssuanceAllocator` (component status) or `--tags GIP-0088:upgrade` (goal status) to inspect on-chain state. The status output already covers everything below — this list is for reviewing a finished deployment by hand. -**Script:** [02_configure.ts](./02_configure.ts) +### Bytecode -- Verify contract is not paused (`paused()` returns false) -- Verify `getIssuancePerBlock()` returns expected rate (matches RewardsManager) -- Verify `getTargetAllocation(rewardsManager)` shows correct self-minting configuration -- Verify only two targets exist: `targetAddresses[0] = address(0)` and `targetAddresses[1] = rewardsManager` -- Verify default target is `address(0)` with zero allocation -- Contract is ready to transfer control to governance +- Implementation bytecode matches the expected `IssuanceAllocator` contract -### Step 5: Distribute Issuance (anyone - no role required) +### Access control -**Script:** [02_configure.ts](./02_configure.ts) +- Protocol governor holds `GOVERNOR_ROLE` +- Pause guardian holds `PAUSE_ROLE` +- Deployer does **not** hold `GOVERNOR_ROLE` (asserted by `checkDeployerRevoked` in the transfer step) +- Per-proxy `ProxyAdmin` is owned by the protocol governor -- Call `distributeIssuance()` to bring contract to fully current state -- Updates `lastDistributionBlock` to current block -- Verifies distribution mechanism is functioning correctly -- No tokens minted (no minter role yet, all allocation to self-minting RM) +### Configuration -### Step 6: Set Pause Controls and Transfer Governance (deployment account) +- `getIssuancePerBlock()` matches `RewardsManager.issuancePerBlock()` +- `paused()` is `false` -**Script:** [03_transfer_governance.ts](./03_transfer_governance.ts) +### Activation (GIP-0088) -- Grant PAUSE_ROLE to pause guardian (same account as used for RewardsManager pause control) -- Grant GOVERNOR_ROLE to actual governor address (protocol governance multisig) -- Revoke GOVERNOR_ROLE from deployment account (MUST grant to governance first, then revoke) -- **Note**: Upgrade control (via GraphIssuanceProxyAdmin) is separate from GOVERNOR_ROLE - -### Step 7: Verify Deployment and Configuration (governor) - -**Script:** [04_verify.ts](./04_verify.ts) - -**Bytecode verification:** - -- Verify deployed implementation bytecode matches expected contract - -**Access control:** - -- Verify governance address has GOVERNOR_ROLE -- Verify deployment account does NOT have GOVERNOR_ROLE -- Verify pause guardian has PAUSE_ROLE -- **Off-chain**: Review all RoleGranted events since deployment to verify no other addresses have GOVERNOR_ROLE or PAUSE_ROLE - -**Pause state:** - -- Verify contract is not paused (`paused()` returns false) - -**Issuance rate:** - -- Verify `getIssuancePerBlock()` matches RewardsManager rate exactly - -**Target configuration:** - -- Verify only two targets exist: `targetAddresses[0] = address(0)` and `targetAddresses[1] = rewardsManager` -- Verify default target is `address(0)` with zero allocation -- Verify `getTargetAllocation(rewardsManager)` shows correct self-minting allocation (100%) - -**Proxy configuration:** - -- Verify GraphIssuanceProxyAdmin controls the proxy -- Verify GraphIssuanceProxyAdmin owner is protocol governance - -### Step 8: Configure RewardsManager (governor) - -**Script:** [05_configure_rewards_manager.ts](./05_configure_rewards_manager.ts) - -- Call `rewardsManager.setIssuanceAllocator(issuanceAllocatorAddress)` -- RewardsManager will now query IssuanceAllocator for its issuance rate -- RewardsManager continues to mint tokens itself (self-minting) - -### Step 9: Grant Minter Role (governor, only when configuration verified) - -**Script:** [06_grant_minter.ts](./06_grant_minter.ts) - -- Grant minter role to IssuanceAllocator on Graph Token - -### Step 10: Set Default Target (governor, optional, recommended) - -**Script:** [07_set_default_target.ts](./07_set_default_target.ts) - -- Call `setDefaultTarget()` to receive future unallocated issuance - -## Normal Operation - -After deployment: - -1. Targets or external actors call `distributeIssuance()` periodically -2. Governor adjusts issuance rates as needed via `setIssuancePerBlock()` -3. Governor adds/removes/modifies targets via `setTargetAllocation()` overloads -4. Self-minting targets query their allocation via `getTargetIssuancePerBlock()` - -## Emergency Scenarios - -- **Gas limit issues**: Use pause, individual notifications, and `minDistributedBlock` parameters with `distributePendingIssuance()` -- **Target failures**: Use `forceTargetNoChangeNotificationBlock()` to skip notification, then remove problematic targets by setting both rates to 0 -- **Configuration while paused**: Call `distributePendingIssuance(blockNumber)` first, then use `minDistributedBlock` parameter in setter functions - -## L1 Bridge Integration - -When `setIssuancePerBlock()` is called, the L1GraphTokenGateway's `updateL2MintAllowance()` function must be called to ensure the bridge can mint the correct amount of tokens on L2. - -## See Also - -- [IssuanceAllocator.md](../../../../issuance/contracts/allocate/IssuanceAllocator.md) - Contract architecture and technical details -- [GovernanceWorkflow.md](../../../docs/GovernanceWorkflow.md) - General governance-gated upgrade workflow +- `RewardsManager.getIssuanceAllocator()` returns the IA address +- `GraphToken.isMinter(IA)` is `true` (only when allocator-minting targets exist) +- `getTargetAllocation(RM)` shows `selfMintingRate == issuancePerBlock`, `allocatorMintingRate == 0` +- `getTargetAllocation(RAM)` matches `config/.json5` rates +- Default target points at `DefaultAllocation` diff --git a/packages/deployment/docs/deploy/RewardsEligibilityOracleDeployment.md b/packages/deployment/docs/deploy/RewardsEligibilityOracleDeployment.md index 9a5c1bfde..e8e9d2968 100644 --- a/packages/deployment/docs/deploy/RewardsEligibilityOracleDeployment.md +++ b/packages/deployment/docs/deploy/RewardsEligibilityOracleDeployment.md @@ -5,7 +5,7 @@ Deployment guide for RewardsEligibilityOracle (REO). **Related:** - [Contract specification](../../../issuance/contracts/eligibility/RewardsEligibilityOracle.md) - architecture, operations, troubleshooting -- [GovernanceWorkflow.md](./GovernanceWorkflow.md) - Safe TX execution +- [GovernanceWorkflow.md](../GovernanceWorkflow.md) - Safe TX execution ## Prerequisites @@ -17,26 +17,41 @@ Deployment guide for RewardsEligibilityOracle (REO). All scripts are idempotent. -| Script | Tag | Actor | Purpose | -| --------------------------------------------------------------------------------------- | ----------------------------------------- | ------------------- | -------------------------------------- | -| [01_deploy.ts](../../deploy/rewards/eligibility/01_deploy.ts) | `rewards-eligibility-deploy` | Deployer | Deploy proxy + implementation | -| [02_upgrade.ts](../../deploy/rewards/eligibility/02_upgrade.ts) | `rewards-eligibility-upgrade` | Governance | Upgrade implementation | -| [04_configure.ts](../../deploy/rewards/eligibility/04_configure.ts) | `rewards-eligibility-configure` | Deployer/Governance | Set parameters | -| [05_transfer_governance.ts](../../deploy/rewards/eligibility/05_transfer_governance.ts) | `rewards-eligibility-transfer-governance` | Deployer | Grant roles, transfer to governance | -| [06_integrate.ts](../../deploy/rewards/eligibility/06_integrate.ts) | `rewards-eligibility-integrate` | Governance | Connect to RewardsManager | -| [09_complete.ts](../../deploy/rewards/eligibility/09_complete.ts) | `rewards-eligibility` | - | Aggregate (deploy, upgrade, configure) | +| Script | Tag | Actor | Purpose | +| --------------------------------------------------------------------------------------- | ----------------------------------------- | ------------------- | ----------------------------------------- | +| [01_deploy.ts](../../deploy/rewards/eligibility/01_deploy.ts) | `RewardsEligibilityOracle{A,B}:deploy` | Deployer | Deploy proxy + implementation | +| [02_upgrade.ts](../../deploy/rewards/eligibility/02_upgrade.ts) | `RewardsEligibilityOracle{A,B}:upgrade` | Governance | Upgrade implementation | +| [04_configure.ts](../../deploy/rewards/eligibility/04_configure.ts) | `RewardsEligibilityOracle{A,B}:configure` | Deployer/Governance | Set parameters | +| [05_transfer_governance.ts](../../deploy/rewards/eligibility/05_transfer_governance.ts) | `RewardsEligibilityOracle{A,B}:transfer` | Deployer | Revoke deployer role, transfer ProxyAdmin | +| [09_end.ts](../../deploy/rewards/eligibility/09_end.ts) | `RewardsEligibilityOracle{A,B}` | - | Aggregate (deploy, upgrade, configure) | + +Integration with `RewardsManager` is **not** a per-component lifecycle action. Only one of REO-A or REO-B is integrated at a time, which is a goal-level decision. Use the GIP-0088 activation tag instead: + +```bash +pnpm hardhat deploy --tags GIP-0088:eligibility-integrate --network +``` + +The testnet-only `MockRewardsEligibilityOracle` is a separate, opt-in path with its own per-component [`06_integrate.ts`](../../deploy/rewards/eligibility/mock/06_integrate.ts). It is **not** part of any GIP-0088 phase tag, so `--tags all` will not pull it in — it runs only when `RewardsEligibilityOracleMock` is named explicitly: + +```bash +pnpm hardhat deploy --tags RewardsEligibilityOracleMock,integrate --network +``` + +Intentionally kept off the default deployment path and outside the governance-tx flow; not intended for mainnet. Its governance-tx batch name is `RewardsManager-MockREO` (vs `RewardsManager-REO` for the GIP-0088 A/B activation) so the two cannot collide on the same filesystem. ### Quick Start ```bash -# Full deployment (new install) -pnpm hardhat deploy --tags rewards-eligibility --network +# Read-only status (no --tags = no mutations) +pnpm hardhat deploy --tags RewardsEligibilityOracleA --network # Individual steps -pnpm hardhat deploy --tags rewards-eligibility-deploy --network -pnpm hardhat deploy --tags rewards-eligibility-configure --network -pnpm hardhat deploy --tags rewards-eligibility-transfer-governance --network -pnpm hardhat deploy --tags rewards-eligibility-integrate --network +pnpm hardhat deploy --tags RewardsEligibilityOracleA,deploy --network +pnpm hardhat deploy --tags RewardsEligibilityOracleA,configure --network +pnpm hardhat deploy --tags RewardsEligibilityOracleA,transfer --network + +# Integrate (only one of A/B at a time — goal-level) +pnpm hardhat deploy --tags GIP-0088:eligibility-integrate --network ``` ## Verification Checklist diff --git a/packages/deployment/hardhat.config.ts b/packages/deployment/hardhat.config.ts index 08b85b027..2be1995ba 100644 --- a/packages/deployment/hardhat.config.ts +++ b/packages/deployment/hardhat.config.ts @@ -11,12 +11,17 @@ import hardhatDeploy from 'hardhat-deploy' import checkDeployerTask from './tasks/check-deployer.js' // Import tasks (HH v3 task API) import deploymentStatusTask from './tasks/deployment-status.js' +import { ethBalanceTask, ethCheckKeyTask, ethFundTask } from './tasks/eth-tasks.js' import executeGovernanceTask from './tasks/execute-governance.js' import grantRoleTask from './tasks/grant-role.js' +import { grtBalanceTask, grtMintTask, grtStatusTask, grtTransferTask } from './tasks/grt-tasks.js' import listPendingTask from './tasks/list-pending-implementations.js' import listRolesTask from './tasks/list-roles.js' +import { reoDisableTask, reoEnableTask, reoIndexersTask, reoStatusTask } from './tasks/reo-tasks.js' import resetForkTask from './tasks/reset-fork.js' import revokeRoleTask from './tasks/revoke-role.js' +import { ssStatusTask } from './tasks/ss-tasks.js' +import syncTask from './tasks/sync.js' import verifyContractTask from './tasks/verify-contract.js' // ESM compatibility @@ -26,6 +31,14 @@ const __dirname = path.dirname(__filename) // Package paths const packageRoot = __dirname +// Hardhat v3 does not auto-set HARDHAT_NETWORK (v2 did). +// isLocalNetworkMode() in address-book-utils.ts relies on this env var to +// select addresses-local-network.json over addresses.json. +const networkArg = process.argv.find((_, i, a) => a[i - 1] === '--network') +if (networkArg === 'localNetwork') { + process.env.HARDHAT_NETWORK = 'localNetwork' +} + // RPC URLs with defaults const ARBITRUM_ONE_RPC = process.env.ARBITRUM_ONE_RPC || 'https://arb1.arbitrum.io/rpc' const ARBITRUM_SEPOLIA_RPC = process.env.ARBITRUM_SEPOLIA_RPC || 'https://sepolia-rollup.arbitrum.io/rpc' @@ -50,10 +63,94 @@ function getDeployerKeyName(networkName: string): string { } /** - * Get accounts config for a network using configVariable for lazy resolution + * Parse --tags from process.argv. + * Returns null when --tags is not present. + */ +function parseTagsFromArgv(): string[] | null { + const argv = process.argv + for (let i = 0; i < argv.length; i++) { + const a = argv[i] + if (a === '--tags') { + if (i + 1 >= argv.length) return null + return argv[i + 1].split(',') + } + if (a.startsWith('--tags=')) { + return a.slice('--tags='.length).split(',') + } + } + return null +} + +/** + * Detect whether the current invocation needs a deployer account. + * + * The deployer key is only needed when the `deploy` task is invoked with + * action verbs in `--tags` that perform mutations (deploy, upgrade, configure, + * transfer, integrate, all). Status-only runs (`--tags Component` without + * action verbs) are read-only and don't need the deployer key. + * + * Other tasks (reo:enable, grant-role, eth:fund, ...) resolve keys at + * execution time via resolveConfigVar(), and read-only tasks need no key + * at all. + * + * Gating configVariable() on this lets the hardhat-keystore plugin prompt for + * the password only when the user actually runs a mutating deploy action, + * instead of on every `deploy` invocation. + */ +function getTaskName(): string | null { + for (const arg of process.argv.slice(2)) { + if (arg.startsWith('-')) continue + return arg + } + return null +} + +function needsDeployerAccount(): boolean { + // Non-deploy tasks resolve keys at runtime; deploy:sync is read-only + if (getTaskName() !== 'deploy') return false + + // Status-only runs (no action verbs in --tags) don't need a signer + const tags = parseTagsFromArgv() + if (!tags) return false + + const ACTION_VERBS = ['deploy', 'upgrade', 'configure', 'transfer', 'integrate', 'all'] + return tags.some((tag) => ACTION_VERBS.includes(tag)) +} + +/** + * Dummy private key used when no real deployer key is needed. + * + * Rocketh requires at least one account to resolve namedAccounts.deployer. + * For status-only runs we provide this throwaway key so environment creation + * succeeds without prompting the keystore. The resulting address + * (0x7E5F...95Bdf) is filtered out by getDeployer() — status scripts infer + * the real deployer from the ProxyAdmin owner on-chain. + */ +const DUMMY_DEPLOYER_KEY = '0x0000000000000000000000000000000000000000000000000000000000000001' + +/** + * Get accounts config for a network. + * + * When the deploy task is invoked with action verbs (deploy, upgrade, etc.), + * returns a configVariable so the hardhat-keystore plugin resolves the + * deployer key from the keystore (with env-var fallback). + * + * For status-only deploy runs and all other tasks, returns a dummy key so + * rocketh can initialise namedAccounts without a keystore prompt. Signing + * tasks resolve keys themselves via resolveConfigVar(). + * + * Set the key via either: + * npx hardhat keystore set ARBITRUM_SEPOLIA_DEPLOYER_KEY + * export ARBITRUM_SEPOLIA_DEPLOYER_KEY=0x... */ const getNetworkAccounts = (networkName: string) => { - return [configVariable(getDeployerKeyName(networkName))] + if (!needsDeployerAccount()) return [DUMMY_DEPLOYER_KEY] + const keyName = getDeployerKeyName(networkName) + if (networkName === networkArg && !process.env[keyName]) { + console.log(`\n Deployer key: ${keyName}`) + console.log(` Set via: npx hardhat keystore set ${keyName}\n`) + } + return [configVariable(keyName)] } // Fork network detection (HARDHAT_FORK is the standard for hardhat-deploy v2) @@ -67,10 +164,23 @@ const config: HardhatUserConfig = { tasks: [ checkDeployerTask, deploymentStatusTask, + ethBalanceTask, + ethCheckKeyTask, + ethFundTask, executeGovernanceTask, grantRoleTask, + grtBalanceTask, + grtMintTask, + grtStatusTask, + grtTransferTask, listPendingTask, listRolesTask, + reoDisableTask, + reoEnableTask, + reoIndexersTask, + reoStatusTask, + ssStatusTask, + syncTask, resetForkTask, revokeRoleTask, verifyContractTask, @@ -78,6 +188,17 @@ const config: HardhatUserConfig = { // Chain descriptors for fork execution and local development chainDescriptors: { + // Graph Local Network (rem-local-network, docker-compose stack) + 1337: { + name: 'Graph Local Network', + hardforkHistory: { + berlin: { blockNumber: 0 }, + london: { blockNumber: 0 }, + merge: { blockNumber: 0 }, + shanghai: { blockNumber: 0 }, + cancun: { blockNumber: 0 }, + }, + }, // Local hardhat network (for non-fork runs) 31337: { name: 'Hardhat Local', @@ -155,6 +276,17 @@ const config: HardhatUserConfig = { } : undefined, }, + // Graph Local Network (rem-local-network docker-compose stack) + // Contracts deployed fresh with hardhat-graph-protocol (Phase 1) + // Address books use addresses-local-network.json files + localNetwork: { + type: 'http', + url: process.env.LOCAL_NETWORK_RPC || 'http://chain:8545', + chainId: 1337, + accounts: { + mnemonic: 'test test test test test test test test test test test junk', + }, + }, arbitrumOne: { type: 'http', chainId: 42161, @@ -172,11 +304,11 @@ const config: HardhatUserConfig = { // External artifacts are loaded via direct imports in deploy scripts // Contract verification config (hardhat-verify v3) - // API key resolves from keystore or env: npx hardhat keystore set ARBISCAN_API_KEY - // Sourcify and Blockscout disabled - they don't work reliably for Arbitrum + // API key from keystore, gated to deploy:verify to avoid prompting on every task. + // Set via: npx hardhat keystore set ARBISCAN_API_KEY verify: { etherscan: { - apiKey: configVariable('ARBISCAN_API_KEY'), + apiKey: getTaskName() === 'deploy:verify' ? configVariable('ARBISCAN_API_KEY') : '', }, sourcify: { enabled: false, diff --git a/packages/deployment/lib/abis.ts b/packages/deployment/lib/abis.ts index b7b0868b2..ece524796 100644 --- a/packages/deployment/lib/abis.ts +++ b/packages/deployment/lib/abis.ts @@ -1,86 +1,86 @@ /** * Shared ABI definitions for contract interactions * - * These ABIs are loaded from @graphprotocol/interfaces artifacts to ensure they stay in sync - * with the actual contract interfaces. The interfaces package is the canonical source for ABIs. + * Generated ABIs are produced by `pnpm generate:abis` from contract artifacts. + * The contract registry drives which ABIs and interface IDs are generated. + * Only ACCESS_CONTROL_ENUMERABLE_ABI is hand-maintained (generic role queries). */ -import { readFileSync } from 'node:fs' -import { createRequire } from 'node:module' -import type { Abi } from 'viem' +// Re-export all generated typed ABIs, aliases, and interface IDs +export { + CONTROLLER_ABI, + DIRECT_ALLOCATION_ABI, + GRAPH_PROXY_ADMIN_ABI, + GRAPH_TOKEN_ABI, + IERC165_ABI, + IERC165_INTERFACE_ID, + IISSUANCE_TARGET_INTERFACE_ID, + INITIALIZE_GOVERNOR_ABI, + IREWARDS_MANAGER_INTERFACE_ID, + ISSUANCE_ALLOCATOR_ABI, + ISSUANCE_TARGET_ABI, + OZ_PROXY_ADMIN_ABI, + PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + REWARDS_ELIGIBILITY_ORACLE_ABI, + REWARDS_MANAGER_ABI, + REWARDS_MANAGER_DEPRECATED_ABI, + SET_TARGET_ALLOCATION_ABI, +} from './generated/abis.js' -const require = createRequire(import.meta.url) - -// Helper to load ABI from interface artifact -function loadAbi(artifactPath: string): Abi { - const artifact = JSON.parse(readFileSync(require.resolve(artifactPath), 'utf-8')) - return artifact.abi as Abi -} - -// Interface IDs - these mirror the values the compiler derives from the -// corresponding ABI. Cross-checked by test/interface-id-stability.test.ts; -// update both together whenever an interface changes. -export const IERC165_INTERFACE_ID = '0x01ffc9a7' as const -export const IISSUANCE_TARGET_INTERFACE_ID = '0x19f6601a' as const -export const IREWARDS_MANAGER_INTERFACE_ID = '0x8469b577' as const - -export const REWARDS_MANAGER_ABI = loadAbi( - '@graphprotocol/interfaces/artifacts/contracts/contracts/rewards/IRewardsManager.sol/IRewardsManager.json', -) - -// Deprecated interface includes legacy functions like issuancePerBlock() -export const REWARDS_MANAGER_DEPRECATED_ABI = loadAbi( - '@graphprotocol/interfaces/artifacts/contracts/contracts/rewards/IRewardsManagerDeprecated.sol/IRewardsManagerDeprecated.json', -) - -export const CONTROLLER_ABI = loadAbi( - '@graphprotocol/interfaces/artifacts/contracts/toolshed/IControllerToolshed.sol/IControllerToolshed.json', -) - -// Core interfaces -export const GRAPH_TOKEN_ABI = loadAbi( - '@graphprotocol/interfaces/artifacts/contracts/contracts/token/IGraphToken.sol/IGraphToken.json', -) - -export const GRAPH_PROXY_ADMIN_ABI = loadAbi( - '@graphprotocol/interfaces/artifacts/contracts/contracts/upgrades/IGraphProxyAdmin.sol/IGraphProxyAdmin.json', -) - -export const IERC165_ABI = loadAbi( - '@graphprotocol/interfaces/artifacts/@openzeppelin/contracts/introspection/IERC165.sol/IERC165.json', -) - -// Issuance interfaces -export const ISSUANCE_TARGET_ABI = loadAbi( - '@graphprotocol/interfaces/artifacts/contracts/issuance/allocate/IIssuanceTarget.sol/IIssuanceTarget.json', -) - -// --- ABIs loaded from @graphprotocol/horizon (OZ contracts) --- -// These are not in interfaces package, load from horizon build - -export const OZ_PROXY_ADMIN_ABI = loadAbi( - '@graphprotocol/horizon/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json', -) - -// --- ABIs loaded from @graphprotocol/issuance --- -// Full contract ABIs for deployment operations that need access to all methods - -export const ISSUANCE_ALLOCATOR_ABI = loadAbi( - '@graphprotocol/issuance/artifacts/contracts/allocate/IssuanceAllocator.sol/IssuanceAllocator.json', -) - -export const DIRECT_ALLOCATION_ABI = loadAbi( - '@graphprotocol/issuance/artifacts/contracts/allocate/DirectAllocation.sol/DirectAllocation.json', -) +// ============================================================================ +// Hand-rolled minimal ABIs (not in @graphprotocol/interfaces) +// ============================================================================ -export const REWARDS_ELIGIBILITY_ORACLE_ABI = loadAbi( - '@graphprotocol/issuance/artifacts/contracts/eligibility/RewardsEligibilityOracle.sol/RewardsEligibilityOracle.json', -) +/** + * Minimal ABI for RecurringCollector pause guardian management + * + * RC's pause guardian functions are not part of an interface in + * @graphprotocol/interfaces. Used by RC configure and the GIP-0088 upgrade + * batch to manage `setPauseGuardian` / `pauseGuardians`. + */ +export const RECURRING_COLLECTOR_PAUSE_ABI = [ + { + inputs: [{ name: '_pauseGuardian', type: 'address' }], + name: 'pauseGuardians', + outputs: [{ type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { name: '_pauseGuardian', type: 'address' }, + { name: '_allowed', type: 'bool' }, + ], + name: 'setPauseGuardian', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const -// Convenience re-exports for specific function subsets -// These reference the full ABIs above - viem will find the right function by name -export { ISSUANCE_ALLOCATOR_ABI as SET_TARGET_ALLOCATION_ABI } -export { DIRECT_ALLOCATION_ABI as INITIALIZE_GOVERNOR_ABI } +/** + * Minimal ABI for SubgraphService allocation close guard + * + * `blockClosingAllocationWithActiveAgreement` is part of the SS interface but + * not generated yet. Used by `GIP-0088:issuance-close-guard` and the goal + * status display. + */ +export const SUBGRAPH_SERVICE_CLOSE_GUARD_ABI = [ + { + inputs: [], + name: 'getBlockClosingAllocationWithActiveAgreement', + outputs: [{ type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ name: 'enabled', type: 'bool' }], + name: 'setBlockClosingAllocationWithActiveAgreement', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const // ============================================================================ // Generic ABIs for role enumeration diff --git a/packages/deployment/lib/address-book-utils.ts b/packages/deployment/lib/address-book-utils.ts index 0de0db016..1ab196ac7 100644 --- a/packages/deployment/lib/address-book-utils.ts +++ b/packages/deployment/lib/address-book-utils.ts @@ -32,24 +32,150 @@ import { AddressBookOps } from './address-book-ops.js' const require = createRequire(import.meta.url) +// ============================================================================ +// Fork Auto-Detection +// ============================================================================ + +/** + * Build a map from RPC URL hostname to network name using rocketh config. + * Used by autoDetectForkNetwork() to match anvil's forkUrl. + */ +function buildRpcHostToNetworkMap(): Map { + const map = new Map() + const environments = rockethConfig.environments + const chains = rockethConfig.chains + if (!environments || !chains) return map + + for (const [envName, envConfig] of Object.entries(environments)) { + const chainId = (envConfig as { chain: number }).chain + const chainConfig = (chains as Record)[chainId] as + | { info?: { rpcUrls?: { default?: { http?: readonly string[] } } } } + | undefined + const rpcUrls = chainConfig?.info?.rpcUrls?.default?.http + if (!rpcUrls) continue + + for (const rpcUrl of rpcUrls) { + try { + const hostname = new URL(rpcUrl).hostname + map.set(hostname, { name: envName, chainId }) + } catch { + // Skip invalid URLs + } + } + } + return map +} + +/** + * Auto-detect the fork network by querying anvil's `anvil_nodeInfo` RPC method. + * + * If FORK_NETWORK is already set, this is a no-op. + * If the provider is an anvil fork, extracts the fork URL and matches it + * against known network RPC hostnames from rocketh config. + * + * On success, sets process.env.FORK_NETWORK so all downstream synchronous + * functions (isForkMode, getForkNetwork, etc.) work without changes. + * + * @param rpcUrl - The RPC URL to query (default: http://127.0.0.1:8545) + * @returns The detected network name, or null if not a fork / not detectable + */ +export async function autoDetectForkNetwork(rpcUrl = 'http://127.0.0.1:8545'): Promise { + // Already set — nothing to do + if (process.env.FORK_NETWORK || process.env.HARDHAT_FORK) { + return process.env.FORK_NETWORK || process.env.HARDHAT_FORK || null + } + + try { + const response = await fetch(rpcUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ jsonrpc: '2.0', method: 'anvil_nodeInfo', params: [], id: 1 }), + }) + const json = (await response.json()) as { + result?: { forkConfig?: { forkUrl?: string } } + } + const forkUrl = json.result?.forkConfig?.forkUrl + if (!forkUrl) return null + + // Match fork URL hostname against known networks + const hostMap = buildRpcHostToNetworkMap() + const forkHostname = new URL(forkUrl).hostname + const match = hostMap.get(forkHostname) + if (!match) return null + + // Set env var so all synchronous fork detection works downstream + process.env.FORK_NETWORK = match.name + return match.name + } catch { + // Not reachable or not anvil — not a fork + return null + } +} + // ============================================================================ // Fork Mode Detection // ============================================================================ +/** Network names that are local/test and support fork mode */ +const LOCAL_NETWORKS = new Set(['localhost', 'fork', 'hardhat']) + +/** + * Check if the current network is a local network. + * Uses explicit networkName if provided, falls back to HARDHAT_NETWORK env var. + * Returns true if network is unknown (preserves existing behavior for callers + * that don't pass context). + */ +function isLocalNetwork(networkName?: string): boolean { + const name = networkName ?? process.env.HARDHAT_NETWORK + if (name === undefined) return true + return LOCAL_NETWORKS.has(name) +} + /** - * Check if running in fork mode + * Check if running in fork mode. + * + * Fork mode requires both: + * 1. FORK_NETWORK or HARDHAT_FORK env var is set + * 2. The current network is local (localhost, fork, hardhat) + * + * This prevents fork mode from activating when running against real networks + * even if FORK_NETWORK is still set in the environment. + * + * @param networkName - Optional network name for explicit check (e.g., env.name). + * Falls back to HARDHAT_NETWORK env var if not provided. */ -export function isForkMode(): boolean { +export function isForkMode(networkName?: string): boolean { + if (!isLocalNetwork(networkName)) return false return !!(process.env.HARDHAT_FORK || process.env.FORK_NETWORK) } /** - * Get the fork network name from environment + * Get the fork network name from environment. + * Returns null if not in fork mode or if running on a real network. + * + * @param networkName - Optional network name for explicit check. + * Falls back to HARDHAT_NETWORK env var if not provided. */ -export function getForkNetwork(): string | null { +export function getForkNetwork(networkName?: string): string | null { + if (!isLocalNetwork(networkName)) return null return process.env.HARDHAT_FORK || process.env.FORK_NETWORK || null } +// ============================================================================ +// Local Network Detection +// ============================================================================ + +/** + * Check if running against the Graph local network (rem-local-network). + * + * The local network uses chainId 1337 and deploys contracts from scratch. + * Address books use addresses-local-network.json files which are symlinked + * to mounted config files in the Docker container (populated by Phase 1). + */ +export function isLocalNetworkMode(): boolean { + return process.env.HARDHAT_NETWORK === 'localNetwork' +} + /** * Get the fork state directory for a given network. * All fork-related state (address books, governance TXs) is stored here. @@ -75,8 +201,8 @@ export function getForkStateDir(envName: string, forkNetwork: string): string { * const forkChainId = getForkTargetChainId() * const targetChainId = forkChainId ?? providerChainId */ -export function getForkTargetChainId(): number | null { - const forkNetwork = getForkNetwork() +export function getForkTargetChainId(networkName?: string): number | null { + const forkNetwork = getForkNetwork(networkName) if (!forkNetwork) return null // Look up chain ID from rocketh config environments @@ -117,14 +243,28 @@ export function getForkTargetChainId(): number | null { * const addressBook = getIssuanceAddressBook(targetChainId) */ export async function getTargetChainIdFromEnv(env: Environment): Promise { - const forkChainId = getForkTargetChainId() + const forkChainId = getForkTargetChainId(env.name) if (forkChainId !== null) { return forkChainId } // Not in fork mode - get actual chain ID from provider const chainIdHex = await env.network.provider.request({ method: 'eth_chainId' }) - return Number(chainIdHex) + const providerChainId = Number(chainIdHex) + + // If we're on local chain 31337 without FORK_NETWORK set, the user is most + // likely running against an anvil fork. Try auto-detecting once so callers + // (per-component sync, status scripts) can resolve the right address book + // without requiring the global sync script to have run first. + if (providerChainId === 31337 && !getForkNetwork(env.name)) { + const detected = await autoDetectForkNetwork() + if (detected) { + const detectedForkChainId = getForkTargetChainId(env.name) + if (detectedForkChainId !== null) return detectedForkChainId + } + } + + return providerChainId } // ============================================================================ @@ -206,6 +346,7 @@ export function ensureForkAddressBooks(): { /** * Get the path to the Horizon address book. * In fork mode, returns path to fork-local copy. + * In local network mode, returns path to addresses-local-network.json. * In normal mode, returns path to package address book. */ export function getHorizonAddressBookPath(): string { @@ -213,12 +354,16 @@ export function getHorizonAddressBookPath(): string { const { horizonPath } = ensureForkAddressBooks() return horizonPath } + if (isLocalNetworkMode()) { + return require.resolve('@graphprotocol/horizon/addresses-local-network.json') + } return require.resolve('@graphprotocol/horizon/addresses.json') } /** * Get the path to the SubgraphService address book. * In fork mode, returns path to fork-local copy. + * In local network mode, returns path to addresses-local-network.json. * In normal mode, returns path to package address book. */ export function getSubgraphServiceAddressBookPath(): string { @@ -226,12 +371,16 @@ export function getSubgraphServiceAddressBookPath(): string { const { subgraphServicePath } = ensureForkAddressBooks() return subgraphServicePath } + if (isLocalNetworkMode()) { + return require.resolve('@graphprotocol/subgraph-service/addresses-local-network.json') + } return require.resolve('@graphprotocol/subgraph-service/addresses.json') } /** * Get the path to the Issuance address book. * In fork mode, returns path to fork-local copy. + * In local network mode, returns path to addresses-local-network.json. * In normal mode, returns path to package address book. */ export function getIssuanceAddressBookPath(): string { @@ -239,6 +388,9 @@ export function getIssuanceAddressBookPath(): string { const { issuancePath } = ensureForkAddressBooks() return issuancePath } + if (isLocalNetworkMode()) { + return require.resolve('@graphprotocol/issuance/addresses-local-network.json') + } return require.resolve('@graphprotocol/issuance/addresses.json') } diff --git a/packages/deployment/lib/apply-configuration.ts b/packages/deployment/lib/apply-configuration.ts index b7615b844..8bc4e14a1 100644 --- a/packages/deployment/lib/apply-configuration.ts +++ b/packages/deployment/lib/apply-configuration.ts @@ -17,7 +17,7 @@ import { type RoleCondition, checkConditions, } from './contract-checks.js' -import { createGovernanceTxBuilder, executeTxBatchDirect, saveGovernanceTxAndExit } from './execute-governance.js' +import { createGovernanceTxBuilder, executeTxBatchDirect, saveGovernanceTx } from './execute-governance.js' /** * Options for applyConfiguration @@ -145,10 +145,8 @@ export async function applyConfiguration( env.showMessage(`\n✅ ${contractName} configuration updated\n`) return { status, changesNeeded: true, executedDirectly: true } } else { - // Never returns - exits with code 1 - saveGovernanceTxAndExit(env, builder, `${contractName} configuration`) - // TypeScript doesn't know saveGovernanceTxAndExit never returns - throw new Error('unreachable') + saveGovernanceTx(env, builder, `${contractName} configuration`) + return { status, changesNeeded: true, executedDirectly: false } } } diff --git a/packages/deployment/lib/artifact-loaders.ts b/packages/deployment/lib/artifact-loaders.ts index 786f47773..e48c6e587 100644 --- a/packages/deployment/lib/artifact-loaders.ts +++ b/packages/deployment/lib/artifact-loaders.ts @@ -3,6 +3,8 @@ import { createRequire } from 'node:module' import type { Artifact } from '@rocketh/core/types' +import type { LibraryArtifactResolver, LinkReferences } from './bytecode-utils.js' + // Create require for JSON imports in ESM const require = createRequire(import.meta.url) @@ -31,8 +33,10 @@ export function loadContractsArtifact(contractPath: string, contractName: string * @param contractName - Contract name (e.g., 'SubgraphService') */ export function loadSubgraphServiceArtifact(contractName: string): Artifact { + // Support subdirectory names like 'libraries/IndexingAgreement' + const baseName = contractName.includes('/') ? contractName.split('/').pop()! : contractName const artifactPath = require.resolve( - `@graphprotocol/subgraph-service/artifacts/contracts/${contractName}.sol/${contractName}.json`, + `@graphprotocol/subgraph-service/artifacts/contracts/${contractName}.sol/${baseName}.json`, ) const artifact = JSON.parse(readFileSync(artifactPath, 'utf-8')) @@ -41,6 +45,8 @@ export function loadSubgraphServiceArtifact(contractName: string): Artifact { bytecode: artifact.bytecode as `0x${string}`, deployedBytecode: artifact.deployedBytecode as `0x${string}`, metadata: artifact.metadata || '', + linkReferences: artifact.linkReferences, + deployedLinkReferences: artifact.deployedLinkReferences, } } @@ -57,6 +63,8 @@ export function loadIssuanceArtifact(artifactSubpath: string): Artifact { bytecode: artifact.bytecode as `0x${string}`, deployedBytecode: artifact.deployedBytecode as `0x${string}`, metadata: artifact.metadata || '', + linkReferences: artifact.linkReferences, + deployedLinkReferences: artifact.deployedLinkReferences, } } @@ -66,13 +74,15 @@ export function loadIssuanceArtifact(artifactSubpath: string): Artifact { * @param artifactSubpath - Path within build/contracts/ (e.g., '@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin') */ export function loadHorizonBuildArtifact(artifactSubpath: string): Artifact { - const artifactPath = require.resolve(`@graphprotocol/horizon/build/contracts/${artifactSubpath}.json`) + const artifactPath = require.resolve(`@graphprotocol/horizon/artifacts/${artifactSubpath}.json`) const artifact = JSON.parse(readFileSync(artifactPath, 'utf-8')) return { abi: artifact.abi, bytecode: artifact.bytecode as `0x${string}`, deployedBytecode: artifact.deployedBytecode as `0x${string}`, metadata: artifact.metadata || '', + linkReferences: artifact.linkReferences, + deployedLinkReferences: artifact.deployedLinkReferences, } } @@ -92,6 +102,88 @@ export function loadOpenZeppelinArtifact(contractName: string): Artifact { } } +/** + * Create a library artifact resolver for a given package. + * + * Library artifacts live at /artifacts//.json, + * mirroring the linkReferences source paths from Hardhat compilation. + */ +function createPackageLibraryResolver(packagePrefix: string): LibraryArtifactResolver { + return (sourcePath: string, libraryName: string) => { + try { + const libPath = require.resolve(`${packagePrefix}/${sourcePath}/${libraryName}.json`) + const artifact = JSON.parse(readFileSync(libPath, 'utf-8')) + return { + deployedBytecode: artifact.deployedBytecode as string, + deployedLinkReferences: artifact.deployedLinkReferences as LinkReferences | undefined, + } + } catch { + return undefined + } + } +} + +/** + * Get a library artifact resolver for the given artifact source type. + * Returns undefined if the source type doesn't support library resolution. + */ +export function getLibraryResolver(sourceType: string): LibraryArtifactResolver | undefined { + switch (sourceType) { + case 'subgraph-service': + return createPackageLibraryResolver('@graphprotocol/subgraph-service/artifacts') + case 'horizon': + return createPackageLibraryResolver('@graphprotocol/horizon/artifacts') + case 'issuance': + return createPackageLibraryResolver('@graphprotocol/issuance/artifacts') + case 'contracts': + return createPackageLibraryResolver('@graphprotocol/contracts/artifacts') + default: + return undefined + } +} + +/** + * Pre-link library addresses into an artifact's creation bytecode. + * + * Rocketh's deploy() stores the artifact's bytecode verbatim but compares + * against linked bytecode on subsequent runs. For artifacts with library + * references this causes a permanent mismatch (unlinked placeholders vs + * resolved addresses), triggering a redeploy every time. + * + * Call this before passing the artifact to rocketh's deploy(). The returned + * artifact has fully resolved bytecode and cleared linkReferences, so + * rocketh stores what it will compare against next run. + * + * @param artifact - Artifact with unlinked bytecode and linkReferences + * @param libraries - Map of library name → deployed address + */ +export function linkArtifactLibraries(artifact: Artifact, libraries: Record): Artifact { + let bytecode = artifact.bytecode as string + + if (artifact.linkReferences) { + for (const [, fileReferences] of Object.entries( + artifact.linkReferences as Record>>, + )) { + for (const [libName, fixups] of Object.entries(fileReferences)) { + const addr = libraries[libName] + if (!addr) continue + for (const fixup of fixups) { + bytecode = + bytecode.substring(0, 2 + fixup.start * 2) + + addr.substring(2) + + bytecode.substring(2 + (fixup.start + fixup.length) * 2) + } + } + } + } + + return { + ...artifact, + bytecode: bytecode as `0x${string}`, + linkReferences: undefined, + } +} + /** * Load OpenZeppelin TransparentUpgradeableProxy artifact (v5) */ diff --git a/packages/deployment/lib/bytecode-utils.ts b/packages/deployment/lib/bytecode-utils.ts index 38825df29..f08795b48 100644 --- a/packages/deployment/lib/bytecode-utils.ts +++ b/packages/deployment/lib/bytecode-utils.ts @@ -1,16 +1,31 @@ -import { keccak256 } from 'ethers' +import { keccak256, toUtf8Bytes } from 'ethers' /** * Bytecode utilities for smart contract deployment. * * These utilities handle bytecode hashing for change detection: * - Strip Solidity CBOR metadata (varies between compilations) + * - Resolve library placeholders using actual library bytecode * - Compute stable bytecode hash for comparison * * This allows detecting when local artifact code has changed by comparing * stored bytecodeHash with the current artifact's hash. */ +/** + * Hardhat artifact link references: sourcePath → libraryName → offsets[] + */ +export type LinkReferences = Record>> + +/** + * Resolves a library artifact given its source path and name. + * Returns the artifact's deployedBytecode and its own linkReferences (for recursion). + */ +export type LibraryArtifactResolver = ( + sourcePath: string, + libraryName: string, +) => { deployedBytecode: string; deployedLinkReferences?: LinkReferences } | undefined + /** * Strip Solidity metadata from bytecode. * Metadata is CBOR-encoded at the end, with last 2 bytes indicating length. @@ -33,19 +48,102 @@ export function stripMetadata(bytecode: string): string { } /** - * Compute a stable hash of bytecode for change detection. + * Compute the Solidity library placeholder hash for a given source path and name. + * This is keccak256("sourcePath:libraryName") truncated to 34 hex chars (17 bytes). + */ +function libraryPlaceholderHash(sourcePath: string, libraryName: string): string { + return keccak256(toUtf8Bytes(`${sourcePath}:${libraryName}`)).slice(2, 36) +} + +/** + * Resolve library placeholders in bytecode using actual library bytecode hashes. * - * Strips CBOR metadata suffix before hashing to ensure the hash is stable - * across recompilations that don't change the actual contract logic. + * For each library in deployedLinkReferences, computes its bytecode hash + * (recursively resolving its own library deps) and substitutes that hash + * (truncated to 20 bytes / 40 hex chars) into the placeholder slots. * - * Use this to detect when local artifact bytecode has changed since deployment. + * This means the final hash reflects both the contract's code and all + * transitive library code. If any library changes, the hash changes. + */ +function resolveLibraryPlaceholders( + bytecode: string, + linkReferences: LinkReferences | undefined, + resolver: LibraryArtifactResolver | undefined, +): string { + if (!linkReferences || !resolver) { + // No link references or no resolver — zero out any remaining placeholders + return bytecode.replace(/__\$[0-9a-fA-F]{34}\$__/g, '0'.repeat(40)) + } + + let result = bytecode + for (const [sourcePath, libraries] of Object.entries(linkReferences)) { + for (const libraryName of Object.keys(libraries)) { + const placeholderHash = libraryPlaceholderHash(sourcePath, libraryName) + const placeholder = `__\\$${placeholderHash}\\$__` + + const libArtifact = resolver(sourcePath, libraryName) + let replacement: string + if (libArtifact) { + // Recursively compute the library's bytecode hash (handles nested deps) + const libHash = computeBytecodeHashWithLibraries( + libArtifact.deployedBytecode, + libArtifact.deployedLinkReferences, + resolver, + ) + // Use first 40 hex chars (20 bytes) of the hash as the replacement + replacement = libHash.slice(2, 42) + } else { + // Library artifact not available — zero fill + replacement = '0'.repeat(40) + } + + result = result.replace(new RegExp(placeholder, 'g'), replacement) + } + } + + // Zero any remaining unresolved placeholders (shouldn't happen but defensive) + return result.replace(/__\$[0-9a-fA-F]{34}\$__/g, '0'.repeat(40)) +} + +/** + * Compute a stable hash of bytecode for change detection, with library resolution. * - * @param bytecode - The bytecode to hash (typically artifact.deployedBytecode) - * @returns keccak256 hash of the bytecode with metadata stripped + * Normalizations applied before hashing: + * - Strip CBOR metadata suffix (varies between compilations) + * - Resolve library placeholders with actual library bytecode hashes + * + * @param bytecode - The bytecode to hash + * @param linkReferences - Artifact's deployedLinkReferences (optional) + * @param resolver - Function to load library artifacts (optional) + * @returns keccak256 hash of the normalized bytecode */ -export function computeBytecodeHash(bytecode: string): string { +function computeBytecodeHashWithLibraries( + bytecode: string, + linkReferences: LinkReferences | undefined, + resolver: LibraryArtifactResolver | undefined, +): string { const stripped = stripMetadata(bytecode) - // Ensure 0x prefix for keccak256 - const prefixed = stripped.startsWith('0x') ? stripped : `0x${stripped}` + const resolved = resolveLibraryPlaceholders(stripped, linkReferences, resolver) + const prefixed = resolved.startsWith('0x') ? resolved : `0x${resolved}` return keccak256(prefixed) } + +/** + * Compute a stable hash of bytecode for change detection. + * + * For simple contracts (no library references), pass just the bytecode. + * For contracts with external libraries, pass linkReferences and a resolver + * to include transitive library code in the hash. + * + * @param bytecode - The bytecode to hash (typically artifact.deployedBytecode) + * @param linkReferences - Artifact's deployedLinkReferences (optional) + * @param resolver - Function to load library artifacts for recursive resolution (optional) + * @returns keccak256 hash of the bytecode with metadata stripped + */ +export function computeBytecodeHash( + bytecode: string, + linkReferences?: LinkReferences, + resolver?: LibraryArtifactResolver, +): string { + return computeBytecodeHashWithLibraries(bytecode, linkReferences, resolver) +} diff --git a/packages/deployment/lib/contract-checks.ts b/packages/deployment/lib/contract-checks.ts index 412b5243e..74e446779 100644 --- a/packages/deployment/lib/contract-checks.ts +++ b/packages/deployment/lib/contract-checks.ts @@ -1,5 +1,5 @@ import type { Environment } from '@rocketh/core/types' -import type { PublicClient } from 'viem' +import type { Abi, PublicClient } from 'viem' import { ACCESS_CONTROL_ENUMERABLE_ABI, @@ -7,6 +7,8 @@ import { IERC165_ABI, IERC165_INTERFACE_ID, IISSUANCE_TARGET_INTERFACE_ID, + ISSUANCE_TARGET_ABI, + PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, REWARDS_ELIGIBILITY_ORACLE_ABI, REWARDS_MANAGER_ABI, REWARDS_MANAGER_DEPRECATED_ABI, @@ -100,7 +102,7 @@ export async function checkIssuanceAllocatorActivation( // Check RM.issuanceAllocator() == IA const currentIA = (await client.readContract({ address: rmAddress as `0x${string}`, - abi: REWARDS_MANAGER_ABI, + abi: ISSUANCE_TARGET_ABI, functionName: 'getIssuanceAllocator', })) as string @@ -136,58 +138,6 @@ export async function isIssuanceAllocatorActivated( return status.iaIntegrated && status.iaMinter } -// Well-known reclaim reasons (bytes32) -// These correspond to the condition identifiers in RewardsCondition.sol (keccak256 of condition string) -// Each reason maps to a contract: ReclaimedRewardsFor -export const RECLAIM_REASONS = { - indexerIneligible: '0xfcadc72cad493def76767524554db9da829b6aca9457c0187f63000dba3c9439', - subgraphDenied: '0xc0f4a5620db2f97e7c3a4ba7058497eaa0d497538b2666d66bd6932f25345c88', - stalePoi: '0xe677423ace949fe7684efc4b33b0b10dc0f71b38c22370d74dad5ff6bec3e311', - zeroPoi: '0xf067261e30ea99a11911c4e98249a1645a4870b3ef56b8aa8b8967e15a543095', - closeAllocation: '0x3021a5ea86e7115dadc0819121dc2b1f58b45c2372d2e93b593567f0dd797df8', -} as const - -// Mapping from reclaim reason keys to deployed contract names -export const RECLAIM_CONTRACT_NAMES = { - indexerIneligible: 'ReclaimedRewardsForIndexerIneligible', - subgraphDenied: 'ReclaimedRewardsForSubgraphDenied', - stalePoi: 'ReclaimedRewardsForStalePoi', - zeroPoi: 'ReclaimedRewardsForZeroPoi', - closeAllocation: 'ReclaimedRewardsForCloseAllocation', -} as const - -export type ReclaimReasonKey = keyof typeof RECLAIM_REASONS - -/** - * Get the reclaim address for a given reason from RewardsManager - * - * @param client - Viem public client - * @param rmAddress - RewardsManager address - * @param reason - The reason identifier (bytes32) - * @returns The reclaim address for that reason, or null if not set or function doesn't exist - */ -export async function getReclaimAddress( - client: PublicClient, - rmAddress: string, - reason: string, -): Promise { - try { - const reclaimAddress = (await client.readContract({ - address: rmAddress as `0x${string}`, - abi: REWARDS_MANAGER_ABI, - functionName: 'getReclaimAddress', - args: [reason as `0x${string}`], - })) as string - // Zero address means not set - if (reclaimAddress === '0x0000000000000000000000000000000000000000') { - return null - } - return reclaimAddress - } catch { - return null - } -} - /** * Get issuancePerBlock from RewardsManager */ @@ -201,11 +151,11 @@ export async function getRewardsManagerRawIssuanceRate(client: PublicClient, rmA } // ============================================================================ -// RewardsEligibilityOracle Role Checks +// REO Role Checks // ============================================================================ /** - * Result of checking OPERATOR_ROLE assignment on RewardsEligibilityOracle + * Result of checking OPERATOR_ROLE assignment on an REO instance */ export interface OperatorRoleCheckResult { /** Whether the check passed (correct assignment state) */ @@ -221,7 +171,7 @@ export interface OperatorRoleCheckResult { } /** - * Check OPERATOR_ROLE assignment on RewardsEligibilityOracle + * Check OPERATOR_ROLE assignment on an REO instance * * This is the SINGLE authoritative check for OPERATOR_ROLE correctness. * Used by both deployment scripts and status checks. @@ -231,7 +181,7 @@ export interface OperatorRoleCheckResult { * - If expectedOperator is null: exactly 0 holders * * @param client - Viem public client - * @param reoAddress - RewardsEligibilityOracle address + * @param reoAddress - REO instance address * @param expectedOperator - Expected operator address (from address book), or null if not configured * @returns Check result with pass/fail status and details */ @@ -359,7 +309,7 @@ export interface ParamCondition { description: string /** ABI for contract reads/writes */ - abi: readonly unknown[] + abi: Abi /** Function name to read current value */ getter: string @@ -391,7 +341,7 @@ export interface RoleCondition { description: string /** ABI for contract reads/writes */ - abi: readonly unknown[] + abi: Abi /** Function name to get role bytes32 (e.g., 'PAUSE_ROLE') */ roleGetter: string @@ -519,7 +469,7 @@ export async function checkConditions( } // ============================================================================ -// RewardsEligibilityOracle Conditions +// REO Conditions // ============================================================================ /** Default REO configuration values */ @@ -558,11 +508,6 @@ export function createREOParamConditions( ] } -/** - * @deprecated Use createREOParamConditions for param-only or createREOConditions for all - */ -export const createREOConditions = createREOParamConditions - /** * REO role condition targets */ @@ -620,7 +565,10 @@ export function createREORoleConditions(targets: REORoleTargets): RoleCondition[ export function createAllREOConditions( paramTargets: { eligibilityPeriod?: bigint; oracleUpdateTimeout?: bigint } = {}, roleTargets: REORoleTargets, -): ConfigCondition[] { + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): ConfigCondition[] { + // Note: setEligibilityValidation requires OPERATOR_ROLE, not GOVERNOR_ROLE. + // It is enabled by the network operator after deployment, not in the configure step. return [...createREOParamConditions(paramTargets), ...createREORoleConditions(roleTargets)] } @@ -653,7 +601,8 @@ export function createREODeployerRevokeCondition(deployer: string): RoleConditio * * Requires NetworkOperator to be configured in the issuance address book. */ -export async function getREOConditions(env: Environment): Promise[]> { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export async function getREOConditions(env: Environment): Promise[]> { const governor = await getGovernor(env) const pauseGuardian = await getPauseGuardian(env) const ab = graph.getIssuanceAddressBook(await getTargetChainIdFromEnv(env)) @@ -678,7 +627,7 @@ export function getREOTransferGovernanceConditions(deployer: string): ConfigCond } // ============================================================================ -// RewardsEligibilityOracle Role Checks +// REO Role Checks // ============================================================================ /** @@ -696,7 +645,7 @@ export interface RoleCheckResult { } /** - * Check if an account has a specific role on RewardsEligibilityOracle + * Check if an account has a specific role on an REO instance */ export async function checkREORole( client: PublicClient, @@ -751,8 +700,8 @@ export function formatAddress(address: string): string { export function createRMIntegrationCondition(reoAddress: string): ParamCondition { return { name: 'providerEligibilityOracle', - description: 'RewardsEligibilityOracle', - abi: REWARDS_MANAGER_ABI, + description: 'REO instance', + abi: PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, getter: 'getProviderEligibilityOracle', setter: 'setProviderEligibilityOracle', target: reoAddress, diff --git a/packages/deployment/lib/contract-registry.ts b/packages/deployment/lib/contract-registry.ts index cb2271885..06b2f640a 100644 --- a/packages/deployment/lib/contract-registry.ts +++ b/packages/deployment/lib/contract-registry.ts @@ -8,12 +8,15 @@ * the same contract name appears in multiple address books. */ +import { ComponentTags } from './deployment-tags.js' + /** * Artifact source configuration - where to load contract ABI and bytecode from */ export type ArtifactSource = | { type: 'contracts'; path: string; name: string } | { type: 'subgraph-service'; name: string } + | { type: 'horizon'; path: string } | { type: 'issuance'; path: string } | { type: 'openzeppelin'; name: string } @@ -30,6 +33,17 @@ export type ProxyType = 'graph' | 'transparent' */ export type AddressBookType = 'horizon' | 'subgraph-service' | 'issuance' +/** + * Interface ABI configuration for typed ABI generation. + * Maps an export name to an interface in @graphprotocol/interfaces. + */ +export interface InterfaceAbiConfig { + /** Export name for the generated ABI constant (e.g. 'REWARDS_MANAGER_ABI') */ + name: string + /** Interface name in @graphprotocol/interfaces artifacts (e.g. 'IRewardsManager') */ + interface: string +} + /** * Contract metadata specification * Note: addressBook is no longer a field - it's implied by the registry namespace @@ -69,6 +83,53 @@ export interface ContractMetadata { * Used by roles:list task to enumerate role holders. */ roles?: readonly string[] + + /** + * Component tag for deployment lifecycle management. + * Used by script factories to derive action tags (deploy, upgrade, etc.) + * and dependencies without per-script boilerplate. + * + * Must match the PascalCase contract name in deployment-tags.ts ComponentTags. + * Example: 'PaymentsEscrow' → tags: 'PaymentsEscrow:upgrade', deps: 'PaymentsEscrow:deploy' + * + * Multiple contracts may share a componentTag when they form a single + * deployment unit (e.g., REO A/B instances share 'RewardsEligibility'). + */ + componentTag?: string + + /** + * Lifecycle actions available for this component beyond the standard deploy+upgrade. + * Used by status modules to show available `--tags` actions. + * + * When omitted, defaults to ['deploy', 'upgrade'] for deployable proxy contracts, + * or ['deploy'] for non-proxy deployable contracts. + * Always includes 'all' implicitly. + */ + lifecycleActions?: readonly string[] + + /** + * Interface ABIs to generate for this contract. + * Used by the ABI codegen script to produce typed `as const` exports. + * Each entry maps to an interface artifact in @graphprotocol/interfaces. + * The codegen also extracts the interfaceId from the factory class. + */ + interfaces?: readonly InterfaceAbiConfig[] + + /** + * Generate a typed ABI from the contract's full artifact. + * Value is the export name (e.g. 'ISSUANCE_ALLOCATOR_ABI'). + * Requires `artifact` to be set on this entry. + */ + generateAbi?: string + + /** + * Name of the shared implementation entry when this proxy uses an + * implementation deployed separately (e.g. DirectAllocation_Implementation). + * + * Used by the upgrade pipeline to auto-detect when the shared implementation + * has been redeployed and set pendingImplementation accordingly. + */ + sharedImplementation?: string } // ============================================================================ @@ -78,34 +139,71 @@ export interface ContractMetadata { const HORIZON_CONTRACTS = { RewardsManager: { artifact: { type: 'contracts', path: 'rewards', name: 'RewardsManager' }, + interfaces: [ + { name: 'REWARDS_MANAGER_ABI', interface: 'IRewardsManager' }, + { name: 'REWARDS_MANAGER_DEPRECATED_ABI', interface: 'IRewardsManagerDeprecated' }, + { name: 'PROVIDER_ELIGIBILITY_MANAGEMENT_ABI', interface: 'IProviderEligibilityManagement' }, + ], proxyType: 'graph', proxyAdminName: 'GraphProxyAdmin', prerequisite: true, deployable: true, + componentTag: ComponentTags.REWARDS_MANAGER, + lifecycleActions: ['deploy', 'upgrade'], }, GraphProxyAdmin: { + interfaces: [{ name: 'GRAPH_PROXY_ADMIN_ABI', interface: 'IGraphProxyAdmin' }], prerequisite: true, }, L2GraphToken: { artifact: { type: 'contracts', path: 'l2/token', name: 'L2GraphToken' }, + interfaces: [{ name: 'GRAPH_TOKEN_ABI', interface: 'IGraphToken' }], prerequisite: true, }, Controller: { + interfaces: [{ name: 'CONTROLLER_ABI', interface: 'IControllerToolshed' }], prerequisite: true, }, GraphTallyCollector: { prerequisite: true, }, + RecurringCollector: { + artifact: { type: 'horizon', path: 'contracts/payments/collectors/RecurringCollector.sol/RecurringCollector' }, + proxyType: 'transparent', + deployable: true, + componentTag: ComponentTags.RECURRING_COLLECTOR, + lifecycleActions: ['deploy', 'upgrade', 'configure', 'transfer'], + }, L2Curation: { + artifact: { type: 'contracts', path: 'l2/curation', name: 'L2Curation' }, + proxyType: 'graph', + proxyAdminName: 'GraphProxyAdmin', prerequisite: true, + deployable: true, + componentTag: ComponentTags.L2_CURATION, + }, + HorizonStaking: { + artifact: { type: 'horizon', path: 'contracts/staking/HorizonStaking.sol/HorizonStaking' }, + proxyType: 'graph', + proxyAdminName: 'GraphProxyAdmin', + prerequisite: true, + deployable: true, + componentTag: ComponentTags.HORIZON_STAKING, + }, + GraphPayments: { + prerequisite: true, + }, + PaymentsEscrow: { + artifact: { type: 'horizon', path: 'contracts/payments/PaymentsEscrow.sol/PaymentsEscrow' }, + proxyType: 'transparent', + prerequisite: true, + deployable: true, + componentTag: ComponentTags.PAYMENTS_ESCROW, }, // Contracts deployed by other systems (placeholders for address book type completeness) EpochManager: {}, - GraphPayments: {}, - HorizonStaking: {}, L2GNS: {}, L2GraphTokenGateway: {}, - PaymentsEscrow: {}, SubgraphNFT: {}, } as const satisfies Record @@ -122,6 +220,8 @@ const SUBGRAPH_SERVICE_CONTRACTS = { proxyType: 'transparent', // proxyAdminName omitted - auto-generates as DisputeManager_ProxyAdmin prerequisite: true, + deployable: true, + componentTag: ComponentTags.DISPUTE_MANAGER, }, SubgraphService: { artifact: { type: 'subgraph-service', name: 'SubgraphService' }, @@ -129,6 +229,8 @@ const SUBGRAPH_SERVICE_CONTRACTS = { // proxyAdminName omitted - auto-generates as SubgraphService_ProxyAdmin prerequisite: true, deployable: true, + componentTag: ComponentTags.SUBGRAPH_SERVICE, + lifecycleActions: ['deploy', 'upgrade', 'configure'], }, // Contracts deployed by other systems (placeholders for address book type completeness) // These exist in the subgraph-service address book but are managed elsewhere @@ -144,7 +246,9 @@ const SUBGRAPH_SERVICE_CONTRACTS = { // ============================================================================ // NOTE: Issuance contracts use OZ v5 TransparentUpgradeableProxy which creates -// a per-proxy ProxyAdmin in the constructor. The ProxyAdmin address is stored +// a per-proxy ProxyAdmin in the constructor. The deployer is the initial ProxyAdmin +// owner to allow post-deployment configuration; ownership is transferred to the +// protocol governor in the transfer-governance step. The ProxyAdmin address is stored // inline in each contract's address book entry (proxyAdmin field), similar to // subgraph-service contracts. @@ -158,54 +262,84 @@ const ISSUANCE_CONTRACTS = { IssuanceAllocator: { artifact: { type: 'issuance', path: 'contracts/allocate/IssuanceAllocator.sol/IssuanceAllocator' }, + generateAbi: 'ISSUANCE_ALLOCATOR_ABI', proxyType: 'transparent', // Per-proxy ProxyAdmin - address stored in address book entry's proxyAdmin field deployable: true, roles: BASE_ROLES, + componentTag: ComponentTags.ISSUANCE_ALLOCATOR, + lifecycleActions: ['deploy', 'upgrade', 'configure', 'transfer'], }, - PilotAllocation: { - artifact: { type: 'issuance', path: 'contracts/allocate/PilotAllocation.sol/PilotAllocation' }, + RecurringAgreementManager: { + artifact: { + type: 'issuance', + path: 'contracts/agreement/RecurringAgreementManager.sol/RecurringAgreementManager', + }, proxyType: 'transparent', deployable: true, - roles: BASE_ROLES, + roles: [...BASE_ROLES, 'DATA_SERVICE_ROLE', 'COLLECTOR_ROLE', 'AGREEMENT_MANAGER_ROLE'] as const, + componentTag: ComponentTags.RECURRING_AGREEMENT_MANAGER, + lifecycleActions: ['deploy', 'upgrade', 'configure', 'transfer'], }, - RewardsEligibilityOracle: { + // A/B instances of RewardsEligibilityOracle - both share the same contract artifact + // but deploy as independent proxies. Only one is active (integrated with RewardsManager) at a time. + RewardsEligibilityOracleA: { artifact: { type: 'issuance', path: 'contracts/eligibility/RewardsEligibilityOracle.sol/RewardsEligibilityOracle' }, + generateAbi: 'REWARDS_ELIGIBILITY_ORACLE_ABI', proxyType: 'transparent', deployable: true, roles: [...BASE_ROLES, 'ORACLE_ROLE'] as const, + componentTag: ComponentTags.REWARDS_ELIGIBILITY_A, + // Integration with RewardsManager is a goal-level activation + // (--tags GIP-0088:eligibility-integrate), not a per-component lifecycle action. + lifecycleActions: ['deploy', 'upgrade', 'configure', 'transfer'], }, - DirectAllocation_Implementation: { - artifact: { type: 'issuance', path: 'contracts/allocate/DirectAllocation.sol/DirectAllocation' }, - deployable: true, - roles: BASE_ROLES, - }, - // Reclaim addresses for different reward reclaim reasons - // All share DirectAllocation implementation (per-proxy ProxyAdmin for each) - ReclaimedRewardsForIndexerIneligible: { + RewardsEligibilityOracleB: { + artifact: { type: 'issuance', path: 'contracts/eligibility/RewardsEligibilityOracle.sol/RewardsEligibilityOracle' }, proxyType: 'transparent', deployable: true, - roles: BASE_ROLES, + roles: [...BASE_ROLES, 'ORACLE_ROLE'] as const, + componentTag: ComponentTags.REWARDS_ELIGIBILITY_B, + lifecycleActions: ['deploy', 'upgrade', 'configure', 'transfer'], }, - ReclaimedRewardsForSubgraphDenied: { + // Testnet mock REO - indexers control own eligibility, upgradeable for deployment consistency + RewardsEligibilityOracleMock: { + artifact: { + type: 'issuance', + path: 'contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol/MockRewardsEligibilityOracle', + }, proxyType: 'transparent', deployable: true, roles: BASE_ROLES, + componentTag: ComponentTags.REWARDS_ELIGIBILITY_MOCK, + lifecycleActions: ['deploy', 'upgrade', 'transfer', 'integrate'], }, - ReclaimedRewardsForStalePoi: { - proxyType: 'transparent', + DirectAllocation_Implementation: { + artifact: { type: 'issuance', path: 'contracts/allocate/DirectAllocation.sol/DirectAllocation' }, + generateAbi: 'DIRECT_ALLOCATION_ABI', deployable: true, roles: BASE_ROLES, + componentTag: ComponentTags.DIRECT_ALLOCATION_IMPL, }, - ReclaimedRewardsForZeroPoi: { + // Default target for IA — safety net for unallocated issuance + // Uses DirectAllocation implementation (per-proxy ProxyAdmin) + DefaultAllocation: { proxyType: 'transparent', + sharedImplementation: 'DirectAllocation_Implementation', deployable: true, roles: BASE_ROLES, + componentTag: ComponentTags.DEFAULT_ALLOCATION, + lifecycleActions: ['deploy', 'upgrade', 'configure', 'transfer'], }, - ReclaimedRewardsForCloseAllocation: { + // Default reclaim address — receives reclaimed rewards for all reasons + // Uses DirectAllocation implementation (per-proxy ProxyAdmin) + ReclaimedRewards: { proxyType: 'transparent', + sharedImplementation: 'DirectAllocation_Implementation', deployable: true, roles: BASE_ROLES, + componentTag: ComponentTags.REWARDS_RECLAIM, + lifecycleActions: ['deploy', 'upgrade', 'configure', 'transfer'], }, } as const satisfies Record diff --git a/packages/deployment/lib/controller-utils.ts b/packages/deployment/lib/controller-utils.ts index 7180a8872..4dce12c4a 100644 --- a/packages/deployment/lib/controller-utils.ts +++ b/packages/deployment/lib/controller-utils.ts @@ -6,6 +6,35 @@ import { Contracts } from './contract-registry.js' import { requireContract } from './issuance-deploy-utils.js' import { graph } from '../rocketh/deploy.js' +/** + * Check if the provider can sign as the protocol governor + * + * With a mnemonic (local network), all derived accounts are available via eth_accounts. + * With explicit keys (production), only configured accounts are available. + * + * @param env - Deployment environment + * @returns Governor address and whether the provider can sign as governor + */ +export async function canSignAsGovernor(env: Environment): Promise<{ governor: string; canSign: boolean }> { + const governor = await getGovernor(env) + const accounts = (await env.network.provider.request({ method: 'eth_accounts' })) as string[] + const canSign = accounts.some((a) => a.toLowerCase() === governor.toLowerCase()) + + // Verify the rocketh named account 'governor' matches the on-chain governor. + // If they disagree, tx({ account: 'governor' }) would send from the wrong address. + if (canSign && env.namedAccounts['governor']) { + const named = env.namedAccounts['governor'] as string + if (named.toLowerCase() !== governor.toLowerCase()) { + throw new Error( + `Named account 'governor' (${named}) does not match Controller.getGovernor() (${governor}). ` + + `Check rocketh account config — mnemonic index may not match the on-chain governor.`, + ) + } + } + + return { governor, canSign } +} + /** * Get the protocol governor address from the Controller contract * diff --git a/packages/deployment/lib/deploy-implementation.ts b/packages/deployment/lib/deploy-implementation.ts index f08c4398a..ef2608578 100644 --- a/packages/deployment/lib/deploy-implementation.ts +++ b/packages/deployment/lib/deploy-implementation.ts @@ -1,10 +1,13 @@ import type { Artifact, Environment } from '@rocketh/core/types' -import { getAddress } from 'viem' +import { encodeAbiParameters, getAddress } from 'viem' import { getTargetChainIdFromEnv } from './address-book-utils.js' import type { AnyAddressBookOps } from './address-book-ops.js' import { + getLibraryResolver, + linkArtifactLibraries, loadContractsArtifact, + loadHorizonBuildArtifact, loadIssuanceArtifact, loadOpenZeppelinArtifact, loadSubgraphServiceArtifact, @@ -100,11 +103,11 @@ export interface ImplementationDeployConfig { /** * Name of the proxy admin deployment record. - * e.g., 'GraphProxyAdmin', 'GraphIssuanceProxyAdmin' + * e.g., 'GraphProxyAdmin' for legacy GraphProxy contracts. * * Optional: If omitted, defaults to `${contractName}_ProxyAdmin`. - * This allows contracts with inline proxy admin addresses (stored in address book entry) - * to work without explicitly specifying the deployment record name. + * Per-proxy admins (OZ v5 TransparentUpgradeableProxy contracts) follow this + * default and store the admin address inline in their address book entry. */ proxyAdminName?: string @@ -144,6 +147,8 @@ export function loadArtifactFromSource(source: ArtifactSource): Artifact { return loadContractsArtifact(source.path, source.name) case 'subgraph-service': return loadSubgraphServiceArtifact(source.name) + case 'horizon': + return loadHorizonBuildArtifact(source.path) case 'issuance': return loadIssuanceArtifact(source.path) case 'openzeppelin': @@ -236,6 +241,7 @@ export function hasImplementationConfig(addressBook: AddressBookType, contractNa export async function deployImplementation( env: Environment, config: ImplementationDeployConfig, + libraries?: Record, ): Promise { const { contractName, proxyAdminName, constructorArgs = [], proxyType = 'graph', addressBook = 'horizon' } = config @@ -270,8 +276,11 @@ export async function deployImplementation( throw new Error(`${proxyAdminDeploymentName} not imported. Run sync step first.`) } - // 2) Load artifact - const artifact = loadArtifactFromSource(artifactSource) + // 2) Load artifact (pre-link libraries so rocketh stores linked bytecode) + const rawArtifact = loadArtifactFromSource(artifactSource) + const artifact = libraries + ? linkArtifactLibraries(rawArtifact, libraries as Record) + : rawArtifact const implDeploymentName = `${contractName}_Implementation` // Get address book to check pending implementation @@ -284,16 +293,55 @@ export async function deployImplementation( : graph.getHorizonAddressBook(targetChainId) // Compute local artifact bytecode hash (for storing with deployment) - const localBytecodeHash = computeBytecodeHash(artifact.deployedBytecode ?? '0x') + const resolver = getLibraryResolver(artifactSource.type) + const localBytecodeHash = computeBytecodeHash( + artifact.deployedBytecode ?? '0x', + artifact.deployedLinkReferences, + resolver, + ) + + // 3) Pre-check: skip deployment if bytecodeHash and constructor args match + // Rocketh's comparison can false-positive when sync creates bare records (e.g., wrong + // argsData, unlinked library bytecodes). The content-aware bytecodeHash handles both + // cases — it strips CBOR metadata and resolves library references by content hash. + const contractEntry = addressBookInstance.entryExists(contractName) + ? addressBookInstance.getEntry(contractName) + : null + const pendingImpl = contractEntry?.pendingImplementation + const storedMetadata = pendingImpl?.deployment ?? addressBookInstance.getDeploymentMetadata(contractName) + + if (storedMetadata?.bytecodeHash && storedMetadata.bytecodeHash === localBytecodeHash) { + // Bytecode matches — also verify constructor args (immutable values) + let argsMatch = !storedMetadata.argsData // no stored args = can't compare, assume match + if (storedMetadata.argsData) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const constructorDef = (artifact.abi as any[])?.find((item: any) => item.type === 'constructor') + const localArgsData = + constructorDef?.inputs?.length && constructorArgs.length + ? encodeAbiParameters(constructorDef.inputs, constructorArgs as readonly unknown[]) + : '0x' + argsMatch = localArgsData === storedMetadata.argsData + } - // 3) Deploy implementation - let rocketh decide based on its own records + if (argsMatch) { + const existingAddress = pendingImpl?.address ?? contractEntry?.implementation + if (existingAddress) { + env.showMessage(`\n✓ ${contractName} implementation unchanged`) + return { + deployed: false, + address: existingAddress, + bytecodeChanged: false, + } + } + } + } + + // 4) Deploy implementation - let rocketh decide based on its own records // Sync handles pending: if pending hash matches local, rocketh has bytecode to compare // If pending hash differs, sync skipped bytecode so rocketh will deploy fresh - const impl = await deployFn(implDeploymentName, { - account: deployer, - artifact, - args: constructorArgs, - }) + // Libraries are pre-linked into the artifact (step 2) so rocketh stores linked + // bytecode — its CBOR-stripping comparison then matches on subsequent runs. + const impl = await deployFn(implDeploymentName, { account: deployer, artifact, args: constructorArgs }) if (!impl.newlyDeployed) { env.showMessage(`\n✓ ${contractName} implementation unchanged`) @@ -335,7 +383,7 @@ export async function deployImplementation( // Store with full deployment metadata for verification and reconstruction addressBookInstance.setPendingImplementationWithMetadata(contractName, impl.address, { txHash: impl.transaction?.hash ?? '', - argsData: impl.argsData ?? '0x', + argsData: impl.argsData, bytecodeHash: localBytecodeHash, ...(blockNumber !== undefined && { blockNumber }), ...(timestamp && { timestamp }), diff --git a/packages/deployment/lib/deploy-standalone.ts b/packages/deployment/lib/deploy-standalone.ts new file mode 100644 index 000000000..0b7b2c9fd --- /dev/null +++ b/packages/deployment/lib/deploy-standalone.ts @@ -0,0 +1,79 @@ +import type { Environment } from '@rocketh/core/types' + +import type { RegistryEntry } from './contract-registry.js' +import { loadArtifactFromSource } from './deploy-implementation.js' +import { requireDeployer } from './issuance-deploy-utils.js' +import { deploy, graph } from '../rocketh/deploy.js' + +/** + * Configuration for deploying a standalone (non-proxy) contract + */ +export interface StandaloneDeployConfig { + /** Contract registry entry (provides addressBook and artifact config) */ + contract: RegistryEntry + /** Constructor arguments */ + constructorArgs?: unknown[] +} + +/** + * Deploy a standalone (non-proxy) contract and update the address book + * + * This utility handles the common pattern for deploying contracts that + * are not behind a proxy (e.g., helper contracts). + * + * - Loads artifact from registry metadata + * - Deploys via rocketh (idempotent - skips if bytecode unchanged) + * - Updates the appropriate address book (horizon or issuance) + * + * @example + * ```typescript + * await deployStandaloneContract(env, { + * contract: Contracts.horizon.GraphTallyCollector, + * constructorArgs: [controllerAddress], + * }) + * ``` + */ +export async function deployStandaloneContract( + env: Environment, + config: StandaloneDeployConfig, +): Promise<{ address: string; newlyDeployed: boolean }> { + const { contract, constructorArgs = [] } = config + + if (!contract.artifact) { + throw new Error(`No artifact configured for ${contract.name} in registry`) + } + + const deployer = requireDeployer(env) + const artifact = loadArtifactFromSource(contract.artifact) + const deployFn = deploy(env) + + const result = await deployFn(contract.name, { + account: deployer, + artifact, + args: constructorArgs, + }) + + if (result.newlyDeployed) { + env.showMessage(`\n✓ ${contract.name} deployed at ${result.address}`) + } else { + env.showMessage(`\n✓ ${contract.name} unchanged at ${result.address}`) + } + + // Update address book based on which book the contract belongs to + if (contract.addressBook === 'horizon') { + await graph.updateHorizonAddressBook(env, { + name: contract.name, + address: result.address, + }) + } else if (contract.addressBook === 'issuance') { + await graph.updateIssuanceAddressBook(env, { + name: contract.name, + address: result.address, + }) + } + + return { + address: result.address, + newlyDeployed: !!result.newlyDeployed, + } +} diff --git a/packages/deployment/lib/deployment-config.ts b/packages/deployment/lib/deployment-config.ts new file mode 100644 index 000000000..7f845950d --- /dev/null +++ b/packages/deployment/lib/deployment-config.ts @@ -0,0 +1,138 @@ +import { readFileSync } from 'node:fs' +import { resolve, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' +import type { Environment } from '@rocketh/core/types' + +import { getTargetChainIdFromEnv } from './address-book-utils.js' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +/** Chain ID to config file name mapping */ +const CHAIN_CONFIG_MAP: Record = { + 1337: 'localNetwork', + 42161: 'arbitrumOne', + 421614: 'arbitrumSepolia', +} + +/** + * Raw on-disk shape of `config/.json5`. Every field is optional — + * networks override only what they need; the rest comes from `DEFAULT_SETTINGS`. + */ +interface DeploymentConfigFile { + IssuanceAllocator?: { + ramAllocatorMintingGrtPerBlock?: string + ramSelfMintingGrtPerBlock?: string + } + RewardsManager?: { + revertOnIneligible?: boolean + } + RecurringCollector?: { + revokeSignerThawingPeriod?: string + eip712Name?: string + eip712Version?: string + } +} + +/** + * Fully-resolved deployment settings for a given chain. + * + * Every field is concrete — defaults from `DEFAULT_SETTINGS` are applied for + * any field a network's config file omits. Consumers (deploy scripts and + * status checks) read this directly without per-call `??` fallbacks, so the + * "expected value" lives in exactly one place per field. + */ +export interface ResolvedSettings { + rewardsManager: { + /** Revert on reward claim attempts by ineligible indexers. */ + revertOnIneligible: boolean + } + issuanceAllocator: { + /** GRT/block minted by IA and routed to RAM. `'0'` means unconfigured (skip allocation). */ + ramAllocatorMintingGrtPerBlock: string + /** GRT/block self-minted by RAM. `'0'` means RAM does not self-mint. */ + ramSelfMintingGrtPerBlock: string + } + recurringCollector: { + /** Signer revocation thaw period in seconds (constructor arg). */ + revokeSignerThawingPeriod: string + /** EIP-712 domain name (init arg). */ + eip712Name: string + /** EIP-712 domain version (init arg). */ + eip712Version: string + } +} + +const DEFAULT_SETTINGS: ResolvedSettings = { + rewardsManager: { + revertOnIneligible: true, + }, + issuanceAllocator: { + ramAllocatorMintingGrtPerBlock: '0', + ramSelfMintingGrtPerBlock: '0', + }, + recurringCollector: { + revokeSignerThawingPeriod: '28800', // ~1 day at 3s blocks + eip712Name: 'RecurringCollector', + eip712Version: '1', + }, +} + +/** + * Strip single-line // comments from JSON5-style content so it can be parsed + * by JSON.parse. Preserves strings containing //. + */ +function stripComments(text: string): string { + return text.replace(/^\s*\/\/.*$/gm, '').replace(/,(\s*[}\]])/g, '$1') +} + +function loadConfigFile(chainId: number): DeploymentConfigFile { + const networkName = CHAIN_CONFIG_MAP[chainId] + if (!networkName) return {} + + const configPath = resolve(__dirname, '..', 'config', `${networkName}.json5`) + try { + const raw = readFileSync(configPath, 'utf-8') + return JSON.parse(stripComments(raw)) as DeploymentConfigFile + } catch { + return {} + } +} + +/** + * Get fully-resolved deployment settings for a chain. + * + * Reads `config/.json5` (if present) and applies `DEFAULT_SETTINGS` + * for any field the network omits. Pure / sync — safe to call from non-deploy + * contexts (e.g. the status task). Returns full defaults for unknown chains. + */ +export function getResolvedSettings(chainId: number): ResolvedSettings { + const file = loadConfigFile(chainId) + return { + rewardsManager: { + revertOnIneligible: file.RewardsManager?.revertOnIneligible ?? DEFAULT_SETTINGS.rewardsManager.revertOnIneligible, + }, + issuanceAllocator: { + ramAllocatorMintingGrtPerBlock: + file.IssuanceAllocator?.ramAllocatorMintingGrtPerBlock ?? + DEFAULT_SETTINGS.issuanceAllocator.ramAllocatorMintingGrtPerBlock, + ramSelfMintingGrtPerBlock: + file.IssuanceAllocator?.ramSelfMintingGrtPerBlock ?? + DEFAULT_SETTINGS.issuanceAllocator.ramSelfMintingGrtPerBlock, + }, + recurringCollector: { + revokeSignerThawingPeriod: + file.RecurringCollector?.revokeSignerThawingPeriod ?? + DEFAULT_SETTINGS.recurringCollector.revokeSignerThawingPeriod, + eip712Name: file.RecurringCollector?.eip712Name ?? DEFAULT_SETTINGS.recurringCollector.eip712Name, + eip712Version: file.RecurringCollector?.eip712Version ?? DEFAULT_SETTINGS.recurringCollector.eip712Version, + }, + } +} + +/** + * Convenience wrapper for deploy scripts that have an `env` but not a chainId. + */ +export async function getResolvedSettingsForEnv(env: Environment): Promise { + const chainId = await getTargetChainIdFromEnv(env) + return getResolvedSettings(chainId) +} diff --git a/packages/deployment/lib/deployment-tags.ts b/packages/deployment/lib/deployment-tags.ts index 26bf286b6..9db4bbdad 100644 --- a/packages/deployment/lib/deployment-tags.ts +++ b/packages/deployment/lib/deployment-tags.ts @@ -1,15 +1,13 @@ /** - * Deployment Tag Library - Standardized tags for deployment scripts + * Deployment Tag Library * - * This module provides: - * - Constants for all deployment tags - * - Utilities to generate action-specific tags - * - Type safety for tag usage + * Tags select components, skip functions gate actions: + * - Component tags: PascalCase contract name (e.g., 'IssuanceAllocator') + * - Action verbs: deploy, upgrade, configure, transfer, integrate, all + * - Phase scopes: GIP-NNNN:phase (e.g., 'GIP-0088:upgrade') + * - Activation goals: GIP-NNNN:phase-action (e.g., 'GIP-0088:eligibility-integrate') * - * Tag Patterns: - * - Component tags: Base identifier (e.g., 'issuance-allocator') - * - Action tags: Component + suffix (e.g., 'issuance-allocator-deploy') - * - Category tags: Grouping tags (e.g., 'issuance-core') + * Usage: --tags IssuanceAllocator,deploy → matches component, deploy runs, others skip */ /** @@ -21,42 +19,66 @@ export const DeploymentActions = { CONFIGURE: 'configure', TRANSFER: 'transfer', INTEGRATE: 'integrate', - VERIFY: 'verify', + ALL: 'all', } as const /** - * Core component tags (base identifiers) + * Core component tags (PascalCase contract names matching the registry) */ export const ComponentTags = { // Core contracts with full lifecycle (deploy + upgrade + configure) - ISSUANCE_ALLOCATOR: 'issuance-allocator', - PILOT_ALLOCATION: 'pilot-allocation', - REWARDS_RECLAIM: 'rewards-reclaim', + ISSUANCE_ALLOCATOR: 'IssuanceAllocator', + DEFAULT_ALLOCATION: 'DefaultAllocation', + REWARDS_RECLAIM: 'RewardsReclaim', // Implementations and support contracts - DIRECT_ALLOCATION_IMPL: 'direct-allocation-impl', - REWARDS_ELIGIBILITY: 'rewards-eligibility', + DIRECT_ALLOCATION_IMPL: 'DirectAllocation_Implementation', + REWARDS_ELIGIBILITY_A: 'RewardsEligibilityOracleA', + REWARDS_ELIGIBILITY_B: 'RewardsEligibilityOracleB', + REWARDS_ELIGIBILITY_MOCK: 'RewardsEligibilityOracleMock', - // Process tags (not contract deployments) - ISSUANCE_ACTIVATION: 'issuance-activation', - VERIFY_GOVERNANCE: 'verify-governance', - - // External dependencies (Horizon contracts) - REWARDS_MANAGER: 'rewards-manager', - REWARDS_MANAGER_DEPLOY: 'rewards-manager-deploy', - REWARDS_MANAGER_UPGRADE: 'rewards-manager-upgrade', + // Horizon contracts + RECURRING_COLLECTOR: 'RecurringCollector', + REWARDS_MANAGER: 'RewardsManager', + HORIZON_STAKING: 'HorizonStaking', + PAYMENTS_ESCROW: 'PaymentsEscrow', // SubgraphService contracts - SUBGRAPH_SERVICE: 'subgraph-service', + SUBGRAPH_SERVICE: 'SubgraphService', + DISPUTE_MANAGER: 'DisputeManager', + + // Legacy contracts (graph proxy, upgrade only) + L2_CURATION: 'L2Curation', + + // Issuance agreement contracts + RECURRING_AGREEMENT_MANAGER: 'RecurringAgreementManager', } as const /** - * Category tags for grouping deployments + * Goal tags - deployment goals that orchestrate component lifecycles + * + * Two-dimensional: phase scope × action verbs. + * - Phase scopes select which contracts (`GIP-0088:upgrade`, `GIP-0088:eligibility`, etc.) + * - Action verbs select which lifecycle step (`deploy`, `configure`, `transfer`, `upgrade`) + * - Activation goals are phase-scoped governance TXs (`GIP-0088:eligibility-integrate`) + * - Optional goals bypass the `all` wildcard + * + * Combined: `--tags GIP-0088:issuance,deploy` */ -export const CategoryTags = { - ISSUANCE_CORE: 'issuance-core', - ISSUANCE_GOVERNANCE: 'issuance-governance', - ISSUANCE: 'issuance', +export const GoalTags = { + // Overall GIP scope (status + verification) + GIP_0088: 'GIP-0088', + + // Upgrade phase (deploy, configure, transfer, upgrade — combined with action verbs) + GIP_0088_UPGRADE: 'GIP-0088:upgrade', + + // Activation goals (governance TXs — after upgrade complete) + GIP_0088_ELIGIBILITY_INTEGRATE: 'GIP-0088:eligibility-integrate', + GIP_0088_ISSUANCE_CONNECT: 'GIP-0088:issuance-connect', + GIP_0088_ISSUANCE_ALLOCATE: 'GIP-0088:issuance-allocate', + + // Optional goals (not activated by `all`) + GIP_0088_ISSUANCE_CLOSE_GUARD: 'GIP-0088:issuance-close-guard', } as const /** @@ -67,74 +89,62 @@ export const SpecialTags = { } as const /** - * Generate action tag from component and action + * Parse the value of --tags from argv. + * + * Supports both `--tags foo,bar` (space) and `--tags=foo,bar` (equals). + * Returns null when not present or when the space form has no following arg. + */ +function parseTagsArg(): string[] | null { + const argv = process.argv + for (let i = 0; i < argv.length; i++) { + const a = argv[i] + if (a === '--tags') { + if (i + 1 >= argv.length) return null + return argv[i + 1].split(',') + } + if (a.startsWith('--tags=')) { + return a.slice('--tags='.length).split(',') + } + } + return null +} + +/** + * Check whether --tags was specified on the command line. + * + * Returns true (skip) when no --tags are present. Used by status modules + * to skip when the user didn't request any specific component. */ -export function actionTag( - component: string, - action: (typeof DeploymentActions)[keyof typeof DeploymentActions], -): string { - return `${component}-${action}` +export function noTagsRequested(): boolean { + return parseTagsArg() === null } /** - * Common tag patterns for deployment scripts - * Note: Arrays are not readonly to match DeployScriptModule.tags type (string[]) + * Check whether a deploy script should skip based on action verbs in --tags. + * + * Returns true (skip) when: + * - No --tags specified at all (safety: require explicit tags for mutations) + * - The verb is not present in the requested tags + * + * The 'all' verb is a wildcard: `--tags Component,all` activates every action + * (deploy, upgrade, configure, transfer, integrate) plus the end verification. + * + * Used by script factories and custom deploy scripts to gate mutations. + */ +export function shouldSkipAction(verb: string): boolean { + const tags = parseTagsArg() + if (tags === null) return true + return !tags.includes(verb) && !tags.includes(DeploymentActions.ALL) +} + +/** + * Check whether an optional goal should skip. + * + * Unlike `shouldSkipAction`, this does NOT respond to the `all` wildcard. + * Optional goals only run when their specific tag is explicitly requested. */ -export const Tags = { - // IssuanceAllocator lifecycle - issuanceAllocatorDeploy: [ - actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.DEPLOY), - CategoryTags.ISSUANCE_CORE, - ] as string[], - issuanceAllocatorUpgrade: [actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.UPGRADE)] as string[], - issuanceAllocatorConfigure: [actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.CONFIGURE)] as string[], - issuanceTransfer: [actionTag(ComponentTags.ISSUANCE_ALLOCATOR, DeploymentActions.TRANSFER)] as string[], - issuanceAllocator: [ComponentTags.ISSUANCE_ALLOCATOR] as string[], // Aggregate - - // PilotAllocation lifecycle - pilotAllocationDeploy: [ - actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.DEPLOY), - CategoryTags.ISSUANCE_CORE, - ] as string[], - pilotAllocationUpgrade: [actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.UPGRADE)] as string[], - pilotAllocationConfigure: [actionTag(ComponentTags.PILOT_ALLOCATION, DeploymentActions.CONFIGURE)] as string[], - pilotAllocation: [ComponentTags.PILOT_ALLOCATION] as string[], // Aggregate - - // Rewards reclaim lifecycle - rewardsReclaimDeploy: [actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.DEPLOY)] as string[], - rewardsReclaimUpgrade: [actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.UPGRADE)] as string[], - rewardsReclaimConfigure: [actionTag(ComponentTags.REWARDS_RECLAIM, DeploymentActions.CONFIGURE)] as string[], - rewardsReclaim: [ComponentTags.REWARDS_RECLAIM] as string[], // Aggregate - - // RewardsEligibilityOracle lifecycle - rewardsEligibilityDeploy: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.DEPLOY)] as string[], - rewardsEligibilityUpgrade: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.UPGRADE)] as string[], - rewardsEligibilityConfigure: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.CONFIGURE)] as string[], - rewardsEligibilityTransfer: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.TRANSFER)] as string[], - rewardsEligibilityIntegrate: [actionTag(ComponentTags.REWARDS_ELIGIBILITY, DeploymentActions.INTEGRATE)] as string[], - rewardsEligibility: [ComponentTags.REWARDS_ELIGIBILITY] as string[], // Aggregate - - // Support contracts - directAllocationImpl: [ComponentTags.DIRECT_ALLOCATION_IMPL] as string[], - - // Process steps - issuanceActivation: [ComponentTags.ISSUANCE_ACTIVATION] as string[], - verifyGovernance: [ - ComponentTags.VERIFY_GOVERNANCE, - CategoryTags.ISSUANCE_GOVERNANCE, - CategoryTags.ISSUANCE, - ] as string[], - - // Top-level aggregate - issuanceAllocation: ['issuance-allocation'] as string[], - - // Horizon RewardsManager lifecycle - rewardsManagerDeploy: [ComponentTags.REWARDS_MANAGER_DEPLOY] as string[], - rewardsManagerUpgrade: [ComponentTags.REWARDS_MANAGER_UPGRADE] as string[], - rewardsManager: [ComponentTags.REWARDS_MANAGER] as string[], - - // SubgraphService lifecycle - subgraphServiceDeploy: [actionTag(ComponentTags.SUBGRAPH_SERVICE, DeploymentActions.DEPLOY)] as string[], - subgraphServiceUpgrade: [actionTag(ComponentTags.SUBGRAPH_SERVICE, DeploymentActions.UPGRADE)] as string[], - subgraphService: [ComponentTags.SUBGRAPH_SERVICE] as string[], +export function shouldSkipOptionalGoal(goalTag: string): boolean { + const tags = parseTagsArg() + if (tags === null) return true + return !tags.includes(goalTag) } diff --git a/packages/deployment/lib/deployment-validation.ts b/packages/deployment/lib/deployment-validation.ts index 9c53c4bdb..e811b3f8e 100644 --- a/packages/deployment/lib/deployment-validation.ts +++ b/packages/deployment/lib/deployment-validation.ts @@ -11,6 +11,7 @@ import type { AnyAddressBookOps } from './address-book-ops.js' import type { ArtifactSource } from './contract-registry.js' import { computeBytecodeHash } from './bytecode-utils.js' import { + getLibraryResolver, loadContractsArtifact, loadIssuanceArtifact, loadOpenZeppelinArtifact, @@ -141,7 +142,12 @@ export async function validateContract( } if (loadedArtifact?.deployedBytecode && metadata?.bytecodeHash) { - const localHash = computeBytecodeHash(loadedArtifact.deployedBytecode) + const libResolver = getLibraryResolver(artifact.type) + const localHash = computeBytecodeHash( + loadedArtifact.deployedBytecode, + loadedArtifact.deployedLinkReferences, + libResolver, + ) if (metadata.bytecodeHash !== localHash) { return { contract: contractName, @@ -178,7 +184,7 @@ export async function validateContract( } // Optional: Verify argsData matches transaction - if (options.verifyArgsData && metadata?.txHash && loadedArtifact?.bytecode) { + if (options.verifyArgsData && metadata?.txHash && metadata?.argsData && loadedArtifact?.bytecode) { try { const tx = await client.getTransaction({ hash: metadata.txHash as `0x${string}` }) if (tx?.input) { diff --git a/packages/deployment/lib/execute-governance.ts b/packages/deployment/lib/execute-governance.ts index 0b9733103..e39cde9cc 100644 --- a/packages/deployment/lib/execute-governance.ts +++ b/packages/deployment/lib/execute-governance.ts @@ -35,7 +35,7 @@ interface SafeTxBatch { * @param networkName - Network name (e.g., 'fork', 'localhost', 'arbitrumSepolia') */ export function getGovernanceTxDir(networkName: string): string { - const forkNetwork = getForkNetwork() + const forkNetwork = getForkNetwork(networkName) if (forkNetwork) { return path.join(getForkStateDir(networkName, forkNetwork), 'txs') } @@ -117,41 +117,42 @@ export async function createGovernanceTxBuilder( * Save governance TX batch and exit with code 1 * * Standard completion pattern for scripts that generate governance TX batches. - * This function: - * 1. Saves the TX batch to file - * 2. Displays appropriate messages - * 3. Exits with code 1 to prevent subsequent deployment steps + * Saves the TX batch to file and displays a message. + * Returns the saved file path so the caller can continue. + * + * Subsequent scripts that depend on this TX being executed should check + * their own preconditions and exit if not met. * * @param env - Deployment environment * @param builder - TX builder with batched transactions - * @param contractName - Optional contract name for contextual message (e.g., "IssuanceAllocator activation") - * @returns Never returns (exits process) + * @param contractName - Optional contract name for contextual message + * @returns Path to the saved TX file */ -export function saveGovernanceTxAndExit( +export function saveGovernanceTx( env: Environment, builder: { saveToFile: () => string }, contractName?: string, -): never { +): string { const txFile = builder.saveToFile() - env.showMessage(`\n✓ TX batch saved: ${txFile}`) + env.showMessage(` ✓ Governance TX saved: ${txFile}`) - env.showMessage('\n📋 GOVERNANCE ACTION REQUIRED:') if (contractName) { env.showMessage(` ${contractName} requires governance execution`) } - env.showMessage(` TX batch: ${txFile}`) - env.showMessage('\nNext steps:') - env.showMessage(' 1. Execute governance TX (see options below)') - env.showMessage(' 2. Run: npx hardhat deploy --tags sync --network ' + env.name) - env.showMessage(' 3. Continue deployment') - env.showMessage('\nExecution options:') - env.showMessage(' • Fork testing: npx hardhat deploy:execute-governance --network fork') - env.showMessage(' • EOA governor: Set GOVERNOR_PRIVATE_KEY and run deploy:execute-governance') - env.showMessage(' • Safe multisig: https://app.safe.global/ → Transaction Builder → Upload JSON') - env.showMessage('\nSee: packages/deployment/docs/GovernanceWorkflow.md\n') - - // Exit with code 1 to prevent subsequent steps from running until governance TX is executed - // This is expected prerequisite state, not an error + env.showMessage(` Run: npx hardhat deploy:execute-governance --network ${env.name}`) + + return txFile +} + +/** + * @deprecated Use `saveGovernanceTx` instead. This function exits the process. + */ +export function saveGovernanceTxAndExit( + env: Environment, + builder: { saveToFile: () => string }, + contractName?: string, +): never { + saveGovernanceTx(env, builder, contractName) process.exit(1) } @@ -219,12 +220,14 @@ export interface ExecuteGovernanceOptions { name?: string /** Governor private key (from keystore or env var) */ governorPrivateKey?: string + /** Lazy resolver for governor key - defers keystore access until actually needed */ + resolveGovernorKey?: () => Promise } export async function executeGovernanceTxs(env: Environment, options?: ExecuteGovernanceOptions): Promise { - const { name, governorPrivateKey } = options ?? {} + const { name, governorPrivateKey, resolveGovernorKey } = options ?? {} // Determine TX directory - in fork mode, also check source network's TX directory - const forkNetwork = getForkNetwork() + const forkNetwork = getForkNetwork(env.name) let txDir = getGovernanceTxDir(env.name) let sourceNetworkFallback = false @@ -278,8 +281,8 @@ export async function executeGovernanceTxs(env: Environment, options?: ExecuteGo transport: custom(env.network.provider), }) - // Check if in fork mode - const inForkMode = isForkMode() + // Check if in fork mode (network-aware: ignores FORK_NETWORK on real networks) + const inForkMode = isForkMode(env.name) if (!inForkMode) { // Not in fork mode - check if governor is EOA or Safe @@ -310,8 +313,9 @@ export async function executeGovernanceTxs(env: Environment, options?: ExecuteGo return 0 } - // Governor is an EOA - if (!governorPrivateKey) { + // Governor is an EOA - resolve key now (deferred to avoid keystore prompt in fork mode) + const resolvedKey = governorPrivateKey ?? (await resolveGovernorKey?.()) + if (!resolvedKey) { const keyName = `${networkToEnvPrefix(env.name)}_GOVERNOR_KEY` env.showMessage(`\n❌ Cannot execute governance TXs on ${env.name}`) env.showMessage(` Governor address: ${governor} (EOA)`) @@ -333,7 +337,7 @@ export async function executeGovernanceTxs(env: Environment, options?: ExecuteGo // Have private key - execute as EOA env.showMessage(`\n🔓 Executing ${files.length} governance TX batch(es)...`) env.showMessage(` Governor: ${governor} (EOA)`) - return await executeWithEOA(env, publicClient, files, txDir, governorPrivateKey) + return await executeWithEOA(env, publicClient, files, txDir, resolvedKey) } // Fork mode - use impersonation diff --git a/packages/deployment/lib/format.ts b/packages/deployment/lib/format.ts new file mode 100644 index 000000000..fd1bf1359 --- /dev/null +++ b/packages/deployment/lib/format.ts @@ -0,0 +1,10 @@ +/** + * Formatting helpers for human-readable display of on-chain values. + */ + +import { formatEther } from 'viem' + +/** Format a wei amount as GRT (e.g. `6036500000000000000n` → `"6.0365 GRT"`). */ +export function formatGRT(wei: bigint): string { + return `${formatEther(wei)} GRT` +} diff --git a/packages/deployment/lib/issuance-deploy-utils.ts b/packages/deployment/lib/issuance-deploy-utils.ts index bd1b5f486..a7ac62727 100644 --- a/packages/deployment/lib/issuance-deploy-utils.ts +++ b/packages/deployment/lib/issuance-deploy-utils.ts @@ -3,6 +3,7 @@ import type { Environment } from '@rocketh/core/types' import type { PublicClient } from 'viem' import { encodeFunctionData } from 'viem' +import type { AnyAddressBookOps } from './address-book-ops.js' import { Contracts, type RegistryEntry } from './contract-registry.js' import { getGovernor } from './controller-utils.js' import { @@ -12,9 +13,10 @@ import { loadArtifactFromSource, } from './deploy-implementation.js' import { loadTransparentProxyArtifact } from './artifact-loaders.js' -import { INITIALIZE_GOVERNOR_ABI } from './abis.js' +import { INITIALIZE_GOVERNOR_ABI, OZ_PROXY_ADMIN_ABI } from './abis.js' import { computeBytecodeHash } from './bytecode-utils.js' -import { deploy, graph } from '../rocketh/deploy.js' +import { getTargetChainIdFromEnv } from './address-book-utils.js' +import { deploy, execute, graph } from '../rocketh/deploy.js' /** ERC1967 admin slot: keccak256("eip1967.proxy.admin") - 1 */ const ERC1967_ADMIN_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103' @@ -36,6 +38,25 @@ export function requireDeployer(env: Environment): string { return deployer } +/** + * Address derived from the dummy private key (0x…001) used for status-only runs. + * Filtered out so status scripts don't mistake it for the real deployer. + */ +const DUMMY_DEPLOYER_ADDRESS = '0x7e5f4552091a69125d5dfcb7b8c2659029395bdf' + +/** + * Get deployer address if available (non-throwing). + * + * Returns undefined when the deploy key is not loaded (e.g. status-only runs + * where the keystore password is not prompted). Status scripts infer the real + * deployer from the ProxyAdmin owner on-chain instead. + */ +export function getDeployer(env: Environment): string | undefined { + const deployer = env.namedAccounts.deployer + if (!deployer || deployer.toLowerCase() === DUMMY_DEPLOYER_ADDRESS) return undefined + return deployer +} + /** * Require a contract deployment to exist, throwing a helpful error if not found */ @@ -117,7 +138,7 @@ export function showDeploymentStatus( if (result.newlyDeployed) { env.showMessage(`✓ ${contract.name} deployed at ${result.address}`) } else { - env.showMessage(`✓ ${contract.name} deployed at ${result.address}`) + env.showMessage(`✓ ${contract.name} unchanged at ${result.address}`) } } @@ -145,7 +166,8 @@ export function showProxyDeploymentStatus( } /** - * Update issuance address book with proxy deployment information + * Update address book with proxy deployment information. + * Routes to the correct address book based on contract.addressBook. */ export async function updateProxyAddressBook( env: Environment, @@ -156,14 +178,20 @@ export async function updateProxyAddressBook( proxyAdminAddress?: string, implementationDeployment?: DeploymentMetadata, ) { - await graphUtils.updateIssuanceAddressBook(env, { + const update = { name: contract.name, address: proxyAddress, - proxy: 'transparent', + proxy: 'transparent' as const, proxyAdmin: proxyAdminAddress, implementation: implAddress, implementationDeployment, - }) + } + + if (contract.addressBook === 'horizon') { + await graphUtils.updateHorizonAddressBook(env, update) + } else { + await graphUtils.updateIssuanceAddressBook(env, update) + } } /** @@ -234,7 +262,8 @@ export interface ProxyDeployConfig { * * Uses OpenZeppelin v5's per-proxy ProxyAdmin pattern: * - Each proxy creates its own ProxyAdmin in the constructor - * - Governor owns all per-proxy ProxyAdmins + * - Deployer is the initial ProxyAdmin owner (for post-deployment configuration) + * - Ownership is transferred to governor in the transfer-governance step * - No shared ProxyAdmin required * * Deployment scenarios: @@ -270,12 +299,58 @@ export async function deployProxyContract( if (existingProxy) { if (sharedImplementation) { - // Shared implementation - just report status + // Shared implementation — detect if redeployed and set pendingImplementation env.showMessage(`✓ ${contract.name} proxy already deployed at ${existingProxy.address}`) env.showMessage(` Uses shared implementation: ${sharedImplementation.name}`) - // Check current implementation status + const implDep = env.getOrNull(sharedImplementation.name) + if (!implDep) { + // Missing impl record means the impl's deploy script didn't run, or sync + // skipped seeding because the artifact couldn't be verified against the + // address book. Either way, silently treating this as "no change" would + // mask a drift between artifact and on-chain bytecode (the shared impl + // bug fixed alongside this guard). Fail loud instead. + throw new Error( + `${contract.name}: shared implementation ${sharedImplementation.name} not in env. ` + + `Ensure ${sharedImplementation.name} is listed in dependencies and its deploy script ran successfully.`, + ) + } + const client = graph.getPublicClient(env) + const onChainImpl = await getOnChainImplementation(client, existingProxy.address, 'transparent') + + if (onChainImpl.toLowerCase() !== implDep.address.toLowerCase()) { + // Shared implementation changed — store as pending for governance upgrade + const targetChainId = await getTargetChainIdFromEnv(env) + const addressBook: AnyAddressBookOps = + contract.addressBook === 'horizon' + ? graph.getHorizonAddressBook(targetChainId) + : graph.getIssuanceAddressBook(targetChainId) + + // Get deployment metadata from the shared implementation's address book entry + const implMetadata = addressBook.getDeploymentMetadata(sharedImplementation.name) + addressBook.setPendingImplementationWithMetadata( + contract.name, + implDep.address, + implMetadata ?? { txHash: '', bytecodeHash: '' }, + ) + + env.showMessage(``) + env.showMessage(`⚠️ UPGRADE REQUIRED`) + env.showMessage(` Proxy: ${existingProxy.address}`) + env.showMessage(` Current (on-chain): ${onChainImpl}`) + env.showMessage(` New implementation: ${implDep.address}`) + env.showMessage(``) + env.showMessage(` Stored as pending — run upgrade task to generate governance TX.`) + + return { + address: existingProxy.address, + newlyDeployed: false, + upgraded: true, + } + } + + // No change — check existing pending status await checkPendingUpgrade(env, client, contract, existingProxy.address, 'transparent') return { @@ -315,10 +390,10 @@ export async function deployProxyContract( // Fresh deployment - deploy implementation first, then OZ v5 proxy if (sharedImplementation) { - return deployProxyWithSharedImpl(env, contract, sharedImplementation, governor, actualInitializeArgs, deployer) + return deployProxyWithSharedImpl(env, contract, sharedImplementation, actualInitializeArgs, deployer) } - return deployProxyWithOwnImpl(env, contract, governor, constructorArgs, actualInitializeArgs, deployer) + return deployProxyWithOwnImpl(env, contract, constructorArgs, actualInitializeArgs, deployer) } /** @@ -327,7 +402,6 @@ export async function deployProxyContract( async function deployProxyWithOwnImpl( env: Environment, contract: RegistryEntry, - governor: string, constructorArgs: unknown[], initializeArgs: unknown[], deployer: string, @@ -348,16 +422,17 @@ async function deployProxyWithOwnImpl( env.showMessage(` Implementation deployed at ${implResult.address}`) - // Encode initialize call + // Encode initialize call using the contract's own ABI const initCalldata = encodeFunctionData({ - abi: INITIALIZE_GOVERNOR_ABI, + abi: implArtifact.abi, functionName: 'initialize', args: initializeArgs as [`0x${string}`], }) // Deploy OZ v5 TransparentUpgradeableProxy // Constructor: (address _logic, address initialOwner, bytes memory _data) - // The proxy creates its own ProxyAdmin owned by initialOwner (governor) + // Deployer is the initial ProxyAdmin owner to allow post-deployment configuration. + // Ownership is transferred to the protocol governor in the transfer-governance step. // Use issuance-compiled proxy artifact (0.8.34) for consistent verification const proxyArtifact = loadTransparentProxyArtifact() const proxyResult = await deployFn( @@ -365,7 +440,7 @@ async function deployProxyWithOwnImpl( { account: deployer, artifact: proxyArtifact, - args: [implResult.address, governor, initCalldata], + args: [implResult.address, deployer, initCalldata], }, { skipIfAlreadyDeployed: true }, ) @@ -405,7 +480,7 @@ async function deployProxyWithOwnImpl( if (proxyResult.newlyDeployed) { env.showMessage(`✓ ${contract.name} proxy deployed at ${proxyResult.address}`) env.showMessage(` Implementation: ${implResult.address}`) - env.showMessage(` ProxyAdmin (per-proxy): ${proxyAdminAddress}`) + env.showMessage(` ProxyAdmin (per-proxy, deployer-owned): ${proxyAdminAddress}`) } else { env.showMessage(`✓ ${contract.name} already deployed at ${proxyResult.address}`) } @@ -424,7 +499,6 @@ async function deployProxyWithSharedImpl( env: Environment, contract: RegistryEntry, sharedImplementation: RegistryEntry, - governor: string, initializeArgs: unknown[], deployer: string, ): Promise<{ address: string; newlyDeployed: boolean; upgraded: boolean }> { @@ -447,6 +521,8 @@ async function deployProxyWithSharedImpl( // Deploy OZ v5 TransparentUpgradeableProxy // Constructor: (address _logic, address initialOwner, bytes memory _data) + // Deployer is the initial ProxyAdmin owner to allow post-deployment configuration. + // Ownership is transferred to the protocol governor in the transfer-governance step. // Use issuance-compiled proxy artifact (0.8.34) for consistent verification const proxyArtifact = loadTransparentProxyArtifact() const proxyResult = await deployFn( @@ -454,7 +530,7 @@ async function deployProxyWithSharedImpl( { account: deployer, artifact: proxyArtifact, - args: [implDep.address, governor, initCalldata], + args: [implDep.address, deployer, initCalldata], }, { skipIfAlreadyDeployed: true }, ) @@ -475,7 +551,7 @@ async function deployProxyWithSharedImpl( if (proxyResult.newlyDeployed) { env.showMessage(`✓ ${contract.name} proxy deployed at ${proxyResult.address}`) env.showMessage(` Implementation: ${implDep.address}`) - env.showMessage(` ProxyAdmin (per-proxy): ${proxyAdminAddress}`) + env.showMessage(` ProxyAdmin (per-proxy, deployer-owned): ${proxyAdminAddress}`) } else { env.showMessage(`✓ ${contract.name} already deployed at ${proxyResult.address}`) } @@ -486,3 +562,74 @@ async function deployProxyWithSharedImpl( upgraded: false, } } + +/** + * Transfer ProxyAdmin ownership for an issuance contract from deployer to governor. + * + * Reads the per-proxy ProxyAdmin address from the address book entry's proxyAdmin field, + * checks current ownership, and transfers if needed. Idempotent: skips if already owned + * by the target governor. + * + * @param env - Deployment environment + * @param contract - Registry entry for the contract whose ProxyAdmin to transfer + * @returns Whether a transfer was executed + * + * @example + * ```typescript + * await transferProxyAdminOwnership(env, Contracts.issuance.IssuanceAllocator) + * ``` + */ +export async function transferProxyAdminOwnership(env: Environment, contract: RegistryEntry): Promise { + const deployer = requireDeployer(env) + const governor = await getGovernor(env) + const client = graph.getPublicClient(env) as PublicClient + + // Get ProxyAdmin address from address book + const targetChainId = await getTargetChainIdFromEnv(env) + const ab = graph.getIssuanceAddressBook(targetChainId) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const entry = ab.getEntry(contract.name as any) + const proxyAdminAddress = entry?.proxyAdmin + + if (!proxyAdminAddress) { + throw new Error(`No proxyAdmin found in address book for ${contract.name}`) + } + + // Check current owner + const currentOwner = (await client.readContract({ + address: proxyAdminAddress as `0x${string}`, + abi: OZ_PROXY_ADMIN_ABI, + functionName: 'owner', + })) as string + + if (currentOwner.toLowerCase() === governor.toLowerCase()) { + env.showMessage(` ProxyAdmin ownership already transferred to governor: ${proxyAdminAddress}`) + return false + } + + if (currentOwner.toLowerCase() !== deployer.toLowerCase()) { + throw new Error( + `ProxyAdmin ${proxyAdminAddress} owned by ${currentOwner}, expected deployer ${deployer}. ` + + `Cannot transfer ownership.`, + ) + } + + // Transfer ownership to governor + env.showMessage(` Transferring ProxyAdmin ownership to governor...`) + env.showMessage(` ProxyAdmin: ${proxyAdminAddress}`) + env.showMessage(` From: ${deployer}`) + env.showMessage(` To: ${governor}`) + + const executeFn = execute(env) + await executeFn( + { address: proxyAdminAddress as `0x${string}`, abi: OZ_PROXY_ADMIN_ABI }, + { + account: deployer, + functionName: 'transferOwnership', + args: [governor as `0x${string}`], + }, + ) + + env.showMessage(` ✓ ProxyAdmin ownership transferred to governor`) + return true +} diff --git a/packages/deployment/lib/oz-proxy-verify.ts b/packages/deployment/lib/oz-proxy-verify.ts index 79c5609d6..2e3b0f305 100644 --- a/packages/deployment/lib/oz-proxy-verify.ts +++ b/packages/deployment/lib/oz-proxy-verify.ts @@ -110,6 +110,39 @@ export function getEtherscanBrowserUrl(chainId: number): string { return url } +/** + * Check if a contract is already verified on Etherscan. + * + * Queries the getsourcecode API — a verified contract has a non-empty + * SourceCode field. Returns the explorer URL if verified, undefined otherwise. + */ +export async function checkEtherscanVerified( + address: string, + apiKey: string, + chainId: number, +): Promise { + const apiUrl = getApiUrl() + const browserUrl = getEtherscanBrowserUrl(chainId) + + const params = new URLSearchParams({ + module: 'contract', + action: 'getsourcecode', + address, + apikey: apiKey, + }) + + try { + const response = await fetch(`${apiUrl}?chainid=${chainId}&${params.toString()}`) + const data = (await response.json()) as { status: string; result: Array<{ SourceCode?: string }> } + if (data.status === '1' && data.result?.[0]?.SourceCode) { + return `${browserUrl}/address/${address}#code` + } + } catch { + // Network error — assume not verified, let the caller proceed + } + return undefined +} + /** * Verify OZ TransparentUpgradeableProxy via Etherscan API * @@ -200,6 +233,12 @@ export async function verifyOZProxy( return { success: true, url } } + // "Already Verified" can appear during polling (not just at submission) + if (checkResult.result?.toLowerCase().includes('already verified')) { + const url = `${browserUrl}/address/${address}#code` + return { success: true, url, message: 'Already verified' } + } + // Verification failed return { success: false, message: checkResult.result } } diff --git a/packages/deployment/lib/preconditions.ts b/packages/deployment/lib/preconditions.ts new file mode 100644 index 000000000..8f000597a --- /dev/null +++ b/packages/deployment/lib/preconditions.ts @@ -0,0 +1,380 @@ +/** + * Shared Precondition Checks + * + * Each function answers "is this action step done?" for a specific component. + * Used by BOTH action scripts (to skip if done) and status scripts (for next-step hints). + * + * This is the SINGLE SOURCE OF TRUTH for precondition logic. + * Action scripts and status scripts must call the same functions — no copies. + * + * Configure checks: params, integration references, and role GRANTS (PAUSE_ROLE, GOVERNOR_ROLE) + * Transfer checks: deployer GOVERNOR_ROLE REVOKE + ProxyAdmin ownership + */ + +import type { PublicClient } from 'viem' +import { keccak256, toHex } from 'viem' + +import { + ACCESS_CONTROL_ENUMERABLE_ABI, + ISSUANCE_ALLOCATOR_ABI, + ISSUANCE_TARGET_ABI, + OZ_PROXY_ADMIN_ABI, + REWARDS_MANAGER_ABI, + REWARDS_MANAGER_DEPRECATED_ABI, +} from './abis.js' + +// ============================================================================ +// Result type +// ============================================================================ + +/** + * Result of a precondition check + * + * @property done - true if the action step is complete (on-chain state matches target) + * @property reason - why not done (human-readable, for status display) + */ +export interface PreconditionResult { + done: boolean + reason?: string +} + +// ============================================================================ +// Helpers +// ============================================================================ + +// Precomputed role hashes (matches BaseUpgradeable constants) +const GOVERNOR_ROLE = keccak256(toHex('GOVERNOR_ROLE')) +const PAUSE_ROLE = keccak256(toHex('PAUSE_ROLE')) + +/** Check if account has a role on a contract */ +async function hasRole( + client: PublicClient, + contractAddress: string, + role: `0x${string}`, + account: string, +): Promise { + return (await client.readContract({ + address: contractAddress as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [role, account as `0x${string}`], + })) as boolean +} + +/** + * Check role grants common to all deployer-initialized contracts + * + * Configure must grant: + * - GOVERNOR_ROLE to protocol governor + * - PAUSE_ROLE to pause guardian + */ +async function checkRoleGrants( + client: PublicClient, + contractAddress: string, + governor: string, + pauseGuardian: string, +): Promise<{ governorOk: boolean; pauseOk: boolean; reasons: string[] }> { + const governorOk = await hasRole(client, contractAddress, GOVERNOR_ROLE, governor) + const pauseOk = await hasRole(client, contractAddress, PAUSE_ROLE, pauseGuardian) + + const reasons: string[] = [] + if (!governorOk) reasons.push('governor missing GOVERNOR_ROLE') + if (!pauseOk) reasons.push('pauseGuardian missing PAUSE_ROLE') + + return { governorOk, pauseOk, reasons } +} + +// ============================================================================ +// Configure checks +// ============================================================================ + +/** + * Check if IssuanceAllocator is configured + * + * Matches the skip logic in allocate/allocator/04_configure.ts: + * - RM.issuancePerBlock must be > 0 (RM initialized) + * - IA.getIssuancePerBlock() must equal RM rate + * - governor has GOVERNOR_ROLE + * - pauseGuardian has PAUSE_ROLE + * + * Note: RM target allocation (setTargetAllocation) is an activation step + * in issuance-connect, not a configure step. + */ +export async function checkIAConfigured( + client: PublicClient, + iaAddress: string, + rmAddress: string, + governor: string, + pauseGuardian: string, +): Promise { + // Check RM issuance rate + const rmIssuanceRate = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: REWARDS_MANAGER_DEPRECATED_ABI, + functionName: 'issuancePerBlock', + })) as bigint + + if (rmIssuanceRate === 0n) { + return { done: false, reason: 'RM.issuancePerBlock is 0' } + } + + // Check IA rate matches RM + const iaIssuanceRate = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getIssuancePerBlock', + })) as bigint + + const rateOk = iaIssuanceRate === rmIssuanceRate && iaIssuanceRate > 0n + + // Check role grants + const roles = await checkRoleGrants(client, iaAddress, governor, pauseGuardian) + + if (rateOk && roles.governorOk && roles.pauseOk) { + return { done: true } + } + + const reasons: string[] = [] + if (!rateOk) reasons.push('rate mismatch') + reasons.push(...roles.reasons) + return { done: false, reason: reasons.join(', ') } +} + +/** + * Check if RecurringAgreementManager is configured + * + * Matches the skip logic in agreement/manager/04_configure.ts: + * - RC has COLLECTOR_ROLE + * - SS has DATA_SERVICE_ROLE + * - RAM.getIssuanceAllocator() == IA + * - governor has GOVERNOR_ROLE + * - pauseGuardian has PAUSE_ROLE + */ +export async function checkRAMConfigured( + client: PublicClient, + ramAddress: string, + rcAddress: string, + ssAddress: string, + iaAddress: string, + governor: string, + pauseGuardian: string, +): Promise { + const COLLECTOR_ROLE = keccak256(toHex('COLLECTOR_ROLE')) + const DATA_SERVICE_ROLE = keccak256(toHex('DATA_SERVICE_ROLE')) + + const rcHasCollectorRole = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [COLLECTOR_ROLE, rcAddress as `0x${string}`], + })) as boolean + + const ssHasDataServiceRole = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [DATA_SERVICE_ROLE, ssAddress as `0x${string}`], + })) as boolean + + let iaConfigured = false + try { + const currentIA = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: ISSUANCE_TARGET_ABI, + functionName: 'getIssuanceAllocator', + })) as string + iaConfigured = currentIA.toLowerCase() === iaAddress.toLowerCase() + } catch { + // Not set + } + + // Check role grants + const roles = await checkRoleGrants(client, ramAddress, governor, pauseGuardian) + + if (rcHasCollectorRole && ssHasDataServiceRole && iaConfigured && roles.governorOk && roles.pauseOk) { + return { done: true } + } + + const reasons: string[] = [] + if (!rcHasCollectorRole) reasons.push('RC missing COLLECTOR_ROLE') + if (!ssHasDataServiceRole) reasons.push('SS missing DATA_SERVICE_ROLE') + if (!iaConfigured) reasons.push('IssuanceAllocator not set') + reasons.push(...roles.reasons) + return { done: false, reason: reasons.join(', ') } +} + +/** + * Check Reclaim role grants only (governor has GOVERNOR_ROLE, pauseGuardian has PAUSE_ROLE) + * + * Use this when you need to know whether the deployer (with Reclaim GOVERNOR_ROLE) can + * fix the issue. The RM integration is governance-only and should be checked separately + * via checkReclaimRMIntegration. + */ +export async function checkReclaimRoles( + client: PublicClient, + reclaimAddress: string, + governor: string, + pauseGuardian: string, +): Promise { + const roles = await checkRoleGrants(client, reclaimAddress, governor, pauseGuardian) + if (roles.governorOk && roles.pauseOk) { + return { done: true } + } + return { done: false, reason: roles.reasons.join(', ') } +} + +/** + * Check RM integration with Reclaim: RM.getDefaultReclaimAddress() == reclaim address + * + * This is governance-only — only an account with GOVERNOR_ROLE on RM can fix it, + * which the deployer never has. Status logic should always treat a failure here + * as deferred (governance TX), not blocking on configure. + */ +export async function checkReclaimRMIntegration( + client: PublicClient, + rmAddress: string, + reclaimAddress: string, +): Promise { + try { + const currentDefault = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: REWARDS_MANAGER_ABI, + functionName: 'getDefaultReclaimAddress', + })) as string + + if (currentDefault.toLowerCase() === reclaimAddress.toLowerCase()) { + return { done: true } + } + return { done: false, reason: 'default reclaim address not set' } + } catch { + // Function not available — RM not upgraded + return { done: false, reason: 'RM not upgraded' } + } +} + +/** + * Check whether RM.getRevertOnIneligible() matches the desired value from config. + * + * Governance-only setter on RM — failure is deferred to the upgrade governance batch + * unless the deployer holds GOVERNOR_ROLE on RM (true on fresh networks where RM is + * deployed from scratch with the deployer as initial governor; false on networks + * where RM was deployed by separate horizon-Ignition infrastructure). + */ +export async function checkRMRevertOnIneligible( + client: PublicClient, + rmAddress: string, + desired: boolean, +): Promise { + try { + const onChain = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: REWARDS_MANAGER_ABI, + functionName: 'getRevertOnIneligible', + })) as boolean + if (onChain === desired) return { done: true } + return { done: false, reason: `revertOnIneligible=${onChain}, expected ${desired}` } + } catch { + return { done: false, reason: 'RM not upgraded' } + } +} + +/** + * Check if ReclaimedRewards is fully configured (roles + RM integration) + * + * Convenience wrapper that combines checkReclaimRoles and checkReclaimRMIntegration. + * Use the split functions when callers need to distinguish deployer-fixable role + * issues from governance-only RM integration issues. + */ +export async function checkReclaimConfigured( + client: PublicClient, + rmAddress: string, + reclaimAddress: string, + governor: string, + pauseGuardian: string, +): Promise { + const roles = await checkReclaimRoles(client, reclaimAddress, governor, pauseGuardian) + const rmIntegration = await checkReclaimRMIntegration(client, rmAddress, reclaimAddress) + + if (roles.done && rmIntegration.done) { + return { done: true } + } + + // If roles are done but RM not upgraded, report that specifically + if (roles.done && rmIntegration.reason === 'RM not upgraded') { + return { done: false, reason: 'RM not upgraded' } + } + + const reasons: string[] = [] + if (!roles.done && roles.reason) reasons.push(roles.reason) + if (!rmIntegration.done && rmIntegration.reason) reasons.push(rmIntegration.reason) + return { done: false, reason: reasons.join(', ') } +} + +/** + * Check if DefaultAllocation is configured + * + * - governor has GOVERNOR_ROLE on DefaultAllocation + * - pauseGuardian has PAUSE_ROLE on DefaultAllocation + * + * Note: IA.setDefaultTarget(DA) is an activation step in issuance-connect. + */ +export async function checkDefaultAllocationConfigured( + client: PublicClient, + daAddress: string, + governor: string, + pauseGuardian: string, +): Promise { + const roles = await checkRoleGrants(client, daAddress, governor, pauseGuardian) + + if (roles.governorOk && roles.pauseOk) { + return { done: true } + } + + return { done: false, reason: roles.reasons.join(', ') } +} + +// ============================================================================ +// Transfer checks +// ============================================================================ + +/** + * Check if deployer GOVERNOR_ROLE is revoked on a contract + * + * Transfer = revoke deployer access. Role grants happen in configure. + * Generic check used for IA, RAM, Reclaim. + */ +export async function checkDeployerRevoked( + client: PublicClient, + contractAddress: string, + deployer: string, +): Promise { + const deployerHasRole = await hasRole(client, contractAddress, GOVERNOR_ROLE, deployer) + + if (!deployerHasRole) { + return { done: true } + } + return { done: false, reason: 'deployer GOVERNOR_ROLE not revoked' } +} + +/** + * Check if ProxyAdmin ownership is transferred to governor + * + * Generic check used for any contract with an OZ v5 per-proxy ProxyAdmin. + * Used by transfer scripts for IA, RAM, Reclaim, REO. + */ +export async function checkProxyAdminTransferred( + client: PublicClient, + proxyAdminAddress: string, + governor: string, +): Promise { + const currentOwner = (await client.readContract({ + address: proxyAdminAddress as `0x${string}`, + abi: OZ_PROXY_ADMIN_ABI, + functionName: 'owner', + })) as string + + if (currentOwner.toLowerCase() === governor.toLowerCase()) { + return { done: true } + } + return { done: false, reason: `ProxyAdmin owned by ${currentOwner}, not governor` } +} diff --git a/packages/deployment/lib/script-factories.ts b/packages/deployment/lib/script-factories.ts new file mode 100644 index 000000000..6c1bb1de5 --- /dev/null +++ b/packages/deployment/lib/script-factories.ts @@ -0,0 +1,384 @@ +/** + * Deploy Script Factories - Create deployment modules with standard framework plumbing + * + * Two flavors: + * + * **Contract-based** (component lifecycle): + * Derive tags from registry componentTag. Action-verb skip gating. + * Post-action sync. Use for standard deploy/upgrade/configure/transfer steps. + * + * **Tag-based** (goals, multi-contract status, standalone actions): + * Accept a tag string directly. Skip when no --tags specified. + * Custom execute callback handles all logic. + * + * Skip gating uses func.skip (checked by rocketh's executor via patch) + * with early returns as a safety net. + */ + +import type { DeployScriptModule, Environment } from '@rocketh/core/types' + +import type { RegistryEntry } from './contract-registry.js' +import { deployImplementation, getImplementationConfig } from './deploy-implementation.js' +import { DeploymentActions, noTagsRequested, shouldSkipAction } from './deployment-tags.js' +import { requireUpgradeExecuted } from './execute-governance.js' +import { deployProxyContract } from './issuance-deploy-utils.js' +import { showDetailedComponentStatus } from './status-detail.js' +import { syncComponentFromRegistry, syncComponentsFromRegistry } from './sync-utils.js' +import type { ImplementationUpgradeOverrides } from './upgrade-implementation.js' +import { upgradeImplementation } from './upgrade-implementation.js' + +/** + * Require that the registry entry has a componentTag, throwing a clear error if not. + */ +function requireComponentTag(contract: RegistryEntry): string { + if (!contract.componentTag) { + throw new Error( + `Contract '${contract.name}' has no componentTag in the registry. ` + + `Add a componentTag to use script factories.`, + ) + } + return contract.componentTag +} + +/** + * Create a standard upgrade deploy script module. + * + * Generates a governance TX to upgrade the contract's proxy to its pending implementation. + * Tags and dependencies are derived from the contract's componentTag. + * + * @example Standard single-contract upgrade: + * ```typescript + * import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' + * import { createUpgradeModule } from '@graphprotocol/deployment/lib/script-factories.js' + * + * export default createUpgradeModule(Contracts.horizon.PaymentsEscrow) + * ``` + * + * @example Upgrade with implementation name override: + * ```typescript + * export default createUpgradeModule(Contracts.issuance.SomeProxy, { + * overrides: { implementationName: 'DifferentImpl' }, + * }) + * ``` + */ +export function createUpgradeModule( + contract: RegistryEntry, + options?: { + overrides?: ImplementationUpgradeOverrides + extraDependencies?: string[] + /** Additional contracts to sync alongside `contract` before the upgrade runs. */ + prerequisites?: RegistryEntry[] + }, +): DeployScriptModule { + const tag = requireComponentTag(contract) + + const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.UPGRADE)) return + await syncComponentsFromRegistry(env, [contract, ...(options?.prerequisites ?? [])]) + await upgradeImplementation(env, contract, options?.overrides) + await syncComponentFromRegistry(env, contract) + } + + func.tags = [tag] + func.dependencies = options?.extraDependencies ?? [] + func.skip = async () => shouldSkipAction(DeploymentActions.UPGRADE) + + return func +} + +/** + * Create a standard end/complete deploy script module. + * + * Gates on `--tags ...,all`. Verifies the upgrade governance TX has been + * executed and shows a ready message. The actual lifecycle actions a component + * needs are encoded in its dependency chain via the component tag, not in this + * factory. + * + * @example + * ```typescript + * export default createEndModule(Contracts.horizon.PaymentsEscrow) + * ``` + */ +export function createEndModule(contract: RegistryEntry): DeployScriptModule { + const tag = requireComponentTag(contract) + + const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.ALL)) return + requireUpgradeExecuted(env, contract.name) + env.showMessage(`\n✓ ${contract.name} ready`) + } + + func.tags = [tag] + func.dependencies = [] + func.skip = async () => shouldSkipAction(DeploymentActions.ALL) + + return func +} + +/** + * Create a status deploy script module. + * + * Syncs the component with on-chain state and shows its current status. + * Tagged with the bare component name so `--tags IssuanceAllocator` is a + * safe, read-only operation. + * + * @example Single contract (default status display): + * ```typescript + * export default createStatusModule(Contracts.horizon.PaymentsEscrow) + * ``` + * + * @example Custom status with tag (multi-contract or cross-component): + * ```typescript + * export default createStatusModule(GoalTags.GIP_0088, async (env) => { + * // custom multi-phase status display + * }) + * ``` + */ +export function createStatusModule(contract: RegistryEntry): DeployScriptModule +export function createStatusModule(tag: string, execute: (env: Environment) => Promise): DeployScriptModule +export function createStatusModule( + contractOrTag: RegistryEntry | string, + execute?: (env: Environment) => Promise, +): DeployScriptModule { + const tag = typeof contractOrTag === 'string' ? contractOrTag : requireComponentTag(contractOrTag) + + const func: DeployScriptModule = async (env) => { + if (noTagsRequested()) return + if (execute) { + await execute(env) + } else { + await showDetailedComponentStatus(env, contractOrTag as RegistryEntry) + } + } + + func.tags = [tag] + func.dependencies = [] + func.skip = async () => noTagsRequested() + + return func +} + +// ============================================================================ +// Action Factories (custom logic with standard framework plumbing) +// ============================================================================ + +/** + * Create a deploy script module for a custom action. + * + * Two forms: + * + * **Contract-based** (component lifecycle steps): + * Uses action verb gating (`shouldSkipAction`) and post-action sync. + * Requires both component tag AND action verb in `--tags`. + * + * **Tag-based** (goal scripts, standalone actions): + * Uses tag gating (`noTagsRequested`). The tag in `--tags` is sufficient. + * No post-action sync — the execute callback handles everything. + * + * @example Contract-based configure: + * ```typescript + * export default createActionModule( + * Contracts.horizon.RecurringCollector, + * DeploymentActions.CONFIGURE, + * async (env) => { ... }, + * ) + * ``` + * + * @example Tag-based goal action: + * ```typescript + * export default createActionModule( + * GoalTags.GIP_0088_ISSUANCE_CONNECT, + * async (env) => { ... }, + * { dependencies: [ComponentTags.ISSUANCE_ALLOCATOR] }, + * ) + * ``` + */ +export function createActionModule( + contract: RegistryEntry, + action: (typeof DeploymentActions)[keyof typeof DeploymentActions], + execute: (env: Environment) => Promise, + options?: { extraDependencies?: string[]; prerequisites?: RegistryEntry[] }, +): DeployScriptModule +export function createActionModule( + tag: string, + execute: (env: Environment) => Promise, + options?: { dependencies?: string[] }, +): DeployScriptModule +export function createActionModule( + contractOrTag: RegistryEntry | string, + actionOrExecute: (typeof DeploymentActions)[keyof typeof DeploymentActions] | ((env: Environment) => Promise), + executeOrOptions?: ((env: Environment) => Promise) | { dependencies?: string[] }, + maybeOptions?: { extraDependencies?: string[]; prerequisites?: RegistryEntry[] }, +): DeployScriptModule { + if (typeof contractOrTag === 'string') { + // Tag-based: (tag, execute, options?) + const tag = contractOrTag + const execute = actionOrExecute as (env: Environment) => Promise + const options = executeOrOptions as { dependencies?: string[] } | undefined + + const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(tag)) return + await execute(env) + } + + func.tags = [tag] + func.dependencies = options?.dependencies ?? [] + func.skip = async () => shouldSkipAction(tag) + + return func + } + + // Contract-based: (contract, action, execute, options?) + const tag = requireComponentTag(contractOrTag) + const action = actionOrExecute as string + const execute = executeOrOptions as (env: Environment) => Promise + + const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(action)) return + await syncComponentsFromRegistry(env, [contractOrTag, ...(maybeOptions?.prerequisites ?? [])]) + await execute(env) + await syncComponentFromRegistry(env, contractOrTag) + } + + func.tags = [tag] + func.dependencies = maybeOptions?.extraDependencies ?? [] + func.skip = async () => shouldSkipAction(action) + + return func +} + +// ============================================================================ +// Deploy Factories +// ============================================================================ + +/** + * Options shared by deploy factories + */ +interface DeployModuleOptions { + /** Additional tags beyond the derived deploy action tag */ + extraTags?: string[] + /** Additional rocketh dependency tags */ + extraDependencies?: string[] + /** + * Additional registry entries to sync immediately before the action runs. + * Use for contracts read via `env.getOrNull(...)` inside `resolveArgs` / + * `resolveConstructorArgs` (e.g. Controller, shared implementations). + */ + prerequisites?: RegistryEntry[] +} + +/** + * Create a deploy module for prerequisite contracts (existing proxy, new implementation). + * + * Uses `deployImplementation` + `getImplementationConfig` to deploy a new implementation + * and store it as pendingImplementation for governance upgrade. + * + * @param contract - Registry entry (must have prerequisite: true, artifact, proxyType) + * @param resolveConstructorArgs - Optional callback to resolve constructor args from env. + * Called with the deployment environment. Return the args array. + * Omit for contracts with no constructor args (e.g., RewardsManager). + * + * @example No constructor args: + * ```typescript + * export default createImplementationDeployModule(Contracts.horizon.RewardsManager) + * ``` + * + * @example With synced dependency args: + * ```typescript + * export default createImplementationDeployModule( + * Contracts['subgraph-service'].DisputeManager, + * (env) => { + * const controller = env.getOrNull('Controller') + * if (!controller) throw new Error('Missing Controller') + * return [controller.address] + * }, + * ) + * ``` + */ +export function createImplementationDeployModule( + contract: RegistryEntry, + resolveConstructorArgs?: (env: Environment) => Promise | unknown[], + options?: DeployModuleOptions, +): DeployScriptModule { + const tag = requireComponentTag(contract) + + const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + await syncComponentsFromRegistry(env, [contract, ...(options?.prerequisites ?? [])]) + const constructorArgs = resolveConstructorArgs ? await resolveConstructorArgs(env) : undefined + await deployImplementation( + env, + getImplementationConfig(contract.addressBook, contract.name, constructorArgs ? { constructorArgs } : undefined), + ) + await syncComponentFromRegistry(env, contract) + } + + func.tags = [tag, ...(options?.extraTags ?? [])] + func.dependencies = options?.extraDependencies ?? [] + func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) + + return func +} + +/** + * Create a deploy module for new contracts (fresh proxy + implementation). + * + * Uses `deployProxyContract` to deploy an OZ v5 TransparentUpgradeableProxy with + * atomic initialization. On subsequent runs, deploys new implementation and stores + * as pendingImplementation. + * + * @param contract - Registry entry (must have deployable: true, artifact, proxyType) + * @param resolveArgs - Optional callback to resolve constructor and initialize args. + * Omit initializeArgs to use default [governor]. + * + * @example With graphToken constructor and deployer init: + * ```typescript + * export default createProxyDeployModule( + * Contracts.issuance.RewardsEligibilityOracleA, + * (env) => ({ + * constructorArgs: [requireGraphToken(env).address], + * initializeArgs: [requireDeployer(env)], + * }), + * ) + * ``` + * + * @example With default initialize args [governor]: + * ```typescript + * export default createProxyDeployModule( + * Contracts.issuance.RecurringAgreementManager, + * (env) => ({ + * constructorArgs: [requireGraphToken(env).address, paymentsEscrow.address], + * }), + * ) + * ``` + */ +export function createProxyDeployModule( + contract: RegistryEntry, + resolveArgs?: (env: Environment) => Promise | ProxyDeployArgs, + options?: DeployModuleOptions, +): DeployScriptModule { + const tag = requireComponentTag(contract) + + const func: DeployScriptModule = async (env) => { + if (shouldSkipAction(DeploymentActions.DEPLOY)) return + await syncComponentsFromRegistry(env, [contract, ...(options?.prerequisites ?? [])]) + const args = resolveArgs ? await resolveArgs(env) : {} + await deployProxyContract(env, { + contract, + constructorArgs: args.constructorArgs, + initializeArgs: args.initializeArgs, + }) + await syncComponentFromRegistry(env, contract) + } + + func.tags = [tag, ...(options?.extraTags ?? [])] + func.dependencies = options?.extraDependencies ?? [] + func.skip = async () => shouldSkipAction(DeploymentActions.DEPLOY) + + return func +} + +interface ProxyDeployArgs { + constructorArgs?: unknown[] + initializeArgs?: unknown[] +} diff --git a/packages/deployment/lib/status-detail.ts b/packages/deployment/lib/status-detail.ts new file mode 100644 index 000000000..b460271ce --- /dev/null +++ b/packages/deployment/lib/status-detail.ts @@ -0,0 +1,1139 @@ +/** + * Status Detail - Detailed contract status with integration checks + * + * Extracted from deployment-status task so deploy scripts (10_status.ts) + * can show the same detail view. The task delegates to these functions. + */ + +import type { Environment } from '@rocketh/core/types' +import type { PublicClient } from 'viem' + +import { + ACCESS_CONTROL_ENUMERABLE_ABI, + CONTROLLER_ABI, + IISSUANCE_TARGET_INTERFACE_ID, + IREWARDS_MANAGER_INTERFACE_ID, + ISSUANCE_ALLOCATOR_ABI, + ISSUANCE_TARGET_ABI, + PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + REWARDS_ELIGIBILITY_ORACLE_ABI, + REWARDS_MANAGER_ABI, +} from './abis.js' +import type { AddressBookOps } from './address-book-ops.js' +import { getTargetChainIdFromEnv } from './address-book-utils.js' +import { + checkIssuanceAllocatorActivation, + checkOperatorRole, + formatAddress, + supportsInterface, +} from './contract-checks.js' +import type { RegistryEntry } from './contract-registry.js' +import { getResolvedSettings } from './deployment-config.js' +import { countPendingGovernanceTxs } from './execute-governance.js' +import { formatGRT } from './format.js' +import { getContractStatusLine, type ContractStatusResult, type ProxyAdminOwnershipContext } from './sync-utils.js' +import { graph } from '../rocketh/deploy.js' + +// ============================================================================ +// Integration Check Types & Helpers +// ============================================================================ + +/** Integration check result */ +export interface IntegrationCheck { + ok: boolean | null // null = not applicable / not deployed + label: string +} + +function formatCheck(check: IntegrationCheck): string { + const icon = check.ok === null ? '○' : check.ok ? '✓' : '✗' + return ` ${icon} ${check.label}` +} + +function formatWarnings(warnings: string[] | undefined): string[] { + if (!warnings) return [] + return warnings.map((w) => ` ⚠ ${w}`) +} + +/** Format proxy admin detail lines */ +function formatProxyAdminDetail(result: ContractStatusResult): string[] { + if (!result.proxyAdminAddress) return [] + const lines: string[] = [] + const ownerIcon = result.proxyAdminOwner === 'governor' ? '✓' : result.proxyAdminOwner === 'unknown' ? '○' : '⚠' + const ownerRole = + result.proxyAdminOwner === 'governor' + ? 'governor' + : result.proxyAdminOwner === 'deployer' + ? 'deployer' + : result.proxyAdminOwner === 'other' + ? 'not governor' + : 'unknown' + const ownerAddr = result.proxyAdminOwnerAddress ? ` ${result.proxyAdminOwnerAddress}` : '' + lines.push(` ProxyAdmin: ${result.proxyAdminAddress}`) + lines.push(` ${ownerIcon} ProxyAdmin owner:${ownerAddr} (${ownerRole})`) + return lines +} + +// ============================================================================ +// Ownership Context Resolution +// ============================================================================ + +/** + * Resolve governor/deployer context for proxy admin ownership checks + */ +export async function resolveOwnershipContext( + client: PublicClient, + env: Environment, + chainId: number, +): Promise { + const horizonAddressBook = graph.getHorizonAddressBook(chainId) + try { + const controllerAddress = horizonAddressBook.entryExists('Controller') + ? horizonAddressBook.getEntry('Controller')?.address + : null + if (!controllerAddress) return undefined + + const governor = (await client.readContract({ + address: controllerAddress as `0x${string}`, + abi: CONTROLLER_ABI, + functionName: 'getGovernor', + })) as string + + if (!governor) return undefined + + // Deployer is best-effort: available when provider has accounts (fork/local) + let deployer: string | undefined + try { + const accounts = (await env.network.provider.request({ method: 'eth_accounts' })) as string[] | undefined + if (accounts && accounts.length > 0) { + deployer = accounts[0] + } + } catch { + // No accounts available (read-only provider) + } + + return { governor, deployer } + } catch { + return undefined + } +} + +// ============================================================================ +// Integration Check Functions +// ============================================================================ + +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + +export async function getRewardsManagerChecks( + client: PublicClient, + horizonBook: AddressBookOps, + chainId: number, + issuanceBook?: AddressBookOps, + ssBook?: AddressBookOps, +): Promise { + const checks: IntegrationCheck[] = [] + const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null + + if (!rmAddress) return checks + + // Interface support + const supportsRewardsManager = await supportsInterface(client, rmAddress, IREWARDS_MANAGER_INTERFACE_ID) + checks.push({ ok: supportsRewardsManager, label: `implements IRewardsManager (${IREWARDS_MANAGER_INTERFACE_ID})` }) + + const supportsIssuanceTarget = await supportsInterface(client, rmAddress, IISSUANCE_TARGET_INTERFACE_ID) + checks.push({ ok: supportsIssuanceTarget, label: `implements IIssuanceTarget (${IISSUANCE_TARGET_INTERFACE_ID})` }) + + if (!supportsRewardsManager) return checks + + // Helper: read a contract value, returning null on failure + async function rmRead(functionName: string, abi: readonly unknown[] = REWARDS_MANAGER_ABI): Promise { + try { + return (await client.readContract({ + address: rmAddress as `0x${string}`, + abi, + functionName, + })) as T + } catch { + return null + } + } + + // Issuance rates + const rawRate = await rmRead('getRawIssuancePerBlock') + const allocatedRate = await rmRead('getAllocatedIssuancePerBlock') + if (rawRate !== null) { + checks.push({ ok: rawRate > 0n, label: `issuancePerBlock: ${formatGRT(rawRate)} (raw)` }) + } + if (allocatedRate !== null) { + checks.push({ + ok: allocatedRate > 0n, + label: `issuancePerBlock: ${formatGRT(allocatedRate)} (after IA allocation)`, + }) + } + + // SubgraphService + const ss = await rmRead('subgraphService') + if (ss !== null) { + const expected = ssBook?.entryExists('SubgraphService') + ? (ssBook.getEntry('SubgraphService')?.address ?? null) + : null + const matches = expected ? ss.toLowerCase() === expected.toLowerCase() : null + checks.push({ + ok: ss !== ZERO_ADDRESS ? matches : false, + label: `subgraphService: ${ss}${matches === false && expected ? ` (expected ${expected})` : ''}`, + }) + } + + // IssuanceAllocator + const ia = await rmRead('getIssuanceAllocator', ISSUANCE_TARGET_ABI) + if (ia !== null) { + const iaBook = issuanceBook?.entryExists('IssuanceAllocator') + ? issuanceBook.getEntry('IssuanceAllocator')?.address + : null + const isSet = ia !== ZERO_ADDRESS + const matches = iaBook ? ia.toLowerCase() === iaBook.toLowerCase() : null + checks.push({ + ok: isSet ? matches : null, + label: isSet + ? `issuanceAllocator: ${ia}${matches === false ? ` (expected ${iaBook!})` : ''}` + : 'issuanceAllocator: not set', + }) + } + + // Provider eligibility oracle + const reo = await rmRead('getProviderEligibilityOracle', PROVIDER_ELIGIBILITY_MANAGEMENT_ABI) + if (reo !== null) { + const reoA = issuanceBook?.entryExists('RewardsEligibilityOracleA') + ? issuanceBook.getEntry('RewardsEligibilityOracleA')?.address + : null + const isSet = reo !== ZERO_ADDRESS + const matchesA = reoA ? reo.toLowerCase() === reoA.toLowerCase() : null + checks.push({ + ok: isSet ? matchesA : null, + label: isSet + ? `providerEligibilityOracle: ${reo}${matchesA === false ? ' (not REO-A)' : matchesA ? ' (REO-A)' : ''}` + : 'providerEligibilityOracle: not set', + }) + } else { + checks.push({ ok: null, label: 'providerEligibilityOracle: not set' }) + } + + // Revert on ineligible — compare against resolved settings + const revertOnIneligible = await rmRead('getRevertOnIneligible') + if (revertOnIneligible !== null) { + const desired = getResolvedSettings(chainId).rewardsManager.revertOnIneligible + const matches = revertOnIneligible === desired + checks.push({ + ok: matches, + label: `revertOnIneligible: ${revertOnIneligible}${matches ? '' : ` (expected ${desired})`}`, + }) + } + + // Default reclaim address + const defaultReclaim = await rmRead('getDefaultReclaimAddress') + if (defaultReclaim !== null) { + const expectedAddr = issuanceBook?.entryExists('ReclaimedRewards') + ? issuanceBook.getEntry('ReclaimedRewards')?.address + : null + const isSet = defaultReclaim !== ZERO_ADDRESS + const matches = isSet && expectedAddr ? defaultReclaim.toLowerCase() === expectedAddr.toLowerCase() : null + checks.push({ + ok: isSet ? (matches ?? true) : null, + label: isSet + ? `defaultReclaimAddress: ${defaultReclaim}${matches === false ? ` (expected ${expectedAddr!})` : ''}` + : 'defaultReclaimAddress: not set', + }) + } + + return checks +} + +export async function getIssuanceAllocatorChecks( + client: PublicClient, + horizonBook: AddressBookOps, + issuanceBook: AddressBookOps, +): Promise { + const checks: IntegrationCheck[] = [] + + const iaAddress = issuanceBook.entryExists('IssuanceAllocator') + ? issuanceBook.getEntry('IssuanceAllocator')?.address + : null + const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null + const gtAddress = horizonBook.entryExists('L2GraphToken') ? horizonBook.getEntry('L2GraphToken')?.address : null + + if (!iaAddress || !rmAddress || !gtAddress) return checks + + const rmSupportsTarget = await supportsInterface(client, rmAddress, IISSUANCE_TARGET_INTERFACE_ID) + checks.push({ ok: rmSupportsTarget, label: `RM implements IIssuanceTarget (${IISSUANCE_TARGET_INTERFACE_ID})` }) + + if (rmSupportsTarget) { + const activation = await checkIssuanceAllocatorActivation(client, iaAddress, rmAddress, gtAddress) + checks.push({ ok: activation.iaIntegrated, label: 'RM.issuanceAllocator == this' }) + checks.push({ ok: activation.iaMinter, label: 'GraphToken.MINTER_ROLE granted' }) + } else { + checks.push({ ok: null, label: 'RM.issuanceAllocator == this (RM not upgraded)' }) + checks.push({ ok: null, label: 'GraphToken.MINTER_ROLE granted (RM not upgraded)' }) + } + + try { + const targetCount = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getTargetCount', + })) as bigint + const hasDefaultTarget = targetCount > 0n + checks.push({ ok: hasDefaultTarget, label: 'defaultTarget configured' }) + } catch { + // Function not available + } + + // Confirm 100% allocation: getTotalAllocation().totalAllocationRate == issuancePerBlock. + // Once a real defaultTarget is set (issuance-connect), the contract reports + // exactly issuancePerBlock; if it doesn't, the default is still address(0) + // and some issuance is unallocated (not minted). Skipped (○) when + // issuancePerBlock is 0 — the IA hasn't been configured with a rate yet, + // so the question is not yet meaningful. + try { + const issuancePerBlock = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getIssuancePerBlock', + })) as bigint + const totalAllocation = (await client.readContract({ + address: iaAddress as `0x${string}`, + abi: ISSUANCE_ALLOCATOR_ABI, + functionName: 'getTotalAllocation', + })) as { totalAllocationRate: bigint; allocatorMintingRate: bigint; selfMintingRate: bigint } + if (issuancePerBlock === 0n) { + checks.push({ ok: null, label: '100% allocated (issuancePerBlock not set)' }) + } else { + const fullyAllocated = totalAllocation.totalAllocationRate === issuancePerBlock + checks.push({ + ok: fullyAllocated, + label: `100% allocated (${formatGRT(totalAllocation.totalAllocationRate)} of ${formatGRT(issuancePerBlock)})`, + }) + } + } catch { + // Function not available + } + + return checks +} + +export async function getRewardsEligibilityOracleChecks( + client: PublicClient, + horizonBook: AddressBookOps, + issuanceBook: AddressBookOps, + entryName: string, +): Promise { + const checks: IntegrationCheck[] = [] + + const reoAddress = issuanceBook.entryExists(entryName) ? issuanceBook.getEntry(entryName)?.address : null + const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null + const controllerAddress = horizonBook.entryExists('Controller') ? horizonBook.getEntry('Controller')?.address : null + + if (!reoAddress || !rmAddress) return checks + + let governor: string | null = null + let pauseGuardian: string | null = null + if (controllerAddress) { + try { + governor = (await client.readContract({ + address: controllerAddress as `0x${string}`, + abi: [ + { + inputs: [], + name: 'getGovernor', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'getGovernor', + })) as string + } catch { + // Controller doesn't have getGovernor + } + try { + pauseGuardian = (await client.readContract({ + address: controllerAddress as `0x${string}`, + abi: [ + { + inputs: [], + name: 'pauseGuardian', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'pauseGuardian', + })) as string + } catch { + // Controller doesn't have pauseGuardian + } + } + + try { + const governorRole = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'GOVERNOR_ROLE', + })) as `0x${string}` + + if (governor) { + const governorHasRole = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'hasRole', + args: [governorRole, governor as `0x${string}`], + })) as boolean + checks.push({ ok: governorHasRole, label: 'governor has GOVERNOR_ROLE' }) + } + } catch { + // Role check not available + } + + try { + const pauseRole = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'PAUSE_ROLE', + })) as `0x${string}` + + if (pauseGuardian) { + const pauseGuardianHasRole = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'hasRole', + args: [pauseRole, pauseGuardian as `0x${string}`], + })) as boolean + checks.push({ ok: pauseGuardianHasRole, label: 'pause guardian has PAUSE_ROLE' }) + } + } catch { + // Role check not available + } + + const networkOperator = issuanceBook.entryExists('NetworkOperator') + ? (issuanceBook.getEntry('NetworkOperator')?.address ?? null) + : null + + try { + const operatorCheck = await checkOperatorRole(client, reoAddress, networkOperator) + const statusOk = networkOperator === null ? false : operatorCheck.ok + checks.push({ ok: statusOk, label: operatorCheck.message }) + } catch { + checks.push({ ok: null, label: 'OPERATOR_ROLE (check failed)' }) + } + + try { + const currentREO = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + functionName: 'getProviderEligibilityOracle', + })) as string + const configured = currentREO.toLowerCase() === reoAddress.toLowerCase() + checks.push({ ok: configured, label: 'RM.providerEligibilityOracle == this' }) + } catch { + // Function not available on old RM + } + + try { + const enabled = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getEligibilityValidation', + })) as boolean + checks.push({ ok: enabled, label: 'eligibility validation enabled' }) + } catch { + // Function not available + } + + try { + const lastUpdate = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getLastOracleUpdateTime', + })) as bigint + const hasUpdates = lastUpdate > 0n + checks.push({ ok: hasUpdates, label: 'oracle has processed updates' }) + } catch { + // Function not available + } + + return checks +} + +export async function getReclaimAddressChecks( + client: PublicClient, + horizonBook: AddressBookOps, + issuanceBook: AddressBookOps, +): Promise { + const checks: IntegrationCheck[] = [] + + const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null + const reclaimAddress = issuanceBook.entryExists('ReclaimedRewards') + ? issuanceBook.getEntry('ReclaimedRewards')?.address + : null + + if (!rmAddress || !reclaimAddress) return checks + + try { + const defaultReclaim = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: REWARDS_MANAGER_ABI, + functionName: 'getDefaultReclaimAddress', + })) as string + const configured = defaultReclaim.toLowerCase() === reclaimAddress.toLowerCase() + checks.push({ ok: configured, label: 'configured as RM.defaultReclaimAddress' }) + } catch { + checks.push({ ok: false, label: 'configured as RM.defaultReclaimAddress' }) + } + + return checks +} + +// Minimal ABI for RecurringAgreementManager-specific view functions +const RECURRING_AGREEMENT_MANAGER_ABI = [ + { + inputs: [], + name: 'COLLECTOR_ROLE', + outputs: [{ type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'DATA_SERVICE_ROLE', + outputs: [{ type: 'bytes32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getCollectorCount', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'paused', + outputs: [{ type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +export async function getRecurringAgreementManagerChecks( + client: PublicClient, + horizonBook: AddressBookOps, + issuanceBook: AddressBookOps, + ssBook: AddressBookOps, +): Promise { + const checks: IntegrationCheck[] = [] + + const ramAddress = issuanceBook.entryExists('RecurringAgreementManager') + ? issuanceBook.getEntry('RecurringAgreementManager')?.address + : null + if (!ramAddress) return checks + + // COLLECTOR_ROLE → RecurringCollector + const rcAddress = horizonBook.entryExists('RecurringCollector') + ? horizonBook.getEntry('RecurringCollector')?.address + : null + if (rcAddress) { + try { + const collectorRole = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: RECURRING_AGREEMENT_MANAGER_ABI, + functionName: 'COLLECTOR_ROLE', + })) as `0x${string}` + const hasRole = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [collectorRole, rcAddress as `0x${string}`], + })) as boolean + checks.push({ ok: hasRole, label: 'RecurringCollector has COLLECTOR_ROLE' }) + } catch { + // Role check not available + } + } + + // DATA_SERVICE_ROLE → SubgraphService + const ssAddress = ssBook?.entryExists('SubgraphService') ? ssBook.getEntry('SubgraphService')?.address : null + if (ssAddress) { + try { + const dataServiceRole = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: RECURRING_AGREEMENT_MANAGER_ABI, + functionName: 'DATA_SERVICE_ROLE', + })) as `0x${string}` + const hasRole = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: ACCESS_CONTROL_ENUMERABLE_ABI, + functionName: 'hasRole', + args: [dataServiceRole, ssAddress as `0x${string}`], + })) as boolean + checks.push({ ok: hasRole, label: 'SubgraphService has DATA_SERVICE_ROLE' }) + } catch { + // Role check not available + } + } + + // IssuanceAllocator + const iaAddress = issuanceBook.entryExists('IssuanceAllocator') + ? issuanceBook.getEntry('IssuanceAllocator')?.address + : null + try { + const currentIA = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: ISSUANCE_TARGET_ABI, + functionName: 'getIssuanceAllocator', + })) as string + const isSet = currentIA !== ZERO_ADDRESS + const matches = iaAddress ? currentIA.toLowerCase() === iaAddress.toLowerCase() : null + checks.push({ + ok: isSet ? matches : false, + label: isSet + ? `issuanceAllocator: ${formatAddress(currentIA)}${matches === false ? ` (expected ${formatAddress(iaAddress!)})` : ''}` + : 'issuanceAllocator: not set', + }) + } catch { + // Function not available + } + + // Provider eligibility oracle + try { + const reo = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + functionName: 'getProviderEligibilityOracle', + })) as string + const reoA = issuanceBook.entryExists('RewardsEligibilityOracleA') + ? issuanceBook.getEntry('RewardsEligibilityOracleA')?.address + : null + const isSet = reo !== ZERO_ADDRESS + const matchesA = reoA ? reo.toLowerCase() === reoA.toLowerCase() : null + checks.push({ + ok: isSet ? matchesA : null, + label: isSet + ? `providerEligibilityOracle: ${reo}${matchesA === false ? ' (not REO-A)' : matchesA ? ' (REO-A)' : ''}` + : 'providerEligibilityOracle: not set', + }) + } catch { + // Function not available + } + + // Paused state + try { + const paused = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: RECURRING_AGREEMENT_MANAGER_ABI, + functionName: 'paused', + })) as boolean + checks.push({ ok: !paused, label: paused ? 'PAUSED' : 'not paused' }) + } catch { + // Function not available + } + + // Collector count + try { + const count = (await client.readContract({ + address: ramAddress as `0x${string}`, + abi: RECURRING_AGREEMENT_MANAGER_ABI, + functionName: 'getCollectorCount', + })) as bigint + checks.push({ ok: null, label: `collectors: ${count}` }) + } catch { + // Function not available + } + + return checks +} + +// ============================================================================ +// Horizon / SubgraphService Contract Checks +// ============================================================================ + +// Minimal ABIs for contracts not in the abis.ts module +const PAUSABLE_ABI = [ + { inputs: [], name: 'paused', outputs: [{ type: 'bool' }], stateMutability: 'view', type: 'function' }, +] as const + +const PAUSE_GUARDIAN_ABI = [ + { + inputs: [{ name: '_pauseGuardian', type: 'address' }], + name: 'pauseGuardians', + outputs: [{ type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +const DISPUTE_MANAGER_ABI = [ + { inputs: [], name: 'arbitrator', outputs: [{ type: 'address' }], stateMutability: 'view', type: 'function' }, + { inputs: [], name: 'getDisputePeriod', outputs: [{ type: 'uint64' }], stateMutability: 'view', type: 'function' }, + { inputs: [], name: 'disputeDeposit', outputs: [{ type: 'uint256' }], stateMutability: 'view', type: 'function' }, + { + inputs: [], + name: 'getFishermanRewardCut', + outputs: [{ type: 'uint32' }], + stateMutability: 'view', + type: 'function', + }, + { inputs: [], name: 'maxSlashingCut', outputs: [{ type: 'uint32' }], stateMutability: 'view', type: 'function' }, + { inputs: [], name: 'subgraphService', outputs: [{ type: 'address' }], stateMutability: 'view', type: 'function' }, +] as const + +const SUBGRAPH_SERVICE_ABI = [ + { + inputs: [], + name: 'getProvisionTokensRange', + outputs: [{ type: 'uint256' }, { type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getDelegationRatio', + outputs: [{ type: 'uint32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'stakeToFeesRatio', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'curationFeesCut', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getDisputeManager', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getGraphTallyCollector', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { inputs: [], name: 'getCuration', outputs: [{ type: 'address' }], stateMutability: 'view', type: 'function' }, +] as const + +/** PPM denominator (1,000,000) for percentage display */ +const PPM = 1_000_000 + +export async function getRecurringCollectorChecks( + client: PublicClient, + address: string, + horizonBook: AddressBookOps, +): Promise { + const checks: IntegrationCheck[] = [] + + // Pause guardian + try { + const controllerAddress = horizonBook.entryExists('Controller') ? horizonBook.getEntry('Controller')?.address : null + if (controllerAddress) { + // pauseGuardian is a public storage variable auto-getter, not in IControllerToolshed + const pauseGuardian = (await client.readContract({ + address: controllerAddress as `0x${string}`, + abi: [ + { + inputs: [], + name: 'pauseGuardian', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + ] as const, + functionName: 'pauseGuardian', + })) as string + const isGuardian = (await client.readContract({ + address: address as `0x${string}`, + abi: PAUSE_GUARDIAN_ABI, + functionName: 'pauseGuardians', + args: [pauseGuardian as `0x${string}`], + })) as boolean + checks.push({ ok: isGuardian, label: `pauseGuardian: ${pauseGuardian} ${isGuardian ? '' : '(not set)'}` }) + } + } catch { + // Not available + } + + // Paused state + try { + const paused = (await client.readContract({ + address: address as `0x${string}`, + abi: PAUSABLE_ABI, + functionName: 'paused', + })) as boolean + checks.push({ ok: !paused, label: paused ? 'PAUSED' : 'not paused' }) + } catch { + // paused() not available + } + + // Thawing period + try { + const thawing = (await client.readContract({ + address: address as `0x${string}`, + abi: [ + { + inputs: [], + name: 'REVOKE_AUTHORIZATION_THAWING_PERIOD', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'REVOKE_AUTHORIZATION_THAWING_PERIOD', + })) as bigint + checks.push({ ok: null, label: `REVOKE_AUTHORIZATION_THAWING_PERIOD: ${thawing}` }) + } catch { + // Not available + } + + return checks +} + +export async function getDisputeManagerChecks( + client: PublicClient, + address: string, + horizonBook: AddressBookOps, + ssBook: AddressBookOps, +): Promise { + const checks: IntegrationCheck[] = [] + + async function dmRead(functionName: (typeof DISPUTE_MANAGER_ABI)[number]['name']): Promise { + try { + return (await client.readContract({ + address: address as `0x${string}`, + abi: DISPUTE_MANAGER_ABI, + functionName, + })) as T + } catch { + return null + } + } + + // Arbitrator + const arbitrator = await dmRead('arbitrator') + if (arbitrator !== null) { + checks.push({ ok: arbitrator !== ZERO_ADDRESS, label: `arbitrator: ${arbitrator}` }) + } + + // SubgraphService reference + const ss = await dmRead('subgraphService') + if (ss !== null) { + const expected = ssBook?.entryExists('SubgraphService') + ? (ssBook.getEntry('SubgraphService')?.address ?? null) + : null + const matches = expected ? ss.toLowerCase() === expected.toLowerCase() : null + checks.push({ + ok: ss !== ZERO_ADDRESS ? matches : false, + label: `subgraphService: ${ss}${matches === false && expected ? ` (expected ${expected})` : ''}`, + }) + } + + // Dispute period + const disputePeriod = await dmRead('getDisputePeriod') + if (disputePeriod !== null) { + checks.push({ ok: disputePeriod > 0n, label: `disputePeriod: ${disputePeriod}s` }) + } + + // Dispute deposit + const disputeDeposit = await dmRead('disputeDeposit') + if (disputeDeposit !== null) { + checks.push({ ok: disputeDeposit > 0n, label: `disputeDeposit: ${formatGRT(disputeDeposit)}` }) + } + + // Fisherman reward cut (PPM) + const fishermanCut = await dmRead('getFishermanRewardCut') + if (fishermanCut !== null) { + checks.push({ + ok: null, + label: `fishermanRewardCut: ${fishermanCut} (${((fishermanCut / PPM) * 100).toFixed(2)}%)`, + }) + } + + // Max slashing cut (PPM) + const maxSlashing = await dmRead('maxSlashingCut') + if (maxSlashing !== null) { + checks.push({ ok: null, label: `maxSlashingCut: ${maxSlashing} (${((maxSlashing / PPM) * 100).toFixed(2)}%)` }) + } + + return checks +} + +export async function getSubgraphServiceChecks( + client: PublicClient, + address: string, + horizonBook: AddressBookOps, + ssBook: AddressBookOps, +): Promise { + const checks: IntegrationCheck[] = [] + + async function ssRead(functionName: (typeof SUBGRAPH_SERVICE_ABI)[number]['name']): Promise { + try { + return (await client.readContract({ + address: address as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName, + })) as T + } catch { + return null + } + } + + // DisputeManager reference + const dm = await ssRead('getDisputeManager') + if (dm !== null) { + const expected = ssBook?.entryExists('DisputeManager') ? (ssBook.getEntry('DisputeManager')?.address ?? null) : null + const matches = expected ? dm.toLowerCase() === expected.toLowerCase() : null + checks.push({ + ok: dm !== ZERO_ADDRESS ? matches : false, + label: `disputeManager: ${dm}${matches === false && expected ? ` (expected ${expected})` : ''}`, + }) + } + + // GraphTallyCollector reference + const gtc = await ssRead('getGraphTallyCollector') + if (gtc !== null) { + const expected = horizonBook.entryExists('GraphTallyCollector') + ? (horizonBook.getEntry('GraphTallyCollector')?.address ?? null) + : null + const matches = expected ? gtc.toLowerCase() === expected.toLowerCase() : null + checks.push({ + ok: gtc !== ZERO_ADDRESS ? matches : false, + label: `graphTallyCollector: ${gtc}${matches === false && expected ? ` (expected ${expected})` : ''}`, + }) + } + + // Curation reference + const curation = await ssRead('getCuration') + if (curation !== null) { + const expected = horizonBook.entryExists('L2Curation') + ? (horizonBook.getEntry('L2Curation')?.address ?? null) + : null + const matches = expected ? curation.toLowerCase() === expected.toLowerCase() : null + checks.push({ + ok: curation !== ZERO_ADDRESS ? matches : false, + label: `curation: ${curation}${matches === false && expected ? ` (expected ${expected})` : ''}`, + }) + } + + // Provision tokens range + const provisionRange = await ssRead('getProvisionTokensRange') + if (provisionRange !== null) { + checks.push({ + ok: null, + label: `provisionTokensRange: [${formatGRT(provisionRange[0])}, ${formatGRT(provisionRange[1])}]`, + }) + } + + // Delegation ratio + const delegationRatio = await ssRead('getDelegationRatio') + if (delegationRatio !== null) { + checks.push({ ok: null, label: `delegationRatio: ${delegationRatio}` }) + } + + // Stake to fees ratio + const stakeToFees = await ssRead('stakeToFeesRatio') + if (stakeToFees !== null) { + checks.push({ ok: null, label: `stakeToFeesRatio: ${stakeToFees}` }) + } + + // Curation fees cut (PPM) + const curationCut = await ssRead('curationFeesCut') + if (curationCut !== null) { + checks.push({ + ok: null, + label: `curationFeesCut: ${curationCut} (${((Number(curationCut) / PPM) * 100).toFixed(2)}%)`, + }) + } + + return checks +} + +// ============================================================================ +// High-Level Status Display +// ============================================================================ + +/** + * Show detailed status for a single component from the registry. + * + * Displays: status line + proxy admin detail + contract-specific integration checks. + * This is the detail view shown when running `--tags IssuanceAllocator`. + */ +export async function showDetailedComponentStatus( + env: Environment, + contract: RegistryEntry, + options?: { showHints?: boolean }, +): Promise { + const chainId = await getTargetChainIdFromEnv(env) + const client = graph.getPublicClient(env) as PublicClient + + // Resolve address books + const horizonBook = graph.getHorizonAddressBook(chainId) + const addressBook = + contract.addressBook === 'horizon' + ? horizonBook + : contract.addressBook === 'subgraph-service' + ? graph.getSubgraphServiceAddressBook(chainId) + : graph.getIssuanceAddressBook(chainId) + + // Resolve ownership context + const ownershipCtx = await resolveOwnershipContext(client, env, chainId) + + // Get status line with detail + const result = await getContractStatusLine( + client, + contract.addressBook, + addressBook, + contract.name, + undefined, + ownershipCtx, + ) + env.showMessage(` ${result.line}`) + for (const line of formatWarnings(result.warnings)) { + env.showMessage(line) + } + // Show ProxyAdmin detail for OZ v5 transparent proxies (not old Graph proxies, + // which are controller-governed and don't expose owner()) + if (contract.proxyType !== 'graph') { + for (const line of formatProxyAdminDetail(result)) { + env.showMessage(line) + } + } + + // Verification status from address book + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (result.exists && (addressBook as any).entryExists(contract.name)) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const entry = (addressBook as any).getEntry(contract.name) + if (entry.proxy) { + const proxyVerified = entry.proxyDeployment?.verified + const implVerified = entry.implementationDeployment?.verified + env.showMessage(` ${proxyVerified ? '✓' : '✗'} proxy verified${proxyVerified ? `: ${proxyVerified}` : ''}`) + env.showMessage(` ${implVerified ? '✓' : '✗'} impl verified${implVerified ? `: ${implVerified}` : ''}`) + } else { + const verified = entry.deployment?.verified + env.showMessage(` ${verified ? '✓' : '✗'} verified${verified ? `: ${verified}` : ''}`) + } + } + + const showHints = options?.showHints !== false + + // Contract-specific integration checks + if (!result.exists) { + if (showHints && contract.componentTag && contract.deployable) { + showLifecycleHints(env, contract, result) + } + return result + } + + const issuanceBook = contract.addressBook === 'issuance' ? addressBook : graph.getIssuanceAddressBook(chainId) + + let checks: IntegrationCheck[] = [] + if (contract.name === 'RewardsManager') { + checks = await getRewardsManagerChecks( + client, + horizonBook, + chainId, + issuanceBook, + graph.getSubgraphServiceAddressBook(chainId), + ) + } else if (contract.name === 'IssuanceAllocator') { + checks = await getIssuanceAllocatorChecks(client, horizonBook, issuanceBook) + } else if ( + contract.name === 'RewardsEligibilityOracleA' || + contract.name === 'RewardsEligibilityOracleB' || + contract.name === 'RewardsEligibilityOracleMock' + ) { + checks = await getRewardsEligibilityOracleChecks(client, horizonBook, issuanceBook, contract.name) + } else if (contract.name === 'RecurringAgreementManager') { + checks = await getRecurringAgreementManagerChecks( + client, + horizonBook, + issuanceBook, + graph.getSubgraphServiceAddressBook(chainId), + ) + } else if (contract.name === 'ReclaimedRewards') { + checks = await getReclaimAddressChecks(client, horizonBook, issuanceBook) + } else if (contract.name === 'RecurringCollector') { + const addr = horizonBook.entryExists('RecurringCollector') + ? horizonBook.getEntry('RecurringCollector')?.address + : null + if (addr) checks = await getRecurringCollectorChecks(client, addr, horizonBook) + } else if (contract.name === 'DisputeManager') { + const ssBook = graph.getSubgraphServiceAddressBook(chainId) + const addr = ssBook.entryExists('DisputeManager') ? ssBook.getEntry('DisputeManager')?.address : null + if (addr) checks = await getDisputeManagerChecks(client, addr, horizonBook, ssBook) + } else if (contract.name === 'SubgraphService') { + const ssBook = graph.getSubgraphServiceAddressBook(chainId) + const addr = ssBook.entryExists('SubgraphService') ? ssBook.getEntry('SubgraphService')?.address : null + if (addr) checks = await getSubgraphServiceChecks(client, addr, horizonBook, ssBook) + } + + for (const check of checks) { + env.showMessage(formatCheck(check)) + } + + // Lifecycle action hints + if (showHints && contract.componentTag && contract.deployable) { + showLifecycleHints(env, contract, result) + } + + return result +} + +/** + * Show available lifecycle actions and state-based hint for a component. + */ +function showLifecycleHints(env: Environment, contract: RegistryEntry, result: ContractStatusResult): void { + const tag = contract.componentTag! + + // State-based hint + if (!result.exists) { + env.showMessage(`\n → Not deployed. Run with: --tags ${tag},deploy`) + } else if (result.codeChanged && !result.hasPendingImplementation) { + env.showMessage(`\n → Code changed. Run with: --tags ${tag},deploy`) + } else if (result.hasPendingImplementation) { + env.showMessage(`\n → Pending implementation. Run with: --tags ${tag},upgrade`) + } else { + env.showMessage(`\n → Up to date`) + } + + // Available actions — use explicit list if provided, otherwise derive from metadata + let actions: readonly string[] + if (contract.lifecycleActions) { + actions = contract.lifecycleActions + } else { + const derived: string[] = ['deploy'] + if (contract.proxyType) derived.push('upgrade') + actions = derived + } + env.showMessage(` Actions: --tags ${tag},<${[...actions, 'all'].join('|')}>`) +} + +/** + * Show pending governance TX count with execute command if any exist. + * Call once at the end of a status display, not per-component. + */ +export function showPendingGovernanceTxs(env: Environment): void { + const count = countPendingGovernanceTxs(env.name) + if (count > 0) { + env.showMessage(`\n ⚠ ${count} pending governance TX(s)`) + env.showMessage(` Run: npx hardhat deploy:execute-governance --network ${env.name}`) + } +} diff --git a/packages/deployment/lib/sync-utils.ts b/packages/deployment/lib/sync-utils.ts index 4680158e4..a5022a177 100644 --- a/packages/deployment/lib/sync-utils.ts +++ b/packages/deployment/lib/sync-utils.ts @@ -1,8 +1,21 @@ +import { existsSync } from 'node:fs' + import type { Artifact, Environment } from '@rocketh/core/types' import type { DeploymentMetadata } from '@graphprotocol/toolshed/deployments' import { + autoDetectForkNetwork, + getForkNetwork, + getForkStateDir, + getForkTargetChainId, + getIssuanceAddressBookPath, + getTargetChainIdFromEnv, + isForkMode, +} from './address-book-utils.js' +import { + getLibraryResolver, loadContractsArtifact, + loadHorizonBuildArtifact, loadIssuanceArtifact, loadOpenZeppelinArtifact, loadSubgraphServiceArtifact, @@ -12,9 +25,12 @@ import { type AddressBookType, type ArtifactSource, type ContractMetadata, + type RegistryEntry, getAddressBookEntryName, getContractMetadata, + getContractsByAddressBook, } from './contract-registry.js' +import { SpecialTags } from './deployment-tags.js' import { getOnChainImplementation } from './deploy-implementation.js' import { graph } from '../rocketh/deploy.js' import type { AnyAddressBookOps } from './address-book-ops.js' @@ -22,11 +38,11 @@ import type { AnyAddressBookOps } from './address-book-ops.js' /** * Format an address based on SHOW_ADDRESSES environment variable * - 0: return empty string (no addresses shown) - * - 1: return truncated address (0x1234567890...) + * - 1: return truncated address (0x1234...5678) * - 2 (default): return full address */ function formatAddress(address: string): string { - const showAddresses = process.env.SHOW_ADDRESSES ?? '1' + const showAddresses = process.env.SHOW_ADDRESSES ?? '2' if (showAddresses === '0') { return '' @@ -46,6 +62,8 @@ function loadArtifactFromSource(source: ArtifactSource): Artifact | undefined { switch (source.type) { case 'contracts': return loadContractsArtifact(source.path, source.name) + case 'horizon': + return loadHorizonBuildArtifact(source.path) case 'subgraph-service': return loadSubgraphServiceArtifact(source.name) case 'issuance': @@ -111,7 +129,12 @@ export function checkShouldSync( if (metadata?.bytecodeHash && artifact) { const loadedArtifact = loadArtifactFromSource(artifact) if (loadedArtifact?.deployedBytecode) { - const localHash = computeBytecodeHash(loadedArtifact.deployedBytecode) + const libResolver = getLibraryResolver(artifact.type) + const localHash = computeBytecodeHash( + loadedArtifact.deployedBytecode, + loadedArtifact.deployedLinkReferences, + libResolver, + ) if (metadata.bytecodeHash !== localHash) { return { shouldSync: false, @@ -170,7 +193,12 @@ export function reconstructDeploymentRecord( } if (deploymentMetadata.bytecodeHash && loadedArtifact.deployedBytecode) { - const localHash = computeBytecodeHash(loadedArtifact.deployedBytecode) + const libResolver = getLibraryResolver(artifact.type) + const localHash = computeBytecodeHash( + loadedArtifact.deployedBytecode, + loadedArtifact.deployedLinkReferences, + libResolver, + ) if (deploymentMetadata.bytecodeHash !== localHash) { // Bytecode has changed - cannot reconstruct reliably return undefined @@ -215,6 +243,89 @@ export function createDeploymentMetadata( } } +/** + * Check if local artifact bytecode differs from what was last deployed. + * + * Compares the local artifact's bytecodeHash against the stored hash in the + * address book. The stored hash is recorded from the local artifact at deploy + * time, so this is a local-to-local comparison (no on-chain bytecode fetch). + * + * @returns codeChanged flag and the computed localHash (needed for hashMatches checks) + */ +function checkCodeChanged( + artifactSource: ArtifactSource | undefined, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + addressBook: any, + contractName: string, +): { codeChanged: boolean; localHash?: string } { + if (!artifactSource) return { codeChanged: false } + + const localArtifact = loadArtifactFromSource(artifactSource) + const resolver = getLibraryResolver(artifactSource.type) + const localHash = localArtifact?.deployedBytecode + ? computeBytecodeHash(localArtifact.deployedBytecode, localArtifact.deployedLinkReferences, resolver) + : undefined + + const deploymentMetadata = addressBook.getDeploymentMetadata(contractName) + if (deploymentMetadata?.bytecodeHash && localHash) { + return { codeChanged: localHash !== deploymentMetadata.bytecodeHash, localHash } + } + if (localArtifact?.deployedBytecode) { + // No stored bytecodeHash but artifact exists - untracked/legacy state + return { codeChanged: true, localHash } + } + return { codeChanged: false, localHash } +} + +/** + * Decide whether sync should seed rocketh's record from the local artifact. + * + * Seeding writes the local artifact's bytecode into rocketh's deployment + * record. That's correct when the artifact reflects what's deployed on-chain, + * and harmful when the artifact has drifted: rocketh's native bytecode + * comparison would then match its (just-seeded) record against the artifact + * and skip the redeploy that the drift demands — the address book never + * advances, and proxies that depend on the impl miss their pendingImplementation. + * + * Gate (only contracts we ourselves deploy carry the dedup-masking risk): + * - Synthetic names not in the registry → seed (proxy sync recurses with + * `${name}_Implementation` names that aren't real entries; the proxy path + * already has its own hashMatches gate before recursing). + * - Prerequisites → seed (deployed externally; never run through deployFn). + * - No artifact → seed (no local bytecode to compare against). + * + * Within the gated set: skip the seed only on a *verified mismatch* — i.e. + * we have a stored hash and the local artifact's hash differs. If there's no + * stored hash at all (no entry, or entry without a hash), fall through to + * the legacy seed: there's nothing to mask. + */ +export function shouldSeedRocketh( + spec: ContractSpec, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + addressBook: any, +): { seed: boolean; reason: string } { + const registered = getContractMetadata(spec.addressBookType, spec.name) + if (!registered) return { seed: true, reason: 'unregistered name (legacy seed)' } + if (spec.prerequisite) return { seed: true, reason: 'prerequisite (legacy seed)' } + if (!spec.artifact) return { seed: true, reason: 'no artifact (legacy seed)' } + + if (!addressBook?.entryExists?.(spec.name)) { + return { seed: true, reason: 'no entry, nothing to mask (legacy seed)' } + } + + const storedHash = addressBook.getDeploymentMetadata?.(spec.name)?.bytecodeHash + const { codeChanged, localHash } = checkCodeChanged(spec.artifact, addressBook, spec.name) + + if (!storedHash || !localHash) return { seed: true, reason: 'no hash to compare (legacy seed)' } + if (codeChanged) return { seed: false, reason: 'artifact unverified vs. address book' } + return { seed: true, reason: 'artifact verified' } +} + +/** + * Proxy admin ownership state + */ +export type ProxyAdminOwner = 'governor' | 'deployer' | 'other' | 'unknown' + /** * Input for proxy status line generation */ @@ -233,6 +344,8 @@ interface ProxyStatusInput { syncNotes?: string[] /** Whether local bytecode differs from deployed (shows △ icon) */ codeChanged?: boolean + /** ProxyAdmin ownership state — 'deployer' shows 🔑 warning icon */ + proxyAdminOwner?: ProxyAdminOwner } /** @@ -270,9 +383,13 @@ function formatProxyStatusLine(input: ProxyStatusInput): ProxyStatusResult { notes.push('code changed') } + // ProxyAdmin ownership warning: 🔑 when known to be non-governor (deployer or other) + const adminIcon = + input.proxyAdminOwner && input.proxyAdminOwner !== 'governor' && input.proxyAdminOwner !== 'unknown' ? ' 🔑' : '' + // Format the line const suffix = notes.length > 0 ? ` (${notes.join(', ')})` : '' - const line = `${codeIcon} ${statusIcon} ${input.name} @ ${formatAddress(input.proxyAddress)} → ${formatAddress(input.implAddress)}${suffix}` + const line = `${codeIcon} ${statusIcon} ${input.name} @ ${formatAddress(input.proxyAddress)} → ${formatAddress(input.implAddress)}${suffix}${adminIcon}` return { line } } @@ -293,6 +410,9 @@ export interface ContractSpec { artifact?: ArtifactSource /** If true, address-only placeholder (code not required) */ addressOnly?: boolean + /** ABI-encoded constructor args from address book deployment metadata. + * Used to seed rocketh records with real argsData instead of '0x'. */ + deploymentArgsData?: string /** Proxy sync fields (if present, will sync implementation with on-chain) */ proxy?: { proxyAdminAddress: string @@ -342,6 +462,15 @@ export function buildContractSpec( throw new Error(`${addressBookEntryName} not found in address book for chainId ${targetChainId}`) } + // Get deployment argsData from address book for accurate rocketh record seeding + let deploymentArgsData: string | undefined + if (entry) { + const deploymentMeta = entry.proxy ? entry.implementationDeployment : entry.deployment + if (deploymentMeta?.argsData && deploymentMeta.argsData !== '0x') { + deploymentArgsData = deploymentMeta.argsData + } + } + const spec: ContractSpec = { name: contractName, addressBookType, @@ -349,6 +478,7 @@ export function buildContractSpec( prerequisite: metadata.prerequisite ?? false, artifact: metadata.artifact, addressOnly: metadata.addressOnly, + deploymentArgsData, } // Add proxy configuration if this is a proxied contract @@ -395,7 +525,7 @@ export interface SyncResult { /** * Sync a single contract - returns status and whether it succeeded */ -async function syncContract( +export async function syncContract( env: Environment, // eslint-disable-next-line @typescript-eslint/no-explicit-any client: any, @@ -463,20 +593,13 @@ async function syncContract( // Get updated entry for formatProxyStatusLine const updatedEntry = spec.proxy.addressBook.getEntry(spec.name) - // Check if local bytecode differs from deployed (via bytecodeHash) - // If artifact exists but no bytecodeHash stored, assume code changed (untracked state) - let codeChanged = false - if (spec.proxy.artifact) { - const deploymentMetadata = spec.proxy.addressBook.getDeploymentMetadata(spec.name) - const localArtifact = loadArtifactFromSource(spec.proxy.artifact) - if (deploymentMetadata?.bytecodeHash && localArtifact?.deployedBytecode) { - const localHash = computeBytecodeHash(localArtifact.deployedBytecode) - codeChanged = localHash !== deploymentMetadata.bytecodeHash - } else if (localArtifact?.deployedBytecode) { - // No stored bytecodeHash but artifact exists - untracked/legacy state - codeChanged = true - } - } + const pendingImpl = updatedEntry.pendingImplementation + const implAddress = pendingImpl?.address ?? updatedEntry.implementation + const implDeployment = pendingImpl + ? pendingImpl.deployment + : spec.proxy.addressBook.getDeploymentMetadata(spec.name) + + const { codeChanged, localHash } = checkCodeChanged(spec.proxy.artifact, spec.proxy.addressBook, spec.name) const result = formatProxyStatusLine({ name: spec.name, @@ -507,32 +630,25 @@ async function syncContract( if (!existing) { // No existing record - create from artifact + // IMPORTANT: For proxy contracts, we only load the ABI, not bytecode + // The artifact is for the implementation, not the proxy itself let abi: readonly unknown[] = [] - let bytecode: `0x${string}` = '0x' - let deployedBytecode: `0x${string}` | undefined if (spec.artifact) { const artifact = loadArtifactFromSource(spec.artifact) if (artifact?.abi) { abi = artifact.abi } - if (artifact?.bytecode) { - bytecode = artifact.bytecode as `0x${string}` - } - if (artifact?.deployedBytecode) { - deployedBytecode = artifact.deployedBytecode as `0x${string}` - } } await env.save(spec.name, { address: spec.address as `0x${string}`, abi: abi as typeof abi & readonly unknown[], - bytecode, - deployedBytecode, + bytecode: '0x' as `0x${string}`, // Don't store impl bytecode for proxy record + deployedBytecode: undefined, argsData: '0x' as `0x${string}`, metadata: '', } as unknown as Parameters[1]) } else if (addressChanged) { - // Address changed - update address but preserve existing bytecode - // This handles the case where address book points to new address + // Address changed - update address and clear bytecode (proxy address changed) let abi: readonly unknown[] = existing.abi as readonly unknown[] // Update ABI from artifact if available (ABI doesn't affect change detection) if (spec.artifact) { @@ -544,10 +660,10 @@ async function syncContract( await env.save(spec.name, { address: spec.address as `0x${string}`, abi: abi as typeof abi & readonly unknown[], - bytecode: existing.bytecode as `0x${string}`, - deployedBytecode: existing.deployedBytecode as `0x${string}`, - argsData: existing.argsData as `0x${string}`, - metadata: existing.metadata ?? '', + bytecode: '0x' as `0x${string}`, // Clear bytecode - proxy changed + deployedBytecode: undefined, + argsData: '0x' as `0x${string}`, + metadata: '', } as unknown as Parameters[1]) } // else: existing record with same address - do nothing, preserve rocketh's state @@ -625,42 +741,52 @@ async function syncContract( } as unknown as Parameters[1]) } - // Save implementation deployment record - // Pick pending or current - both have same structure (address + deployment metadata) - const pendingImpl = updatedEntry.pendingImplementation - const implAddress = pendingImpl?.address ?? updatedEntry.implementation - const implDeployment = pendingImpl - ? pendingImpl.deployment - : spec.proxy.addressBook.getDeploymentMetadata(spec.name) - + // Save implementation deployment record (if local hash matches stored) if (implAddress) { const storedHash = implDeployment?.bytecodeHash - - // Only sync if stored hash matches local artifact let hashMatches = false - if (storedHash && spec.proxy.artifact) { - const localArtifact = loadArtifactFromSource(spec.proxy.artifact) - if (localArtifact?.deployedBytecode) { - const localHash = computeBytecodeHash(localArtifact.deployedBytecode) - if (storedHash === localHash) { - hashMatches = true - } else { - syncNotes.push('impl outdated') - } - } + + if (storedHash && localHash) { + hashMatches = storedHash === localHash } + // When hash doesn't match, leave the existing rocketh record untouched. + // The old record (with real bytecode from the previous deploy) lets rocketh + // correctly detect the bytecode change and trigger a fresh deployment. + // NOTE: Do NOT clear the record to bytecode '0x' — rocketh's CBOR-stripping + // comparison treats '0x' as NaN length, causing slice(0, NaN) → '' for both + // old and new bytecodes, making them falsely compare as equal. + if (hashMatches) { const implResult = await syncContract(env, client, { name: `${spec.name}_Implementation`, addressBookType: spec.addressBookType, address: implAddress, prerequisite: true, + artifact: spec.proxy.artifact, }) if (!implResult.success) { return implResult } + // Patch implementation record with deployment metadata for accurate + // rocketh comparison. syncContract creates bare records without argsData, + // but rocketh's deploy() compares argsData to decide if redeployment is + // needed. Without the real argsData, rocketh falsely detects a change + // and redeploys implementations that haven't changed. + const implRecordName = `${spec.name}_Implementation` + const implRecord = env.getOrNull(implRecordName) + if (implRecord && implDeployment?.argsData && (!implRecord.argsData || implRecord.argsData === '0x')) { + await env.save(implRecordName, { + address: implRecord.address as `0x${string}`, + abi: implRecord.abi as typeof implRecord.abi & readonly unknown[], + bytecode: (implRecord.bytecode ?? '0x') as `0x${string}`, + deployedBytecode: implRecord.deployedBytecode as `0x${string}` | undefined, + argsData: implDeployment.argsData as `0x${string}`, + metadata: (implRecord as Record).metadata ?? '', + } as unknown as Parameters[1]) + } + // Backfill address book metadata from rocketh if rocketh is newer const rockethImpl = env.getOrNull(`${spec.name}_Implementation`) if (rockethImpl?.argsData && rockethImpl.argsData !== '0x') { @@ -742,31 +868,47 @@ async function syncContract( statusNotes.push('re-imported') } + // Decide whether to seed rocketh's record from the local artifact (see + // `shouldSeedRocketh` for the rationale and gate). + const chainIdForVerify = await getTargetChainIdFromEnv(env) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const addressBookForVerify: any = getAddressBookForType(spec.addressBookType, chainIdForVerify) + const seedDecision = shouldSeedRocketh(spec, addressBookForVerify) + if (!existing) { - // No existing record - create from artifact - let abi: readonly unknown[] = [] - let bytecode: `0x${string}` = '0x' - let deployedBytecode: `0x${string}` | undefined - if (spec.artifact) { - const artifact = loadArtifactFromSource(spec.artifact) - if (artifact?.abi) { - abi = artifact.abi - } - if (artifact?.bytecode) { - bytecode = artifact.bytecode as `0x${string}` - } - if (artifact?.deployedBytecode) { - deployedBytecode = artifact.deployedBytecode as `0x${string}` + if (seedDecision.seed) { + // Either no artifact to compare (legacy/external entry) or hash verified — + // safe to seed rocketh from the artifact. + let abi: readonly unknown[] = [] + let bytecode: `0x${string}` = '0x' + let deployedBytecode: `0x${string}` | undefined + if (spec.artifact) { + const artifact = loadArtifactFromSource(spec.artifact) + if (artifact?.abi) { + abi = artifact.abi + } + if (artifact?.bytecode) { + bytecode = artifact.bytecode as `0x${string}` + } + if (artifact?.deployedBytecode) { + deployedBytecode = artifact.deployedBytecode as `0x${string}` + } } + await env.save(spec.name, { + address: spec.address as `0x${string}`, + abi: abi as typeof abi & readonly unknown[], + bytecode, + deployedBytecode, + argsData: (spec.deploymentArgsData ?? '0x') as `0x${string}`, + metadata: '', + } as unknown as Parameters[1]) + } else { + // Cannot verify artifact matches what's on-chain — leave the rocketh + // record absent so the next deployFn detects no prior bytecode and + // deploys fresh. Seeding from a stale or new artifact would mask the + // drift: rocketh would compare new artifact to itself and skip redeploy. + statusNotes.push(`seed skipped (${seedDecision.reason})`) } - await env.save(spec.name, { - address: spec.address as `0x${string}`, - abi: abi as typeof abi & readonly unknown[], - bytecode, - deployedBytecode, - argsData: '0x' as `0x${string}`, - metadata: '', - } as unknown as Parameters[1]) } else if (addressChanged) { // Address changed - update address but preserve existing bytecode let abi: readonly unknown[] = existing.abi as readonly unknown[] @@ -787,11 +929,99 @@ async function syncContract( } // else: existing record with same address - do nothing, preserve rocketh's state + // Backfill deployment metadata from rocketh → address book (mirrors proxy backfill) + // Only for real registry entries — skip synthetic names (e.g. HorizonStaking_Implementation) + // created by proxy sync as rocketh-only records + const registryMetadata = getContractMetadata(spec.addressBookType, spec.name) + const rockethRecord = env.getOrNull(spec.name) + if (registryMetadata && rockethRecord?.argsData && rockethRecord.argsData !== '0x') { + const chainId = await getTargetChainIdFromEnv(env) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const addressBook: any = getAddressBookForType(spec.addressBookType, chainId) + const entry = addressBook.getEntry(spec.name) + const rockethBlockNumber = rockethRecord.receipt?.blockNumber + ? parseInt(rockethRecord.receipt.blockNumber as string) + : undefined + const addressBookBlockNumber = entry.deployment?.blockNumber + + const rockethIsNewer = + !entry.deployment?.argsData || + (rockethBlockNumber !== undefined && addressBookBlockNumber === undefined) || + (rockethBlockNumber !== undefined && + addressBookBlockNumber !== undefined && + rockethBlockNumber > addressBookBlockNumber) + + if (rockethIsNewer) { + const deploymentMetadata: DeploymentMetadata = { + txHash: rockethRecord.transaction?.hash ?? '', + argsData: rockethRecord.argsData, + bytecodeHash: rockethRecord.deployedBytecode ? computeBytecodeHash(rockethRecord.deployedBytecode) : '', + ...(rockethBlockNumber !== undefined && { blockNumber: rockethBlockNumber }), + } + addressBook.setDeploymentMetadata(spec.name, deploymentMetadata) + statusNotes.push('backfilled metadata') + } + } + // Format status line for non-proxy contracts (two-column format with blank status icon position) const statusSuffix = statusNotes.length > 0 ? ` (${statusNotes.join(', ')})` : '' return { success: true, status: `✓ ${nonProxySyncIcon} ${spec.name} @ ${formatAddress(spec.address)}${statusSuffix}` } } +/** + * Options for sync display filtering + */ +export interface SyncOptions { + /** + * Tags requested in the deploy command (e.g., ['IssuanceAllocator:deploy', 'sync']). + * When set, only contracts matching these tags or with detected changes are displayed. + * Sync still runs for all contracts regardless of filter. + */ + tagFilter?: string[] +} + +/** + * Extract component names from deployment tags. + * + * Strips action suffixes (e.g., 'IssuanceAllocator:deploy' → 'IssuanceAllocator') + * and filters out the special 'sync' tag. + */ +function extractComponentNames(tags: string[]): Set { + const components = new Set() + for (const tag of tags) { + if (tag === SpecialTags.SYNC) continue + components.add(tag.split(':')[0]) + } + return components +} + +/** + * Check whether a sync status line indicates changes were detected. + * + * Icons: ↑ upgraded, ↻ synced/re-imported, ◷ pending, △ code changed + * Parenthetical notes also indicate notable state (but not "(not deployed)"). + */ +function statusHasChanges(status: string): boolean { + if (/[↑↻◷△]/.test(status)) return true + if (status.includes('(') && !status.includes('(not deployed)')) return true + return false +} + +/** + * Determine whether a contract's sync result should be displayed. + */ +function shouldDisplay( + spec: ContractSpec, + result: { success: boolean; status: string }, + filterComponents: Set | null, +): boolean { + if (!filterComponents) return true + if (!result.success) return true + if (statusHasChanges(result.status)) return true + const metadata = getContractMetadata(spec.addressBookType, spec.name) + return !!metadata?.componentTag && filterComponents.has(metadata.componentTag) +} + /** * Sync contract groups with on-chain state * @@ -800,34 +1030,248 @@ async function syncContract( * - Import contract addresses into rocketh deployment records * - Validate prerequisites exist on-chain * - Show code changed indicator (△) when local bytecode differs from deployed + * + * When options.tagFilter is set, only contracts matching the requested tags + * or with detected changes are displayed. Sync still runs for all contracts. */ -export async function syncContractGroups(env: Environment, groups: AddressBookGroup[]): Promise { +export async function syncContractGroups( + env: Environment, + groups: AddressBookGroup[], + options?: SyncOptions, +): Promise { const client = graph.getPublicClient(env) const failures: string[] = [] let totalSynced = 0 + // Build component filter from tags (null = no filtering) + const filterComponents = + options?.tagFilter && options.tagFilter.length > 0 ? extractComponentNames(options.tagFilter) : null + const isFiltering = filterComponents !== null && filterComponents.size > 0 + let totalSuppressed = 0 + for (const group of groups) { - env.showMessage(`\n📦 ${group.label}`) + // Buffer results so we can filter display without affecting sync + const results: Array<{ spec: ContractSpec; result: { success: boolean; status: string } }> = [] for (const spec of group.contracts) { const result = await syncContract(env, client, spec) + results.push({ spec, result }) - env.showMessage(` ${result.status}`) if (!result.success) { failures.push(spec.name) } else { totalSynced++ - // For proxies, syncContract also syncs the implementation internally if (spec.proxy) { - totalSynced++ // Count the implementation sync + totalSynced++ } } } + + // Filter which results to display + const visible = isFiltering + ? results.filter(({ spec, result }) => shouldDisplay(spec, result, filterComponents)) + : results + const suppressed = results.length - visible.length + totalSuppressed += suppressed + + if (visible.length > 0) { + env.showMessage(`\n📦 ${group.label}`) + for (const { result } of visible) { + env.showMessage(` ${result.status}`) + } + if (suppressed > 0) { + env.showMessage(` ... ${suppressed} unchanged`) + } + } + } + + if (isFiltering && totalSuppressed > 0) { + env.showMessage(`\n ... ${totalSuppressed} unchanged contracts hidden (--tags sync for full output)`) } return { success: failures.length === 0, totalSynced, failures } } +/** + * Resolve address book instance for a given address book type and chain ID + */ +function getAddressBookForType(addressBookType: AddressBookType, chainId: number) { + switch (addressBookType) { + case 'horizon': + return graph.getHorizonAddressBook(chainId) + case 'subgraph-service': + return graph.getSubgraphServiceAddressBook(chainId) + case 'issuance': + return graph.getIssuanceAddressBook(chainId) + } +} + +/** + * Sync a single component from the contract registry with on-chain state. + * + * Resolves the address book, builds a ContractSpec, and runs the same sync + * logic as the full sync script — reading on-chain state to confirm and + * propagate reality into address books and rocketh records. + * + * Components call this immediately before and after mutating actions so the + * action operates on a confirmed-fresh view, without requiring a separate + * global sync to have run first. + */ +export async function syncComponentFromRegistry(env: Environment, contract: RegistryEntry): Promise { + const chainId = await getTargetChainIdFromEnv(env) + const addressBook = getAddressBookForType(contract.addressBook, chainId) + const metadata = getContractMetadata(contract.addressBook, contract.name) + if (!metadata) { + throw new Error(`Contract '${contract.name}' not found in ${contract.addressBook} registry`) + } + + const spec = buildContractSpec(contract.addressBook, contract.name, metadata, addressBook, chainId) + const client = graph.getPublicClient(env) + const result = await syncContract(env, client, spec) + + env.showMessage(` ${result.status}`) + if (!result.success) { + throw new Error(`Sync failed for ${contract.name}: ${result.status}`) + } +} + +/** + * Sync multiple components from the contract registry with on-chain state. + * + * Convenience wrapper around `syncComponentFromRegistry` for scripts that need + * a small set of contracts in sync before they read them — typically the + * contract being acted on plus its direct on-chain prerequisites (Controller, + * shared implementations, etc.). + */ +export async function syncComponentsFromRegistry(env: Environment, contracts: RegistryEntry[]): Promise { + for (const contract of contracts) { + await syncComponentFromRegistry(env, contract) + } +} + +/** + * Run the full address book sync across every deployable contract in every + * address book (Horizon, SubgraphService, Issuance). + * + * This is the implementation behind both the `00_sync.ts` deploy script (run + * via `--tags sync`) and the `deploy:sync` Hardhat task. Orchestration scripts + * that need many contracts in sync before they run (e.g. the GIP-0088 upgrade + * batch builder) call this directly instead of relying on a tag dependency. + * + * On failure, exits the process with code 1 after printing remediation hints. + */ +export async function runFullSync(env: Environment): Promise { + // Get chainId from provider (will be 31337 in fork mode) + const chainIdHex = await env.network.provider.request({ method: 'eth_chainId' }) + const providerChainId = Number(chainIdHex) + + // Auto-detect fork network from anvil if not explicitly set + if (providerChainId === 31337 && !getForkNetwork(env.name)) { + const detected = await autoDetectForkNetwork() + if (detected) { + env.showMessage(`\n🔍 Auto-detected fork network: ${detected}`) + } + } + + // Determine target chain ID for address book lookups + const forkNetwork = getForkNetwork(env.name) + const isForking = isForkMode(env.name) + const forkChainId = getForkTargetChainId(env.name) + const targetChainId = forkChainId ?? providerChainId + + // Check for common misconfiguration: localhost without FORK_NETWORK and not a detectable fork + if (providerChainId === 31337 && !forkNetwork) { + throw new Error( + `Running on localhost (chainId 31337) without FORK_NETWORK set.\n\n` + + `If you're testing against a forked network, set the environment variable:\n` + + ` export FORK_NETWORK=arbitrumSepolia\n` + + ` npx hardhat deploy:sync --network localhost\n\n` + + `Or use ephemeral fork mode:\n` + + ` HARDHAT_FORK=arbitrumSepolia npx hardhat deploy:sync`, + ) + } + + if (forkNetwork) { + const forkStateDir = getForkStateDir(env.name, forkNetwork) + env.showMessage(`\n🔄 Sync: ${forkNetwork} fork (chainId: ${targetChainId})`) + env.showMessage(` Using fork-local address books (${forkStateDir}/)`) + } else { + env.showMessage(`\n🔄 Sync: ${env.name} (chainId: ${providerChainId})`) + } + + // Get address books (automatically uses fork-local copies in fork mode) + const horizonAddressBook = graph.getHorizonAddressBook(targetChainId) + const ssAddressBook = graph.getSubgraphServiceAddressBook(targetChainId) + + const groups: AddressBookGroup[] = [] + + // --- Horizon contracts --- + const horizonContracts: ContractSpec[] = getDeployableContracts('horizon').map((name) => { + const metadata = getContractMetadata('horizon', name) + if (!metadata) throw new Error(`Contract ${name} not found in horizon registry`) + return buildContractSpec('horizon', name, metadata, horizonAddressBook, targetChainId) + }) + groups.push({ label: 'Horizon', contracts: horizonContracts, addressBook: horizonAddressBook }) + + // --- SubgraphService contracts --- + const ssContracts: ContractSpec[] = getDeployableContracts('subgraph-service').map((name) => { + const metadata = getContractMetadata('subgraph-service', name) + if (!metadata) throw new Error(`Contract ${name} not found in subgraph-service registry`) + return buildContractSpec('subgraph-service', name, metadata, ssAddressBook, targetChainId) + }) + groups.push({ label: 'SubgraphService', contracts: ssContracts, addressBook: ssAddressBook }) + + // --- Issuance contracts --- + const issuanceBookPath = getIssuanceAddressBookPath() + const issuanceAddressBook = existsSync(issuanceBookPath) ? graph.getIssuanceAddressBook(targetChainId) : null + + if (issuanceAddressBook) { + const issuanceContracts: ContractSpec[] = getDeployableContracts('issuance').map((name) => { + const metadata = getContractMetadata('issuance', name) + if (!metadata) throw new Error(`Contract ${name} not found in issuance registry`) + return buildContractSpec('issuance', name, metadata, issuanceAddressBook, targetChainId) + }) + if (issuanceContracts.length > 0) { + groups.push({ label: 'Issuance', contracts: issuanceContracts, addressBook: issuanceAddressBook }) + } + } + + // Parse --tags from process.argv to filter sync display when invoked via + // `hardhat deploy --tags ...` (does nothing for the standalone deploy:sync task) + const tagsIndex = process.argv.indexOf('--tags') + const requestedTags = + tagsIndex !== -1 && tagsIndex < process.argv.length - 1 ? process.argv[tagsIndex + 1].split(',') : [] + + const syncOptions: SyncOptions = requestedTags.length > 0 ? { tagFilter: requestedTags } : {} + + const result = await syncContractGroups(env, groups, syncOptions) + + if (!result.success) { + env.showMessage(`\n❌ Sync failed: address book does not match chain state.\n`) + env.showMessage(`The following contracts are in address book but have no code on-chain:`) + env.showMessage(` ${result.failures.join(', ')}\n`) + if (isForking) { + env.showMessage(`This is likely because the fork was restarted.\n`) + env.showMessage(`To fix, reset fork state and re-run:`) + env.showMessage(` npx hardhat deploy:reset-fork --network localhost`) + } else { + env.showMessage(`Possible causes:`) + env.showMessage(` 1. Address book has incorrect addresses for this network`) + env.showMessage(` 2. Running against wrong network`) + } + process.exit(1) + } + + env.showMessage(`\n✅ Sync complete: ${result.totalSynced} contracts synced\n`) +} + +/** Filter deployable contracts from a registry namespace. */ +function getDeployableContracts(addressBook: AddressBookType): string[] { + return getContractsByAddressBook(addressBook) + .filter(([_, metadata]) => metadata.deployable !== false) + .map(([name]) => name) +} + /** * Contract status result (read-only, no sync operations) */ @@ -838,6 +1282,64 @@ export interface ContractStatusResult { exists: boolean /** Optional warnings (e.g., address book stale) */ warnings?: string[] + /** Proxy admin ownership state (only for proxied contracts) */ + proxyAdminOwner?: ProxyAdminOwner + /** Proxy admin address (only for proxied contracts) */ + proxyAdminAddress?: string + /** Proxy admin owner address (only for proxied contracts with on-chain query) */ + proxyAdminOwnerAddress?: string + /** Whether local compiled bytecode differs from deployed bytecode */ + codeChanged?: boolean + /** Whether a pending implementation upgrade exists */ + hasPendingImplementation?: boolean +} + +/** + * Options for querying proxy admin ownership during status checks + */ +export interface ProxyAdminOwnershipContext { + /** Governor address (from Controller) — required */ + governor: string + /** Deployer address (from named accounts) — optional, used for labelling */ + deployer?: string +} + +/** + * Query ProxyAdmin ownership and classify as governor/deployer/unknown + * + * The 🔑 warning icon is shown for anything NOT governor-owned. + * Deployer detection is best-effort (only when deployer address is known). + */ +async function queryProxyAdminOwnership( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + client: any, + proxyAdminAddress: string, + ctx: ProxyAdminOwnershipContext, +): Promise<{ owner: ProxyAdminOwner; ownerAddress: string }> { + try { + const ownerAddress = (await client.readContract({ + address: proxyAdminAddress as `0x${string}`, + abi: [ + { + inputs: [], + name: 'owner', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + ], + functionName: 'owner', + })) as string + + if (ownerAddress.toLowerCase() === ctx.governor.toLowerCase()) { + return { owner: 'governor', ownerAddress } + } else if (ctx.deployer && ownerAddress.toLowerCase() === ctx.deployer.toLowerCase()) { + return { owner: 'deployer', ownerAddress } + } + return { owner: 'other', ownerAddress } + } catch { + return { owner: 'unknown', ownerAddress: '' } + } } /** @@ -845,12 +1347,14 @@ export interface ContractStatusResult { * * Returns a formatted status line similar to sync output: * - ✓ = ok, △ = code changed, ◷ = pending upgrade, ○ = not deployed, ❌ = error + * - 🔑 = ProxyAdmin still owned by deployer (not yet transferred to governor) * * @param client - Viem public client * @param addressBookType - Which address book this contract belongs to * @param addressBook - Address book instance * @param contractName - Name of the contract in the registry * @param metadata - Contract metadata from registry (optional, will look up if not provided) + * @param ownershipCtx - Governor/deployer context for proxy admin ownership checks */ export async function getContractStatusLine( // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -860,6 +1364,7 @@ export async function getContractStatusLine( addressBook: any, contractName: string, metadata?: ContractMetadata, + ownershipCtx?: ProxyAdminOwnershipContext, ): Promise { const meta = metadata ?? getContractMetadata(addressBookType, contractName) const entryName = getAddressBookEntryName(addressBookType, contractName) @@ -875,6 +1380,17 @@ export async function getContractStatusLine( return { line: `✓ ${contractName} @ ${formatAddress(entry.address)}`, exists: true } } + // If no client available, show address book status without on-chain verification + if (!client) { + if (meta?.proxyType && entry.implementation) { + return { + line: `? ${contractName} @ ${formatAddress(entry.address)} → ${formatAddress(entry.implementation)} (no on-chain check)`, + exists: true, + } + } + return { line: `? ${contractName} @ ${formatAddress(entry.address)} (no on-chain check)`, exists: true } + } + // Check if code exists on-chain const code = await client.getCode({ address: entry.address as `0x${string}` }) if (!code || code === '0x') { @@ -904,27 +1420,33 @@ export async function getContractStatusLine( } if (actualImpl) { - // Check if local bytecode differs from deployed (via bytecodeHash) - // If artifact exists but no bytecodeHash stored, assume code changed (untracked state) - let codeChanged = false - if (meta.artifact) { - const deploymentMetadata = addressBook.getDeploymentMetadata(contractName) - const localArtifact = loadArtifactFromSource(meta.artifact) - if (deploymentMetadata?.bytecodeHash && localArtifact?.deployedBytecode) { - const localHash = computeBytecodeHash(localArtifact.deployedBytecode) - codeChanged = localHash !== deploymentMetadata.bytecodeHash - } else if (localArtifact?.deployedBytecode) { - // No stored bytecodeHash but artifact exists - untracked/legacy state - codeChanged = true + // Check code changes: own artifact first, then shared implementation's artifact + let { codeChanged } = checkCodeChanged(meta.artifact, addressBook, entryName) + if (!codeChanged && meta.sharedImplementation) { + const sharedMeta = getContractMetadata(addressBookType, meta.sharedImplementation) + if (sharedMeta?.artifact) { + const sharedCheck = checkCodeChanged(sharedMeta.artifact, addressBook, meta.sharedImplementation) + codeChanged = sharedCheck.codeChanged } } + // Query proxy admin ownership for OZ v5 transparent proxies only + // (old Graph proxies are controller-governed, owner() doesn't exist) + let proxyAdminOwner: ProxyAdminOwner | undefined + let proxyAdminOwnerAddress: string | undefined + if (ownershipCtx && proxyAdminAddress && meta.proxyType !== 'graph') { + const ownership = await queryProxyAdminOwnership(client, proxyAdminAddress, ownershipCtx) + proxyAdminOwner = ownership.owner + proxyAdminOwnerAddress = ownership.ownerAddress + } + const result = formatProxyStatusLine({ name: contractName, proxyAddress: entry.address, implAddress: actualImpl, pendingAddress: entry.pendingImplementation?.address, codeChanged, + proxyAdminOwner, }) // Check if address book is stale (on-chain impl differs from recorded impl) @@ -934,13 +1456,67 @@ export async function getContractStatusLine( warnings.push(`address book stale: recorded impl ${formatAddress(bookImpl)}`) } - return { line: result.line, exists: true, warnings: warnings.length > 0 ? warnings : undefined } + return { + line: result.line, + exists: true, + warnings: warnings.length > 0 ? warnings : undefined, + proxyAdminOwner, + proxyAdminAddress, + proxyAdminOwnerAddress, + codeChanged, + hasPendingImplementation: !!entry.pendingImplementation?.address, + } } } - // Non-proxy contract - use two-column format with blank status icon - return { line: `✓ ${contractName} @ ${formatAddress(entry.address)}`, exists: true } - } catch { - return { line: `⚠ ${contractName}: error reading`, exists: false } + // Non-proxy contract — check for code changes against stored bytecodeHash + const { codeChanged } = meta?.artifact + ? checkCodeChanged(meta.artifact, addressBook, entryName) + : { codeChanged: false } + const icon = codeChanged ? '△' : '✓' + return { line: `${icon} ${contractName} @ ${formatAddress(entry.address)}`, exists: true, codeChanged } + } catch (e) { + const errMsg = e instanceof Error ? e.message.split('\n')[0].slice(0, 120) : String(e).slice(0, 120) + return { line: `⚠ ${contractName}: error reading (${errMsg})`, exists: false } + } +} + +/** + * Check if any deployable proxy across all address books has a pending + * implementation or local code that differs from the deployed version. + * + * Used by status scripts for next-step guidance without duplicating + * address book scanning logic. + */ +export function checkAllProxyStates(targetChainId: number): { anyCodeChanged: boolean; anyPending: boolean } { + const addressBookTypes: AddressBookType[] = ['horizon', 'subgraph-service', 'issuance'] + let anyCodeChanged = false + let anyPending = false + + for (const abType of addressBookTypes) { + const ab: AnyAddressBookOps = getAddressBookForType(abType, targetChainId) + + for (const [name, meta] of getContractsByAddressBook(abType)) { + if (!meta.deployable || !meta.proxyType) continue + if (!ab.entryExists(name)) continue + const entry = ab.getEntry(name) + if (!entry?.address) continue + + if (entry.pendingImplementation?.address) anyPending = true + if (meta.artifact) { + const { codeChanged } = checkCodeChanged(meta.artifact, ab, name) + if (codeChanged) anyCodeChanged = true + } else if (meta.sharedImplementation) { + const sharedMeta = getContractMetadata(abType, meta.sharedImplementation) + if (sharedMeta?.artifact) { + const { codeChanged } = checkCodeChanged(sharedMeta.artifact, ab, meta.sharedImplementation) + if (codeChanged) anyCodeChanged = true + } + } + + if (anyCodeChanged && anyPending) return { anyCodeChanged, anyPending } + } } + + return { anyCodeChanged, anyPending } } diff --git a/packages/deployment/lib/task-utils.ts b/packages/deployment/lib/task-utils.ts new file mode 100644 index 000000000..72473073e --- /dev/null +++ b/packages/deployment/lib/task-utils.ts @@ -0,0 +1,139 @@ +/** + * Shared Task Utilities + * + * Common functions used across Hardhat tasks. Consolidates helpers that were + * previously duplicated across grant-role, revoke-role, reo-tasks, eth-tasks, + * grt-tasks, and check-deployer. + */ + +import { configVariable } from 'hardhat/config' + +import { type AddressBookType, CONTRACT_REGISTRY } from './contract-registry.js' +import { graph } from '../rocketh/deploy.js' + +/** + * Convert network name to env var prefix: arbitrumSepolia → ARBITRUM_SEPOLIA + */ +export function networkToEnvPrefix(networkName: string): string { + return networkName.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase() +} + +/** + * Resolve a configuration variable using Hardhat's hook chain (keystore + env fallback) + * + * Tries the Hardhat keystore plugin first, then falls back to environment variables. + * Returns undefined if the variable is not found in either location. + * + * @param hre - Hardhat Runtime Environment + * @param name - Configuration variable name (e.g., 'ARBITRUM_SEPOLIA_DEPLOYER_KEY') + * @returns The resolved value or undefined if not set + */ +export async function resolveConfigVar(hre: unknown, name: string): Promise { + try { + const variable = configVariable(name) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hooks = (hre as any).hooks + + const value = await hooks.runHandlerChain( + 'configurationVariables', + 'fetchValue', + [variable], + async (_context: unknown, v: { name: string }) => { + const envValue = process.env[v.name] + if (typeof envValue !== 'string') { + throw new Error(`Variable ${v.name} not found`) + } + return envValue + }, + ) + return value + } catch { + return undefined + } +} + +/** + * Get the deployer key name for a network, handling fork mode. + * + * In fork mode (network name is 'fork'), uses the HARDHAT_FORK env var to + * determine the source network. Falls back to 'arbitrumSepolia'. + * + * @param networkName - Network name (e.g., 'fork', 'arbitrumSepolia') + * @returns Key name (e.g., 'ARBITRUM_SEPOLIA_DEPLOYER_KEY') + */ +export function getDeployerKeyName(networkName: string): string { + const effectiveNetwork = networkName === 'fork' ? (process.env.HARDHAT_FORK ?? 'arbitrumSepolia') : networkName + return `${networkToEnvPrefix(effectiveNetwork)}_DEPLOYER_KEY` +} + +/** + * Resolve contract from registry by name + * + * Searches across all address books for a matching contract with roles defined. + * Returns the address book type and role list if found. + */ +export function resolveContractFromRegistry( + contractName: string, +): { addressBook: AddressBookType; roles: readonly string[] } | null { + for (const [book, contracts] of Object.entries(CONTRACT_REGISTRY)) { + const contract = contracts[contractName as keyof typeof contracts] as { roles?: readonly string[] } | undefined + if (contract?.roles) { + return { addressBook: book as AddressBookType, roles: contract.roles } + } + } + return null +} + +/** + * Get contract address from address book + */ +export function getContractAddress(addressBook: AddressBookType, contractName: string, chainId: number): string | null { + const book = + addressBook === 'issuance' + ? graph.getIssuanceAddressBook(chainId) + : addressBook === 'horizon' + ? graph.getHorizonAddressBook(chainId) + : graph.getSubgraphServiceAddressBook(chainId) + + // Address book type is a union — cast to access entryExists/getEntry with a runtime name + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const anyBook = book as any + if (!anyBook.entryExists(contractName)) { + return null + } + + return anyBook.getEntry(contractName)?.address ?? null +} + +/** + * Format duration in seconds to human-readable string (e.g., "2d 3h 15m") + */ +export function formatDuration(seconds: bigint): string { + const days = seconds / 86400n + const hours = (seconds % 86400n) / 3600n + const mins = (seconds % 3600n) / 60n + + if (days > 0n) { + return `${days}d ${hours}h ${mins}m` + } else if (hours > 0n) { + return `${hours}h ${mins}m` + } else { + return `${mins}m` + } +} + +/** + * Format timestamp to human-readable string (ISO format without milliseconds) + */ +export function formatTimestamp(timestamp: bigint): string { + if (timestamp === 0n) { + return 'never' + } + + const date = new Date(Number(timestamp) * 1000) + return date + .toISOString() + .replace(/\.000Z$/, '') + .replace(/Z$/, '') + .replace('T', ' ') +} diff --git a/packages/deployment/lib/upgrade-implementation.ts b/packages/deployment/lib/upgrade-implementation.ts index 866cfd047..3b35d482d 100644 --- a/packages/deployment/lib/upgrade-implementation.ts +++ b/packages/deployment/lib/upgrade-implementation.ts @@ -5,9 +5,10 @@ import { getTargetChainIdFromEnv } from './address-book-utils.js' import type { AnyAddressBookOps } from './address-book-ops.js' import { GRAPH_PROXY_ADMIN_ABI, OZ_PROXY_ADMIN_ABI } from './abis.js' import { type AddressBookType, type ProxyType, type RegistryEntry } from './contract-registry.js' -import { createGovernanceTxBuilder } from './execute-governance.js' +import { getOnChainImplementation } from './deploy-implementation.js' +import { createGovernanceTxBuilder, saveGovernanceTx } from './execute-governance.js' import { graph } from '../rocketh/deploy.js' -import type { TxMetadata } from './tx-builder.js' +import type { TxBuilder, TxMetadata } from './tx-builder.js' /** * Configuration for upgrading an implementation (manual override mode) @@ -19,10 +20,11 @@ export interface ImplementationUpgradeConfig { /** * Name of the proxy admin entry in address book. - * Examples: 'GraphProxyAdmin', 'GraphIssuanceProxyAdmin' + * Example: 'GraphProxyAdmin' for legacy GraphProxy contracts. * - * Optional for subgraph-service contracts - the proxy admin address - * is read from the contract entry's proxyAdmin field. + * Optional for OZ v5 TransparentUpgradeableProxy contracts (subgraph-service + * and issuance) — the per-proxy admin address is read from the contract + * entry's proxyAdmin field. */ proxyAdminName?: string @@ -30,8 +32,8 @@ export interface ImplementationUpgradeConfig { * Implementation contract name if different from contractName. * Used when a proxy is upgraded to a different contract type. * - * Example: PilotAllocation proxy upgraded to DirectAllocation implementation - * contractName: 'PilotAllocation' + * Example: ReclaimedRewards proxy upgraded to DirectAllocation implementation + * contractName: 'ReclaimedRewards' * implementationName: 'DirectAllocation' * * Default: same as contractName @@ -62,7 +64,7 @@ export interface ImplementationUpgradeOverrides { * Implementation contract name if different from contractName. * Used when a proxy is upgraded to a different contract type. * - * Example: PilotAllocation proxy upgraded to DirectAllocation implementation + * Example: ReclaimedRewards proxy upgraded to DirectAllocation implementation */ implementationName?: string @@ -110,7 +112,7 @@ function createUpgradeConfigFromRegistry( * import { Contracts } from '../../lib/contract-registry.js' * await upgradeImplementation(env, Contracts.horizon.RewardsManager) * await upgradeImplementation(env, Contracts["subgraph-service"].SubgraphService) - * await upgradeImplementation(env, Contracts.issuance.PilotAllocation, { + * await upgradeImplementation(env, Contracts.issuance.ReclaimedRewards, { * implementationName: 'DirectAllocation', // Upgrade to different implementation * }) * ``` @@ -124,17 +126,27 @@ function createUpgradeConfigFromRegistry( * }) * ``` */ -export async function upgradeImplementation( +/** + * Build upgrade TXs for a contract and add them to an existing builder. + * + * Checks the address book for a pendingImplementation. If found, encodes upgrade + * TX(s) and adds them to the provided builder. Returns without exiting. + * + * Use this when building a batch of upgrades (e.g., GIP-level stage scripts). + * For single-contract upgrades that save and exit, use `upgradeImplementation`. + * + * @returns Whether an upgrade was needed (pendingImplementation existed) + */ +export async function buildUpgradeTxs( env: Environment, entryOrConfig: RegistryEntry | ImplementationUpgradeConfig, + builder: TxBuilder, overrides?: ImplementationUpgradeOverrides, -): Promise { - // Handle overloads - convert registry entry to config +): Promise<{ upgraded: boolean }> { const config: ImplementationUpgradeConfig = 'name' in entryOrConfig ? createUpgradeConfigFromRegistry(entryOrConfig, overrides) : entryOrConfig const { contractName, proxyAdminName, proxyType = 'graph', addressBook = 'horizon' } = config - // Use fork-local address book in fork mode, canonical address book otherwise const targetChainId = await getTargetChainIdFromEnv(env) const addressBookInstance: AnyAddressBookOps = addressBook === 'subgraph-service' @@ -146,19 +158,49 @@ export async function upgradeImplementation( // Check for pending implementation const contractEntry = addressBookInstance.getEntry(contractName) if (!contractEntry?.pendingImplementation?.address) { - env.showMessage(`\n✓ No pending ${contractName} implementation to upgrade`) - return { upgraded: false, executed: false } + // No pending implementation stored — check if a shared implementation has changed on-chain + const implName = config.implementationName + if (implName && contractEntry?.address) { + const implDepName = `${implName}_Implementation` + const implDep = env.getOrNull(implDepName) + if (implDep) { + const client = graph.getPublicClient(env) + const onChainImpl = await getOnChainImplementation(client, contractEntry.address, proxyType) + if (onChainImpl.toLowerCase() !== implDep.address.toLowerCase()) { + // Shared implementation changed — auto-set pendingImplementation + const implMetadata = addressBookInstance.getDeploymentMetadata(implDepName) + addressBookInstance.setPendingImplementationWithMetadata( + contractName, + implDep.address, + implMetadata ?? { txHash: '', bytecodeHash: '' }, + ) + env.showMessage(` ⚠️ ${contractName}: shared implementation changed, setting pending upgrade`) + // Fall through to process the upgrade + } else { + env.showMessage(` ✓ ${contractName}: no pending implementation`) + return { upgraded: false } + } + } else { + env.showMessage(` ✓ ${contractName}: no pending implementation`) + return { upgraded: false } + } + } else { + env.showMessage(` ✓ ${contractName}: no pending implementation`) + return { upgraded: false } + } + } + + // Re-read entry after potential auto-set + const updatedEntry = addressBookInstance.getEntry(contractName) + if (!updatedEntry?.pendingImplementation?.address) { + return { upgraded: false } } // Get proxy admin address - // Priority: 1) Per-proxy ProxyAdmin in entry (OZ v5 / subgraph-service) - // 2) Shared ProxyAdmin by name (legacy horizon pattern) let proxyAdminAddress: string | undefined - if (contractEntry.proxyAdmin) { - // Per-proxy ProxyAdmin stored inline (OZ v5 issuance, subgraph-service) - proxyAdminAddress = contractEntry.proxyAdmin + if (updatedEntry.proxyAdmin) { + proxyAdminAddress = updatedEntry.proxyAdmin } else if (proxyAdminName) { - // Shared ProxyAdmin by name (horizon legacy pattern) proxyAdminAddress = addressBookInstance.getEntry(proxyAdminName)?.address } @@ -169,28 +211,13 @@ export async function upgradeImplementation( ) } - const proxyAddress = contractEntry.address - const pendingImpl = contractEntry.pendingImplementation.address - - env.showMessage(`\n🔧 Upgrading ${contractName}...`) - env.showMessage(` Proxy: ${proxyAddress}`) - env.showMessage(` ProxyAdmin: ${proxyAdminAddress}`) - env.showMessage(` New implementation: ${pendingImpl}`) - - // Generate governance TX with deterministic name (overwrites if exists) - const builder = await createGovernanceTxBuilder(env, `upgrade-${contractName}`, { - name: `${contractName} Upgrade`, - description: `Upgrade ${contractName} proxy to new implementation`, - }) + const proxyAddress = updatedEntry.address + const pendingImpl = updatedEntry.pendingImplementation!.address + const currentImpl = updatedEntry.implementation ?? 'unknown' - // Get current implementation for state change tracking - const currentImpl = contractEntry.implementation ?? 'unknown' + env.showMessage(` + ${contractName}: ${pendingImpl.slice(0, 10)}... (${proxyType} proxy)`) - // Build TX based on proxy type if (proxyType === 'transparent') { - // OpenZeppelin v5 ProxyAdmin uses upgradeAndCall() with empty calldata - // Note: we use empty bytes (0x) because not all contracts implement ERC165, - // so supportsInterface cannot be used as a universal no-op const upgradeData = encodeFunctionData({ abi: OZ_PROXY_ADMIN_ABI, functionName: 'upgradeAndCall', @@ -202,25 +229,15 @@ export async function upgradeImplementation( contractName, decoded: { function: 'upgradeAndCall(address,address,bytes)', - args: { - proxy: proxyAddress, - implementation: pendingImpl, - data: '0x [empty]', - }, + args: { proxy: proxyAddress, implementation: pendingImpl, data: '0x [empty]' }, }, stateChanges: { - [`${contractName} implementation`]: { - current: currentImpl, - new: pendingImpl, - }, + [`${contractName} implementation`]: { current: currentImpl, new: pendingImpl }, }, notes: 'OZ TransparentUpgradeableProxy upgrade via per-proxy ProxyAdmin', } builder.addTx({ to: proxyAdminAddress, value: '0', data: upgradeData }, metadata) } else { - // Graph legacy: upgrade() + acceptProxy(implementation, proxy) - // Note: GraphProxyAdmin.sol requires both implementation and proxy parameters, - // despite IGraphProxyAdmin interface only showing proxy parameter (interface is outdated) const upgradeData = encodeFunctionData({ abi: GRAPH_PROXY_ADMIN_ABI, functionName: 'upgrade', @@ -232,45 +249,75 @@ export async function upgradeImplementation( args: [pendingImpl as `0x${string}`, proxyAddress as `0x${string}`], }) - const upgradeMetadata: TxMetadata = { - toLabel: 'GraphProxyAdmin', - contractName, - decoded: { - function: 'upgrade(address,address)', - args: { - proxy: proxyAddress, - implementation: pendingImpl, + builder.addTx( + { to: proxyAdminAddress, value: '0', data: upgradeData }, + { + toLabel: 'GraphProxyAdmin', + contractName, + decoded: { + function: 'upgrade(address,address)', + args: { proxy: proxyAddress, implementation: pendingImpl }, }, + notes: 'Graph legacy proxy upgrade (step 1/2: set pending implementation)', }, - notes: 'Graph legacy proxy upgrade (step 1/2: set pending implementation)', - } - builder.addTx({ to: proxyAdminAddress, value: '0', data: upgradeData }, upgradeMetadata) - - const acceptMetadata: TxMetadata = { - toLabel: 'GraphProxyAdmin', - contractName, - decoded: { - function: 'acceptProxy(address,address)', - args: { - implementation: pendingImpl, - proxy: proxyAddress, + ) + builder.addTx( + { to: proxyAdminAddress, value: '0', data: acceptData }, + { + toLabel: 'GraphProxyAdmin', + contractName, + decoded: { + function: 'acceptProxy(address,address)', + args: { implementation: pendingImpl, proxy: proxyAddress }, }, - }, - stateChanges: { - [`${contractName} implementation`]: { - current: currentImpl, - new: pendingImpl, + stateChanges: { + [`${contractName} implementation`]: { current: currentImpl, new: pendingImpl }, }, + notes: 'Graph legacy proxy upgrade (step 2/2: accept and activate)', }, - notes: 'Graph legacy proxy upgrade (step 2/2: accept and activate)', - } - builder.addTx({ to: proxyAdminAddress, value: '0', data: acceptData }, acceptMetadata) + ) } - const txFile = builder.saveToFile() - env.showMessage(` ✓ Governance TX saved: ${txFile}`) - env.showMessage(` Run: npx hardhat deploy:execute-governance --network ${env.name}`) + return { upgraded: true } +} + +/** + * Upgrade an implementation via governance TX (registry-driven) + * + * Generates a governance TX batch file for a single contract upgrade, then exits. + * For batch upgrades (multiple contracts in one TX batch), use `buildUpgradeTxs` instead. + * + * @example Registry-driven with Contracts object (recommended): + * ```typescript + * import { Contracts } from '../../lib/contract-registry.js' + * await upgradeImplementation(env, Contracts.horizon.RewardsManager) + * await upgradeImplementation(env, Contracts["subgraph-service"].SubgraphService) + * await upgradeImplementation(env, Contracts.issuance.ReclaimedRewards, { + * implementationName: 'DirectAllocation', // Upgrade to different implementation + * }) + * ``` + */ +export async function upgradeImplementation( + env: Environment, + entryOrConfig: RegistryEntry | ImplementationUpgradeConfig, + overrides?: ImplementationUpgradeOverrides, +): Promise { + const config: ImplementationUpgradeConfig = + 'name' in entryOrConfig ? createUpgradeConfigFromRegistry(entryOrConfig, overrides) : entryOrConfig + + const builder = await createGovernanceTxBuilder(env, `upgrade-${config.contractName}`, { + name: `${config.contractName} Upgrade`, + description: `Upgrade ${config.contractName} proxy to new implementation`, + }) + + env.showMessage(`\n🔧 Upgrading ${config.contractName}...`) + const { upgraded } = await buildUpgradeTxs(env, entryOrConfig, builder, overrides) + + if (!upgraded) { + env.showMessage(`\n✓ No pending ${config.contractName} implementation to upgrade`) + return { upgraded: false, executed: false } + } - // Exit to prevent subsequent deployment steps until governance TX is executed - process.exit(1) + saveGovernanceTx(env, builder, `${config.contractName} upgrade`) + return { upgraded: true, executed: false } } diff --git a/packages/deployment/package.json b/packages/deployment/package.json index fc4a55ad2..9cd1d0e5f 100644 --- a/packages/deployment/package.json +++ b/packages/deployment/package.json @@ -4,9 +4,11 @@ "description": "Unified deployment for Graph Protocol contracts", "private": true, "scripts": { - "build": "pnpm build:deps", + "build": "pnpm build:deps && pnpm build:self", + "build:self": "pnpm generate:abis", "build:deps": "pnpm --filter @graphprotocol/deployment^... build", "build:clean": "pnpm --filter @graphprotocol/contracts clean && pnpm build:deps", + "generate:abis": "tsx scripts/generate-abis.ts", "deploy": "pnpm build:clean && hardhat deploy", "deploy:sync": "hardhat deploy --tags sync", "deploy:status": "hardhat deploy:deployment-status", @@ -21,6 +23,7 @@ "dependencies": { "@graphprotocol/contracts": "workspace:*", "@graphprotocol/horizon": "workspace:*", + "@graphprotocol/interfaces": "workspace:*", "@graphprotocol/issuance": "workspace:*", "@graphprotocol/subgraph-service": "workspace:*", "@graphprotocol/toolshed": "workspace:*", @@ -48,6 +51,7 @@ "@types/node": "^20.0.0", "chai": "^4.3.0", "hardhat-deploy": "2.0.0-next.61", + "json5": "^2.2.3", "mocha": "^10.7.0", "rocketh": "^0.17.13", "tsx": "^4.19.0", diff --git a/packages/deployment/rocketh/config.ts b/packages/deployment/rocketh/config.ts index 44bcb4fd6..e0ef1b47b 100644 --- a/packages/deployment/rocketh/config.ts +++ b/packages/deployment/rocketh/config.ts @@ -17,8 +17,14 @@ export const accounts = { deployer: { default: 0, }, - // Note: Governor address is queried from Controller contract via Controller.getGovernor() - // See lib/controller-utils.ts for helper functions + // Governor — second mnemonic account on local/test networks. + // On mainnet, governance is a multisig (not available via mnemonic). + // The on-chain source of truth is Controller.getGovernor() — see lib/controller-utils.ts. + // This named account exists so rocketh registers a signer, allowing deploy + // scripts to send TXs as governor via tx(). + governor: { + default: 1, + }, } as const satisfies UserConfig['accounts'] // Network-specific data (can be extended as needed) @@ -33,6 +39,14 @@ const hardhatLocalChain: ChainInfo = { testnet: true, } +const graphLocalNetworkChain: ChainInfo = { + id: 1337, + name: 'Graph Local Network', + nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 }, + rpcUrls: { default: { http: ['http://chain:8545'] } }, + testnet: true, +} + const arbitrumSepoliaChain: ChainInfo = { id: 421614, name: 'Arbitrum Sepolia', @@ -58,6 +72,7 @@ export const config: UserConfig = { deployments: 'deployments', scripts: ['deploy'], chains: { + 1337: { info: graphLocalNetworkChain }, 31337: { info: hardhatLocalChain }, 421614: { info: arbitrumSepoliaChain }, 42161: { info: arbitrumOneChain }, @@ -68,6 +83,7 @@ export const config: UserConfig = { hardhat: { chain: 31337 }, localhost: { chain: 31337 }, fork: { chain: 31337 }, + localNetwork: { chain: 1337 }, arbitrumSepolia: { chain: 421614 }, arbitrumOne: { chain: 42161 }, }, diff --git a/packages/deployment/rocketh/deploy.ts b/packages/deployment/rocketh/deploy.ts index c3c86f230..384150c88 100644 --- a/packages/deployment/rocketh/deploy.ts +++ b/packages/deployment/rocketh/deploy.ts @@ -6,6 +6,7 @@ import { execute, read, tx } from '@rocketh/read-execute' import { createPublicClient, custom } from 'viem' import { + autoDetectForkNetwork, getForkTargetChainId, getHorizonAddressBook, getIssuanceAddressBook, @@ -16,9 +17,9 @@ import { import { accounts, data } from './config.js' /** - * Options for updating issuance address book after deployment + * Options for updating an address book after deployment */ -export interface IssuanceDeploymentUpdate { +export interface DeploymentUpdate { /** Contract name in the address book */ name: string /** Deployed address (proxy address if proxied) */ @@ -29,10 +30,15 @@ export interface IssuanceDeploymentUpdate { implementation?: string /** Proxy type if this is a proxied contract */ proxy?: 'transparent' | 'graph' - /** Implementation deployment metadata (for verification) */ + /** Implementation deployment metadata (for verification of proxied contracts) */ implementationDeployment?: DeploymentMetadata + /** Deployment metadata (for verification of non-proxied contracts) */ + deployment?: DeploymentMetadata } +/** @deprecated Use DeploymentUpdate */ +export type IssuanceDeploymentUpdate = DeploymentUpdate + /** * Graph Protocol deployment helpers * @@ -56,6 +62,13 @@ export interface IssuanceDeploymentUpdate { * ``` */ export const graph = { + /** + * Auto-detect fork network by querying anvil. + * Call at the top of any task that needs fork awareness. + * No-op if FORK_NETWORK is already set or node isn't an anvil fork. + */ + autoDetect: () => autoDetectForkNetwork(), + /** * Get a viem public client for on-chain queries */ @@ -90,6 +103,42 @@ export const graph = { */ getIssuanceAddressBook: (chainId?: number) => getIssuanceAddressBook(chainId), + /** + * Update horizon address book after deploying a contract. + * Supports both standalone and proxied contracts. + * + * @param env - Rocketh environment (used to get chain ID from provider) + * @param update - Deployment update details + */ + updateHorizonAddressBook: async (env: Environment, update: DeploymentUpdate) => { + const chainId = await getTargetChainIdFromEnv(env) + const addressBook = getHorizonAddressBook(chainId) + + if (update.proxy) { + addressBook.setProxy( + update.name as Parameters[0], + update.address, + update.implementation!, + update.proxyAdmin!, + update.proxy, + ) + if (update.implementationDeployment) { + addressBook.setImplementationDeploymentMetadata( + update.name as Parameters[0], + update.implementationDeployment, + ) + } + } else { + addressBook.setContract(update.name as Parameters[0], update.address) + if (update.deployment) { + addressBook.setDeploymentMetadata( + update.name as Parameters[0], + update.deployment, + ) + } + } + }, + /** * Update issuance address book after deploying a contract. * Call this after rocketh's deployViaProxy or deploy to sync the address book. @@ -118,6 +167,12 @@ export const graph = { } } else { addressBook.setContract(update.name as Parameters[0], update.address) + if (update.deployment) { + addressBook.setDeploymentMetadata( + update.name as Parameters[0], + update.deployment, + ) + } } }, } diff --git a/packages/deployment/scripts/check-bytecode.ts b/packages/deployment/scripts/check-bytecode.ts new file mode 100644 index 000000000..9d9178b2a --- /dev/null +++ b/packages/deployment/scripts/check-bytecode.ts @@ -0,0 +1,54 @@ +import { createPublicClient, http } from 'viem' + +import { loadSubgraphServiceArtifact } from '../lib/artifact-loaders.js' +import { computeBytecodeHash } from '../lib/bytecode-utils.js' +import { graph } from '../rocketh/deploy.js' + +async function main() { + const chainId = 421614 // arbitrumSepolia + + // Get address book + const addressBook = graph.getSubgraphServiceAddressBook(chainId) + const entry = addressBook.getEntry('SubgraphService') + const deploymentMetadata = addressBook.getDeploymentMetadata('SubgraphService') + + console.log('\n📋 SubgraphService Bytecode Analysis\n') + console.log('Proxy address:', entry.address) + console.log('Current implementation:', entry.implementation) + console.log('Pending implementation:', entry.pendingImplementation?.address ?? 'none') + + // Get local artifact + const artifact = loadSubgraphServiceArtifact('SubgraphService') + const localHash = computeBytecodeHash(artifact.deployedBytecode ?? '0x') + console.log('\nLocal artifact bytecode hash:', localHash) + + // Get address book stored hash + console.log('Address book stored hash:', deploymentMetadata?.bytecodeHash ?? '(none)') + + // Get on-chain bytecode + const client = createPublicClient({ + transport: http('https://sepolia-rollup.arbitrum.io/rpc'), + }) + + const onChainBytecode = await client.getCode({ + address: entry.implementation as `0x${string}`, + }) + + if (onChainBytecode && onChainBytecode !== '0x') { + const onChainHash = computeBytecodeHash(onChainBytecode) + console.log('On-chain implementation hash:', onChainHash) + + console.log('\n🔍 Comparison:') + console.log( + 'Local vs Address Book:', + localHash === (deploymentMetadata?.bytecodeHash ?? '') ? '✓ MATCH' : '✗ DIFFERENT', + ) + console.log('Local vs On-chain:', localHash === onChainHash ? '✓ MATCH' : '✗ DIFFERENT') + console.log( + 'Address Book vs On-chain:', + (deploymentMetadata?.bytecodeHash ?? '') === onChainHash ? '✓ MATCH' : '✗ DIFFERENT (or missing)', + ) + } +} + +main().catch(console.error) diff --git a/packages/deployment/scripts/check-rocketh-bytecode.ts b/packages/deployment/scripts/check-rocketh-bytecode.ts new file mode 100644 index 000000000..aff8f394a --- /dev/null +++ b/packages/deployment/scripts/check-rocketh-bytecode.ts @@ -0,0 +1,34 @@ +import { readFileSync } from 'fs' + +import { loadSubgraphServiceArtifact } from '../lib/artifact-loaders.js' +import { computeBytecodeHash } from '../lib/bytecode-utils.js' + +async function main() { + console.log('\n📋 Rocketh vs Local Artifact Comparison\n') + + // Get local artifact + const artifact = loadSubgraphServiceArtifact('SubgraphService') + const localHash = computeBytecodeHash(artifact.deployedBytecode ?? '0x') + console.log('Local artifact hash:', localHash) + + // Check rocketh stored bytecode + try { + const rockethPath = '.rocketh/deployments/arbitrumSepolia/SubgraphService_Implementation.json' + const rockethData = JSON.parse(readFileSync(rockethPath, 'utf-8')) + + if (rockethData.deployedBytecode) { + const rockethHash = computeBytecodeHash(rockethData.deployedBytecode) + console.log('Rocketh stored hash:', rockethHash) + console.log( + '\nComparison:', + localHash === rockethHash ? '✓ MATCH (deploy will skip)' : '✗ DIFFERENT (deploy will redeploy)', + ) + } else { + console.log('Rocketh stored hash: (no deployedBytecode)') + } + } catch { + console.log('Rocketh record:', 'not found') + } +} + +main().catch(console.error) diff --git a/packages/deployment/scripts/debug-deploy-state.ts b/packages/deployment/scripts/debug-deploy-state.ts new file mode 100644 index 000000000..6267734f2 --- /dev/null +++ b/packages/deployment/scripts/debug-deploy-state.ts @@ -0,0 +1,27 @@ +import { loadSubgraphServiceArtifact } from '../lib/artifact-loaders.js' +import { computeBytecodeHash } from '../lib/bytecode-utils.js' + +async function main() { + console.log('\n📋 Investigating Deploy "Unchanged" Message\n') + + // The deploy script checks env.getOrNull('SubgraphService_Implementation') + // But rocketh state is in-memory during deploy runs + // We can't easily check that without running deploy + + // What we CAN check is: + // 1. If sync step would have synced the implementation + // 2. The actual bytecode hashes + + const artifact = loadSubgraphServiceArtifact('SubgraphService') + const localHash = computeBytecodeHash(artifact.deployedBytecode ?? '0x') + + console.log('Local artifact bytecode hash:', localHash) + console.log('\n⚠️ The issue:') + console.log('1. Sync shows "code changed" because address book has different/missing hash') + console.log('2. Deploy says "unchanged" - this suggests rocketh has the implementation') + console.log('3. But local bytecode IS different from on-chain') + console.log('\nThis means deploy will NOT deploy the new implementation!') + console.log('The local changes will be ignored.\n') +} + +main().catch(console.error) diff --git a/packages/deployment/scripts/generate-abis.ts b/packages/deployment/scripts/generate-abis.ts new file mode 100644 index 000000000..f4ac49a14 --- /dev/null +++ b/packages/deployment/scripts/generate-abis.ts @@ -0,0 +1,264 @@ +/** + * ABI Codegen Script + * + * Generates typed `as const` ABI exports from the contract registry. + * Reads interface declarations and artifact sources from the registry, + * resolves them to JSON artifacts, and writes a generated TypeScript file. + * + * Usage: tsx scripts/generate-abis.ts + */ + +import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs' +import { createRequire } from 'node:module' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' + +import { toFunctionSelector } from 'viem' + +import { CONTRACT_REGISTRY, type ContractMetadata, type InterfaceAbiConfig } from '../lib/contract-registry.js' + +const require = createRequire(import.meta.url) +const __dirname = dirname(fileURLToPath(import.meta.url)) +const OUTPUT_DIR = join(__dirname, '..', 'lib', 'generated') +const OUTPUT_FILE = join(OUTPUT_DIR, 'abis.ts') + +// --------------------------------------------------------------------------- +// Utility ABIs — not tied to any registry entry +// --------------------------------------------------------------------------- + +const UTILITY_ABIS: Array<{ name: string; artifactPath: string }> = [ + { + name: 'IERC165_ABI', + artifactPath: '@graphprotocol/interfaces/artifacts/@openzeppelin/contracts/introspection/IERC165.sol/IERC165.json', + }, + { + name: 'ISSUANCE_TARGET_ABI', + artifactPath: + '@graphprotocol/interfaces/artifacts/contracts/issuance/allocate/IIssuanceTarget.sol/IIssuanceTarget.json', + }, + { + name: 'OZ_PROXY_ADMIN_ABI', + artifactPath: + '@graphprotocol/horizon/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json', + }, +] + +// Alias re-exports (source export name → alias export name) +const ABI_ALIASES: Array<{ source: string; alias: string }> = [ + { source: 'ISSUANCE_ALLOCATOR_ABI', alias: 'SET_TARGET_ALLOCATION_ABI' }, + { source: 'DIRECT_ALLOCATION_ABI', alias: 'INITIALIZE_GOVERNOR_ABI' }, +] + +// Interface IDs to extract (export name → interface name used in ABI_SOURCES or registry) +// Derived from registry interfaces + utility ABIs +const INTERFACE_IDS: Array<{ name: string; abiExportName: string }> = [ + { name: 'IERC165_INTERFACE_ID', abiExportName: 'IERC165_ABI' }, + { name: 'IISSUANCE_TARGET_INTERFACE_ID', abiExportName: 'ISSUANCE_TARGET_ABI' }, + { name: 'IREWARDS_MANAGER_INTERFACE_ID', abiExportName: 'REWARDS_MANAGER_ABI' }, +] + +// --------------------------------------------------------------------------- +// Interface artifact discovery +// --------------------------------------------------------------------------- + +/** + * Build an index of interface name → artifact path by scanning the + * @graphprotocol/interfaces artifacts directory. + */ +function buildInterfaceIndex(): Map { + const index = new Map() + + // Resolve the interfaces package artifacts root + // Use a known artifact to locate the package, then walk up + const knownArtifact = + require.resolve('@graphprotocol/interfaces/artifacts/contracts/contracts/rewards/IRewardsManager.sol/IRewardsManager.json') + // Walk up to find the 'artifacts' directory + let artifactsRoot = dirname(knownArtifact) + while (!artifactsRoot.endsWith('/artifacts') && artifactsRoot !== '/') { + artifactsRoot = dirname(artifactsRoot) + } + + // Recursively scan for JSON files + function scan(dir: string): void { + for (const entry of readdirSync(dir)) { + const full = join(dir, entry) + if (entry === 'build-info') continue + if (statSync(full).isDirectory()) { + scan(full) + } else if (entry.endsWith('.json') && !entry.endsWith('.dbg.json')) { + // Extract interface name from filename (e.g. IRewardsManager.json → IRewardsManager) + const name = entry.replace('.json', '') + // Store as package-relative path for require.resolve + const relativePath = full.slice(full.indexOf('/artifacts/') + 1) + index.set(name, `@graphprotocol/interfaces/${relativePath}`) + } + } + } + + scan(artifactsRoot) + return index +} + +// --------------------------------------------------------------------------- +// Artifact loading +// --------------------------------------------------------------------------- + +type AbiEntry = Record + +function loadAbiFromArtifact(artifactPath: string): AbiEntry[] { + const resolved = require.resolve(artifactPath) + const artifact = JSON.parse(readFileSync(resolved, 'utf-8')) + return artifact.abi +} + +/** + * Resolve artifact path for a generateAbi entry based on its ArtifactSource. + */ +function resolveContractArtifactPath(artifact: { type: string; path?: string; name?: string }): string { + switch (artifact.type) { + case 'contracts': + return `@graphprotocol/contracts/artifacts/contracts/${artifact.path}/${artifact.name}.sol/${artifact.name}.json` + case 'subgraph-service': { + const baseName = (artifact.name ?? '').includes('/') ? (artifact.name ?? '').split('/').pop()! : artifact.name + return `@graphprotocol/subgraph-service/artifacts/contracts/${artifact.name}.sol/${baseName}.json` + } + case 'horizon': + return `@graphprotocol/horizon/artifacts/${artifact.path}.json` + case 'issuance': + return `@graphprotocol/issuance/artifacts/${artifact.path}.json` + case 'openzeppelin': + return `@openzeppelin/contracts/build/contracts/${artifact.name}.json` + default: + throw new Error(`Unknown artifact type: ${artifact.type}`) + } +} + +// --------------------------------------------------------------------------- +// Interface ID calculation +// --------------------------------------------------------------------------- + +/** + * Calculate ERC-165 interface ID from an ABI. + * The interface ID is XOR of all function selectors. + */ +function calculateInterfaceId(abi: AbiEntry[]): string { + const functions = abi.filter((entry) => entry.type === 'function') + if (functions.length === 0) return '0x00000000' + + let id = BigInt(0) + for (const fn of functions) { + const inputs = (fn.inputs as Array<{ type: string }>) ?? [] + const sig = `${fn.name}(${inputs.map((i) => i.type).join(',')})` + const selector = toFunctionSelector(sig) + id ^= BigInt(selector) + } + + return '0x' + id.toString(16).padStart(8, '0') +} + +// --------------------------------------------------------------------------- +// Code generation +// --------------------------------------------------------------------------- + +function formatAbiEntry(entry: AbiEntry, indent: string): string { + return `${indent}${JSON.stringify(entry)}` +} + +function generateAbiExport(name: string, abi: AbiEntry[]): string { + const entries = abi.map((entry) => formatAbiEntry(entry, ' ')).join(',\n') + return `export const ${name} = [\n${entries},\n] as const\n` +} + +function main(): void { + const verbose = process.argv.includes('--verbose') + + const interfaceIndex = buildInterfaceIndex() + const abiMap = new Map() + const lines: string[] = [ + '/**', + ' * Auto-generated typed ABI exports', + ' *', + ' * DO NOT EDIT — regenerate with: pnpm generate:abis', + ' */', + '', + ] + + // 1. Walk registry for interface ABIs + for (const [bookName, book] of Object.entries(CONTRACT_REGISTRY)) { + for (const [contractName, rawMeta] of Object.entries(book)) { + const meta = rawMeta as ContractMetadata + // Interface ABIs + if (meta.interfaces) { + for (const iface of meta.interfaces as readonly InterfaceAbiConfig[]) { + const artifactPath = interfaceIndex.get(iface.interface) + if (!artifactPath) { + throw new Error( + `Interface "${iface.interface}" not found in @graphprotocol/interfaces artifacts ` + + `(referenced by ${bookName}.${contractName})`, + ) + } + const abi = loadAbiFromArtifact(artifactPath) + abiMap.set(iface.name, abi) + if (verbose) console.log(` ${iface.name} ← ${iface.interface} (${abi.length} entries)`) + } + } + + // Full contract ABI + if (meta.generateAbi && meta.artifact) { + const exportName = meta.generateAbi as string + const artifactPath = resolveContractArtifactPath( + meta.artifact as { type: string; path?: string; name?: string }, + ) + const abi = loadAbiFromArtifact(artifactPath) + abiMap.set(exportName, abi) + if (verbose) console.log(` ${exportName} ← ${contractName} (${abi.length} entries)`) + } + } + } + + // 2. Utility ABIs + for (const util of UTILITY_ABIS) { + const abi = loadAbiFromArtifact(util.artifactPath) + abiMap.set(util.name, abi) + if (verbose) console.log(` ${util.name} ← utility (${abi.length} entries)`) + } + + // 3. Generate ABI exports + for (const [name, abi] of abiMap) { + lines.push(generateAbiExport(name, abi)) + } + + // 4. Alias re-exports + for (const { source, alias } of ABI_ALIASES) { + if (!abiMap.has(source)) { + throw new Error(`Alias source "${source}" not found in generated ABIs`) + } + lines.push(`export { ${source} as ${alias} }\n`) + if (verbose) console.log(` ${alias} → ${source}`) + } + + // 5. Interface IDs + lines.push('// Interface IDs (computed from ABI function selectors)') + for (const { name, abiExportName } of INTERFACE_IDS) { + const abi = abiMap.get(abiExportName) + if (!abi) { + throw new Error(`ABI "${abiExportName}" not found for interface ID "${name}"`) + } + const id = calculateInterfaceId(abi) + lines.push(`export const ${name} = '${id}' as const`) + if (verbose) console.log(` ${name} = ${id}`) + } + lines.push('') + + // Write output + if (!existsSync(OUTPUT_DIR)) { + mkdirSync(OUTPUT_DIR, { recursive: true }) + } + writeFileSync(OUTPUT_FILE, lines.join('\n')) + + console.log( + `Generated ${abiMap.size} ABIs, ${ABI_ALIASES.length} aliases, ${INTERFACE_IDS.length} interface IDs → lib/generated/abis.ts`, + ) +} + +main() diff --git a/packages/deployment/scripts/tag-deployment.sh b/packages/deployment/scripts/tag-deployment.sh index a6c5f8838..3e05e28a9 100755 --- a/packages/deployment/scripts/tag-deployment.sh +++ b/packages/deployment/scripts/tag-deployment.sh @@ -271,8 +271,7 @@ fi # --- Build annotation --- ANNOTATION="network: ${DISPLAY} (${CHAIN_ID}) -deployed-by: ${DEPLOYER} -commit: ${COMMIT_SHA}" +deployed-by: ${DEPLOYER}" if [[ -n "$UPGRADE_NAME" ]]; then ANNOTATION="upgrade: ${UPGRADE_NAME} ${ANNOTATION}" diff --git a/packages/deployment/tasks/check-deployer.ts b/packages/deployment/tasks/check-deployer.ts index d28eba36c..275568ad0 100644 --- a/packages/deployment/tasks/check-deployer.ts +++ b/packages/deployment/tasks/check-deployer.ts @@ -1,47 +1,15 @@ -import { configVariable, task } from 'hardhat/config' +import { task } from 'hardhat/config' import type { NewTaskActionFunction } from 'hardhat/types/tasks' import { createPublicClient, custom, formatEther } from 'viem' import { privateKeyToAccount } from 'viem/accounts' +import { networkToEnvPrefix, resolveConfigVar } from '../lib/task-utils.js' + const BLOCK_EXPLORERS: Record = { 42161: 'https://arbiscan.io/address/', 421614: 'https://sepolia.arbiscan.io/address/', } -/** - * Convert network name to env var prefix: arbitrumSepolia → ARBITRUM_SEPOLIA - */ -function networkToEnvPrefix(networkName: string): string { - return networkName.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase() -} - -/** - * Resolve a configuration variable using Hardhat's hook chain (keystore + env fallback) - */ -async function resolveConfigVar(hre: unknown, name: string): Promise { - try { - const variable = configVariable(name) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const hooks = (hre as any).hooks - - const value = await hooks.runHandlerChain( - 'configurationVariables', - 'fetchValue', - [variable], - async (_context: unknown, v: { name: string }) => { - const envValue = process.env[v.name] - if (typeof envValue !== 'string') { - throw new Error(`Variable ${v.name} not found`) - } - return envValue - }, - ) - return value - } catch { - return undefined - } -} - interface TaskArgs { // No arguments for this task } diff --git a/packages/deployment/tasks/deployment-status.ts b/packages/deployment/tasks/deployment-status.ts index 8b5994f0d..373c0d9d4 100644 --- a/packages/deployment/tasks/deployment-status.ts +++ b/packages/deployment/tasks/deployment-status.ts @@ -1,27 +1,20 @@ import { task } from 'hardhat/config' import { ArgumentType } from 'hardhat/types/arguments' import type { NewTaskActionFunction } from 'hardhat/types/tasks' -import { createPublicClient, custom, type PublicClient } from 'viem' +import { createPublicClient, custom, http, type PublicClient } from 'viem' -import { - IISSUANCE_TARGET_INTERFACE_ID, - IREWARDS_MANAGER_INTERFACE_ID, - ISSUANCE_ALLOCATOR_ABI, - REWARDS_ELIGIBILITY_ORACLE_ABI, - REWARDS_MANAGER_ABI, -} from '../lib/abis.js' -import type { AddressBookOps } from '../lib/address-book-ops.js' -import { - checkIssuanceAllocatorActivation, - checkOperatorRole, - getReclaimAddress, - RECLAIM_CONTRACT_NAMES, - RECLAIM_REASONS, - type ReclaimReasonKey, - supportsInterface, -} from '../lib/contract-checks.js' +import { CONTROLLER_ABI } from '../lib/abis.js' +import { autoDetectForkNetwork } from '../lib/address-book-utils.js' +import { formatAddress } from '../lib/contract-checks.js' import { type AddressBookType, getContractsByAddressBook } from '../lib/contract-registry.js' -import { getContractStatusLine } from '../lib/sync-utils.js' +import { + getIssuanceAllocatorChecks, + getReclaimAddressChecks, + getRewardsEligibilityOracleChecks, + getRewardsManagerChecks, + type IntegrationCheck, +} from '../lib/status-detail.js' +import { getContractStatusLine, type ProxyAdminOwnershipContext } from '../lib/sync-utils.js' import { graph } from '../rocketh/deploy.js' /** Get deployable contract names for an address book (requires explicit deployable: true) */ @@ -31,14 +24,97 @@ function getDeployableContracts(addressBook: AddressBookType): string[] { .map(([name]) => name) } -/** Integration check result */ -interface IntegrationCheck { - ok: boolean | null // null = not applicable / not deployed - label: string +/** + * Get non-deployable contract names for an address book. + * + * Includes prerequisites (`prerequisite: true`), address-only entries + * (`addressOnly: true`) and pure registry placeholders (`{}`). The status task + * surfaces these as context — they're contracts the deployment depends on but + * doesn't manage. Entries not present in the on-chain address book are filtered + * out at print time so the listing only shows what actually exists for the + * network. + */ +function getPrerequisiteContracts(addressBook: AddressBookType): string[] { + return getContractsByAddressBook(addressBook) + .filter(([_, meta]) => meta.deployable !== true) + .map(([name]) => name) +} + +function printCheck(check: IntegrationCheck): void { + const icon = check.ok === null ? '○' : check.ok ? '✓' : '✗' + console.log(` ${icon} ${check.label}`) +} + +function printWarnings(warnings: string[] | undefined): void { + if (!warnings) return + for (const warning of warnings) { + console.log(` ⚠ ${warning}`) + } +} + +/** Print proxy admin detail in verbose/component mode */ +function printProxyAdminDetail(result: { + proxyAdminOwner?: string + proxyAdminAddress?: string + proxyAdminOwnerAddress?: string +}): void { + if (!result.proxyAdminAddress) return + const ownerLabel = + result.proxyAdminOwner === 'governor' + ? 'governor ✓' + : result.proxyAdminOwner === 'deployer' + ? 'deployer ⚠' + : 'not governor ⚠' + const ownerAddr = result.proxyAdminOwnerAddress ? ` ${result.proxyAdminOwnerAddress}` : '' + console.log(` ProxyAdmin: ${result.proxyAdminAddress}`) + console.log(` ProxyAdmin owner:${ownerAddr} (${ownerLabel})`) +} + +/** + * Print prerequisite contracts (non-deployable registry entries) in a dim format. + * + * Shown after the deployable contracts in each address book section. Skips + * entries that aren't present in the address book — placeholders that are in + * the registry for type completeness but aren't configured for the network are + * silent rather than printed as `(not deployed)`. + * + * In default mode each entry is one line: `· Name @ 0x1234...5678`. In + * verbose mode the full `getContractStatusLine` output is shown so users can + * drill into proxy detail for prerequisites that have it. + */ +async function printPrerequisites( + client: PublicClient | undefined, + addressBookType: AddressBookType, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + addressBook: any, + matchesComponent: (name: string) => boolean, + verbose: boolean, + ownershipCtx: ProxyAdminOwnershipContext | undefined, +): Promise { + const names = getPrerequisiteContracts(addressBookType).filter(matchesComponent) + // Filter to entries actually present in the address book — placeholders that + // aren't configured for this network shouldn't add noise. + const present = names.filter((name) => addressBook.entryExists(name)) + if (present.length === 0) return + + for (const name of present) { + if (verbose) { + const result = await getContractStatusLine(client, addressBookType, addressBook, name, undefined, ownershipCtx) + console.log(` · ${result.line}`) + printWarnings(result.warnings) + printProxyAdminDetail(result) + } else { + const entry = addressBook.getEntry(name) + const addr = entry?.address ? formatAddress(entry.address) : '(no address)' + console.log(` · ${name} @ ${addr}`) + } + } } interface TaskArgs { package: string + verbose: boolean + component: string } const action: NewTaskActionFunction = async (taskArgs, hre) => { @@ -47,25 +123,82 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { const conn = await (hre as any).network.connect() const networkName = conn.networkName const packageFilter = taskArgs.package.toLowerCase() + const verbose = taskArgs.verbose + const componentFilter = taskArgs.component?.toLowerCase() || '' + const showDetail = verbose || !!componentFilter + + // Get configured chain ID from network config (always available) + const configuredChainId = conn.networkConfig?.chainId as number | undefined + + // Default RPC URLs for read-only access (no accounts needed) + const DEFAULT_RPC_URLS: Record = { + arbitrumOne: 'https://arb1.arbitrum.io/rpc', + arbitrumSepolia: 'https://sepolia-rollup.arbitrum.io/rpc', + } + + // Get RPC URL: prefer env var, then default + const envRpcUrl = + networkName === 'arbitrumSepolia' + ? process.env.ARBITRUM_SEPOLIA_RPC + : networkName === 'arbitrumOne' + ? process.env.ARBITRUM_ONE_RPC + : undefined + const rpcUrl = envRpcUrl || DEFAULT_RPC_URLS[networkName] // Get viem public client for on-chain checks + // Use direct HTTP transport to RPC URL (bypasses Hardhat's account resolution) let client: PublicClient | undefined let actualChainId: number | undefined - try { - if (conn.provider) { + let providerError: string | undefined + + if (rpcUrl) { + // Create read-only client directly to RPC (no accounts needed) + try { client = createPublicClient({ - transport: custom(conn.provider), + transport: http(rpcUrl), }) as PublicClient actualChainId = await client.getChainId() + } catch (e) { + client = undefined + const errMsg = e instanceof Error ? e.message : String(e) + providerError = errMsg.split('\n')[0] + } + } else { + // No RPC URL available - try Hardhat's provider (may fail if accounts not configured) + try { + if (conn.provider) { + client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + actualChainId = await client.getChainId() + } + } catch (e) { + // Provider failed - disable on-chain checks + client = undefined + + // Extract error message (may be nested in viem error or cause chain) + let errMsg = e instanceof Error ? e.message : String(e) + const cause = e instanceof Error ? (e as Error & { cause?: Error }).cause : undefined + if (cause?.message) { + errMsg = cause.message + } + + providerError = errMsg.split('\n')[0] + } + } + + // Auto-detect fork network from anvil if on localhost without FORK_NETWORK + if (configuredChainId === 31337 && !process.env.FORK_NETWORK && !process.env.HARDHAT_FORK) { + const detected = await autoDetectForkNetwork() + if (detected) { + console.log(`🔍 Auto-detected fork network: ${detected}`) } - } catch { - // Provider not available } - // Determine target chain ID: use actual chain ID when not in fork mode + // Determine target chain ID: use fork target, then configured, then actual, then fallback const forkChainId = graph.getForkTargetChainId() const isForkMode = forkChainId !== null - const targetChainId = forkChainId ?? actualChainId ?? 31337 + const targetChainId = forkChainId ?? configuredChainId ?? actualChainId ?? 31337 // Show status header with chain info if (isForkMode) { @@ -75,7 +208,13 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { console.log(`⚠️ Warning: Connected chain (${actualChainId}) differs from target (${targetChainId})`) console.log(` Address book lookups use chainId ${targetChainId}\n`) } else { - console.log(`\n🔍 Status: ${networkName} (chainId: ${actualChainId ?? targetChainId})\n`) + console.log(`\n🔍 Status: ${networkName} (chainId: ${targetChainId})\n`) + } + + // Show provider warning if we couldn't connect (but continue with address book lookups) + if (providerError) { + console.log(`⚠️ Provider unavailable: ${providerError}`) + console.log(` On-chain checks disabled. Set the missing variable or use --network hardhat for local testing.\n`) } // Get address books @@ -83,324 +222,180 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { const subgraphServiceAddressBook = graph.getSubgraphServiceAddressBook(targetChainId) const issuanceAddressBook = graph.getIssuanceAddressBook(targetChainId) - // Horizon contracts (deploy targets only) - if (packageFilter === 'all' || packageFilter === 'horizon') { - console.log('📦 Horizon') - for (const name of getDeployableContracts('horizon')) { - const result = await getContractStatusLine(client, 'horizon', horizonAddressBook, name) - console.log(` ${result.line}`) - printWarnings(result.warnings) - - // Integration checks for RewardsManager (only if deployed) - if (name === 'RewardsManager' && client && result.exists) { - const checks = await getRewardsManagerChecks(client, horizonAddressBook) - for (const check of checks) { - printCheck(check) + // Resolve governor/deployer for proxy admin ownership checks + let ownershipCtx: ProxyAdminOwnershipContext | undefined + if (client) { + try { + const controllerAddress = horizonAddressBook.entryExists('Controller') + ? horizonAddressBook.getEntry('Controller')?.address + : null + if (controllerAddress) { + const governor = (await client.readContract({ + address: controllerAddress as `0x${string}`, + abi: CONTROLLER_ABI, + functionName: 'getGovernor', + })) as string + + if (governor) { + // Deployer is best-effort: available when provider has accounts (fork/local) + let deployer: string | undefined + try { + const accounts = (await conn.provider?.request({ method: 'eth_accounts' })) as string[] | undefined + if (accounts && accounts.length > 0) { + deployer = accounts[0] + } + } catch { + // No accounts available (read-only provider) — that's fine + } + ownershipCtx = { governor, deployer } } } + } catch { + // Controller not available — skip ownership checks } } - // SubgraphService contracts - if (packageFilter === 'all' || packageFilter === 'subgraph-service') { - console.log('\n📦 SubgraphService') - for (const name of getDeployableContracts('subgraph-service')) { - const result = await getContractStatusLine(client, 'subgraph-service', subgraphServiceAddressBook, name) - console.log(` ${result.line}`) - printWarnings(result.warnings) + // Helper to check if a contract name matches the component filter + const matchesComponent = (name: string) => !componentFilter || name.toLowerCase().includes(componentFilter) + + // Show ownership context in verbose mode + if (verbose && ownershipCtx) { + console.log(` Governor: ${ownershipCtx.governor}`) + if (ownershipCtx.deployer) { + console.log(` Deployer: ${ownershipCtx.deployer}`) } + console.log() } - // Issuance contracts - if (packageFilter === 'all' || packageFilter === 'issuance') { - console.log('\n📦 Issuance') - for (const name of getDeployableContracts('issuance')) { - const result = await getContractStatusLine(client, 'issuance', issuanceAddressBook, name) - console.log(` ${result.line}`) - printWarnings(result.warnings) - - // Integration checks for IssuanceAllocator (only if deployed) - if (name === 'IssuanceAllocator' && client && result.exists) { - const checks = await getIssuanceAllocatorChecks(client, horizonAddressBook, issuanceAddressBook) - for (const check of checks) { - printCheck(check) - } - } - - // Integration checks for RewardsEligibilityOracle (only if deployed) - if (name === 'RewardsEligibilityOracle' && client && result.exists) { - const checks = await getRewardsEligibilityOracleChecks(client, horizonAddressBook, issuanceAddressBook) - for (const check of checks) { - printCheck(check) + // Horizon contracts (deploy targets + prerequisites) + if (packageFilter === 'all' || packageFilter === 'horizon') { + const contracts = getDeployableContracts('horizon').filter(matchesComponent) + if (contracts.length > 0 || showDetail) { + console.log('📦 Horizon') + for (const name of contracts) { + const result = await getContractStatusLine(client, 'horizon', horizonAddressBook, name, undefined, ownershipCtx) + console.log(` ${result.line}`) + printWarnings(result.warnings) + + if (showDetail) { + printProxyAdminDetail(result) + + // Integration checks for RewardsManager (only if deployed) + if (name === 'RewardsManager' && client && result.exists) { + const checks = await getRewardsManagerChecks(client, horizonAddressBook, targetChainId) + for (const check of checks) { + printCheck(check) + } + } } } - - // Integration checks for reclaim addresses (only if deployed) - if (name.startsWith('ReclaimedRewardsFor') && client && result.exists) { - const checks = await getReclaimAddressChecks(client, horizonAddressBook, issuanceAddressBook, name) - for (const check of checks) { - printCheck(check) - } + if (showDetail) { + await printPrerequisites(client, 'horizon', horizonAddressBook, matchesComponent, verbose, ownershipCtx) } } } - console.log() -} - -function printCheck(check: IntegrationCheck): void { - const icon = check.ok === null ? '○' : check.ok ? '✓' : '✗' - console.log(` ${icon} ${check.label}`) -} - -function printWarnings(warnings: string[] | undefined): void { - if (!warnings) return - for (const warning of warnings) { - console.log(` ⚠ ${warning}`) - } -} - -async function getRewardsManagerChecks(client: PublicClient, horizonBook: AddressBookOps): Promise { - const checks: IntegrationCheck[] = [] - const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null - - if (!rmAddress) return checks - - // Check IRewardsManager support (latest interface version) - const supportsRewardsManager = await supportsInterface(client, rmAddress, IREWARDS_MANAGER_INTERFACE_ID) - checks.push({ ok: supportsRewardsManager, label: `implements IRewardsManager (${IREWARDS_MANAGER_INTERFACE_ID})` }) - - // Check IIssuanceTarget support (required for issuance integration) - const supportsIssuanceTarget = await supportsInterface(client, rmAddress, IISSUANCE_TARGET_INTERFACE_ID) - checks.push({ ok: supportsIssuanceTarget, label: `implements IIssuanceTarget (${IISSUANCE_TARGET_INTERFACE_ID})` }) - - return checks -} - -async function getIssuanceAllocatorChecks( - client: PublicClient, - horizonBook: AddressBookOps, - issuanceBook: AddressBookOps, -): Promise { - const checks: IntegrationCheck[] = [] - - const iaAddress = issuanceBook.entryExists('IssuanceAllocator') - ? issuanceBook.getEntry('IssuanceAllocator')?.address - : null - const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null - const gtAddress = horizonBook.entryExists('L2GraphToken') ? horizonBook.getEntry('L2GraphToken')?.address : null - - if (!iaAddress || !rmAddress || !gtAddress) return checks - - // RM must implement IIssuanceTarget for IA integration - const rmSupportsTarget = await supportsInterface(client, rmAddress, IISSUANCE_TARGET_INTERFACE_ID) - checks.push({ ok: rmSupportsTarget, label: `RM implements IIssuanceTarget (${IISSUANCE_TARGET_INTERFACE_ID})` }) - - // Only check activation if RM supports IIssuanceTarget (has been upgraded) - if (rmSupportsTarget) { - const activation = await checkIssuanceAllocatorActivation(client, iaAddress, rmAddress, gtAddress) - checks.push({ ok: activation.iaIntegrated, label: 'RM.issuanceAllocator == this' }) - checks.push({ ok: activation.iaMinter, label: 'GraphToken.MINTER_ROLE granted' }) - } else { - // RM not upgraded yet - can't check activation - checks.push({ ok: null, label: 'RM.issuanceAllocator == this (RM not upgraded)' }) - checks.push({ ok: null, label: 'GraphToken.MINTER_ROLE granted (RM not upgraded)' }) - } - - // Check default target configured - try { - const defaultTarget = (await client.readContract({ - address: iaAddress as `0x${string}`, - abi: ISSUANCE_ALLOCATOR_ABI, - functionName: 'getDefaultTarget', - })) as string - const hasDefaultTarget = defaultTarget !== '0x0000000000000000000000000000000000000000' - checks.push({ ok: hasDefaultTarget, label: 'defaultTarget configured' }) - } catch { - // Function not available - } - - return checks -} - -async function getRewardsEligibilityOracleChecks( - client: PublicClient, - horizonBook: AddressBookOps, - issuanceBook: AddressBookOps, -): Promise { - const checks: IntegrationCheck[] = [] - - const reoAddress = issuanceBook.entryExists('RewardsEligibilityOracle') - ? issuanceBook.getEntry('RewardsEligibilityOracle')?.address - : null - const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null - const controllerAddress = horizonBook.entryExists('Controller') ? horizonBook.getEntry('Controller')?.address : null - - if (!reoAddress || !rmAddress) return checks - - // Get governor and pause guardian from Controller for role checks - let governor: string | null = null - let pauseGuardian: string | null = null - if (controllerAddress) { - try { - governor = (await client.readContract({ - address: controllerAddress as `0x${string}`, - abi: [ - { - inputs: [], - name: 'getGovernor', - outputs: [{ type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - ], - functionName: 'getGovernor', - })) as string - } catch { - // Controller doesn't have getGovernor - } - try { - pauseGuardian = (await client.readContract({ - address: controllerAddress as `0x${string}`, - abi: [ - { - inputs: [], - name: 'pauseGuardian', - outputs: [{ type: 'address' }], - stateMutability: 'view', - type: 'function', - }, - ], - functionName: 'pauseGuardian', - })) as string - } catch { - // Controller doesn't have pauseGuardian - } - } - - // Check access control roles - try { - const governorRole = (await client.readContract({ - address: reoAddress as `0x${string}`, - abi: REWARDS_ELIGIBILITY_ORACLE_ABI, - functionName: 'GOVERNOR_ROLE', - })) as `0x${string}` - - if (governor) { - const governorHasRole = (await client.readContract({ - address: reoAddress as `0x${string}`, - abi: REWARDS_ELIGIBILITY_ORACLE_ABI, - functionName: 'hasRole', - args: [governorRole, governor as `0x${string}`], - })) as boolean - checks.push({ ok: governorHasRole, label: 'governor has GOVERNOR_ROLE' }) + // SubgraphService contracts + if (packageFilter === 'all' || packageFilter === 'subgraph-service') { + const contracts = getDeployableContracts('subgraph-service').filter(matchesComponent) + if (contracts.length > 0 || showDetail) { + console.log('\n📦 SubgraphService') + for (const name of contracts) { + const result = await getContractStatusLine( + client, + 'subgraph-service', + subgraphServiceAddressBook, + name, + undefined, + ownershipCtx, + ) + console.log(` ${result.line}`) + printWarnings(result.warnings) + if (showDetail) { + printProxyAdminDetail(result) + } + } + if (showDetail) { + await printPrerequisites( + client, + 'subgraph-service', + subgraphServiceAddressBook, + matchesComponent, + verbose, + ownershipCtx, + ) + } } - } catch { - // Role check not available } - // Check PAUSE_ROLE - try { - const pauseRole = (await client.readContract({ - address: reoAddress as `0x${string}`, - abi: REWARDS_ELIGIBILITY_ORACLE_ABI, - functionName: 'PAUSE_ROLE', - })) as `0x${string}` - - if (pauseGuardian) { - const pauseGuardianHasRole = (await client.readContract({ - address: reoAddress as `0x${string}`, - abi: REWARDS_ELIGIBILITY_ORACLE_ABI, - functionName: 'hasRole', - args: [pauseRole, pauseGuardian as `0x${string}`], - })) as boolean - checks.push({ ok: pauseGuardianHasRole, label: 'pause guardian has PAUSE_ROLE' }) + // Issuance contracts + if (packageFilter === 'all' || packageFilter === 'issuance') { + const contracts = getDeployableContracts('issuance').filter(matchesComponent) + if (contracts.length > 0 || showDetail) { + console.log('\n📦 Issuance') + for (const name of contracts) { + const result = await getContractStatusLine( + client, + 'issuance', + issuanceAddressBook, + name, + undefined, + ownershipCtx, + ) + console.log(` ${result.line}`) + printWarnings(result.warnings) + + if (showDetail) { + printProxyAdminDetail(result) + + // Integration checks for IssuanceAllocator (only if deployed) + if (name === 'IssuanceAllocator' && client && result.exists) { + const checks = await getIssuanceAllocatorChecks(client, horizonAddressBook, issuanceAddressBook) + for (const check of checks) { + printCheck(check) + } + } + + // Integration checks for REO instances (only if deployed) + if ( + (name === 'RewardsEligibilityOracleA' || name === 'RewardsEligibilityOracleB') && + client && + result.exists + ) { + const checks = await getRewardsEligibilityOracleChecks( + client, + horizonAddressBook, + issuanceAddressBook, + name, + ) + for (const check of checks) { + printCheck(check) + } + } + + // Integration checks for reclaim address (only if deployed) + if (name === 'ReclaimedRewards' && client && result.exists) { + const checks = await getReclaimAddressChecks(client, horizonAddressBook, issuanceAddressBook) + for (const check of checks) { + printCheck(check) + } + } + } + } + if (showDetail) { + await printPrerequisites(client, 'issuance', issuanceAddressBook, matchesComponent, verbose, ownershipCtx) + } } - } catch { - // Role check not available - } - - // Check OPERATOR_ROLE using shared function (single source of truth) - const networkOperator = issuanceBook.entryExists('NetworkOperator') - ? (issuanceBook.getEntry('NetworkOperator')?.address ?? null) - : null - - try { - const operatorCheck = await checkOperatorRole(client, reoAddress, networkOperator) - // For status check: NetworkOperator not configured is always a configuration failure - // (even if role assignment is technically correct with 0 holders) - const statusOk = networkOperator === null ? false : operatorCheck.ok - checks.push({ ok: statusOk, label: operatorCheck.message }) - } catch { - checks.push({ ok: null, label: 'OPERATOR_ROLE (check failed)' }) - } - - // Check if configured in RM - try { - const currentREO = (await client.readContract({ - address: rmAddress as `0x${string}`, - abi: REWARDS_MANAGER_ABI, - functionName: 'getProviderEligibilityOracle', - })) as string - const configured = currentREO.toLowerCase() === reoAddress.toLowerCase() - checks.push({ ok: configured, label: 'RM.providerEligibilityOracle == this' }) - } catch { - // Function not available on old RM } - // Check if validation is enabled - try { - const enabled = (await client.readContract({ - address: reoAddress as `0x${string}`, - abi: REWARDS_ELIGIBILITY_ORACLE_ABI, - functionName: 'getEligibilityValidation', - })) as boolean - checks.push({ ok: enabled, label: 'eligibility validation enabled' }) - } catch { - // Function not available + // Legend for icons (shown when proxy admin warnings are present or in verbose mode) + if (verbose) { + console.log( + '\n Legend: ✓ ok △ code changed ◷ pending upgrade ↑ upgraded ↻ synced 🔑 ProxyAdmin not on governor', + ) } - // Check last oracle update time (indicates if active) - try { - const lastUpdate = (await client.readContract({ - address: reoAddress as `0x${string}`, - abi: REWARDS_ELIGIBILITY_ORACLE_ABI, - functionName: 'getLastOracleUpdateTime', - })) as bigint - const hasUpdates = lastUpdate > 0n - checks.push({ ok: hasUpdates, label: 'oracle has processed updates' }) - } catch { - // Function not available - } - - return checks -} - -async function getReclaimAddressChecks( - client: PublicClient, - horizonBook: AddressBookOps, - issuanceBook: AddressBookOps, - contractName: string, -): Promise { - const checks: IntegrationCheck[] = [] - - const rmAddress = horizonBook.entryExists('RewardsManager') ? horizonBook.getEntry('RewardsManager')?.address : null - const contractAddress = issuanceBook.entryExists(contractName) ? issuanceBook.getEntry(contractName)?.address : null - - if (!rmAddress || !contractAddress) return checks - - // Find the reclaim reason for this contract - const reclaimKey = Object.entries(RECLAIM_CONTRACT_NAMES).find(([_, name]) => name === contractName)?.[0] as - | ReclaimReasonKey - | undefined - if (!reclaimKey) return checks - - const reason = RECLAIM_REASONS[reclaimKey] - const actualAddress = await getReclaimAddress(client, rmAddress, reason) - const configured = actualAddress?.toLowerCase() === contractAddress.toLowerCase() - checks.push({ ok: configured, label: 'configured in RM.reclaimAddresses' }) - - return checks + console.log() } const deployStatusTask = task('deploy:status', 'Show deployment and integration status') @@ -410,6 +405,18 @@ const deployStatusTask = task('deploy:status', 'Show deployment and integration type: ArgumentType.STRING, defaultValue: 'all', }) + .addOption({ + name: 'verbose', + description: 'Show full detail including proxy admin ownership, addresses, and legend', + type: ArgumentType.FLAG, + defaultValue: false, + }) + .addOption({ + name: 'component', + description: 'Filter to contracts matching this name (case-insensitive substring match)', + type: ArgumentType.STRING, + defaultValue: '', + }) .setAction(async () => ({ default: action })) .build() diff --git a/packages/deployment/tasks/eth-tasks.ts b/packages/deployment/tasks/eth-tasks.ts new file mode 100644 index 000000000..7033fe8c4 --- /dev/null +++ b/packages/deployment/tasks/eth-tasks.ts @@ -0,0 +1,208 @@ +import { task } from 'hardhat/config' +import { ArgumentType } from 'hardhat/types/arguments' +import type { NewTaskActionFunction } from 'hardhat/types/tasks' +import { createPublicClient, createWalletClient, custom, formatEther, parseEther, type PublicClient } from 'viem' +import { privateKeyToAccount } from 'viem/accounts' + +import { getDeployerKeyName, resolveConfigVar } from '../lib/task-utils.js' + +// -- Task Types -- + +interface CheckKeyArgs { + key: string +} + +interface FundArgs { + to: string + amount: string +} + +interface BalanceArgs { + account: string +} + +// -- Task Actions -- + +/** + * Verify a keystore variable holds the private key for an expected address + */ +const checkKeyAction: NewTaskActionFunction = async (taskArgs, hre) => { + if (!taskArgs.key) { + console.error('\nError: --key is required') + console.error('Usage: npx hardhat eth:check-key --key ARBITRUM_ONE_ORACLE_KEY') + return + } + + const keyValue = await resolveConfigVar(hre, taskArgs.key) + + if (!keyValue) { + console.error(`\nError: Key "${taskArgs.key}" not found in keystore or environment.`) + console.error(`Set via keystore: npx hardhat keystore set ${taskArgs.key}`) + console.error(`Or environment: export ${taskArgs.key}=0x...`) + return + } + + const account = privateKeyToAccount(keyValue as `0x${string}`) + + console.log(`\nKey Check`) + console.log(` Variable: ${taskArgs.key}`) + console.log(` Address: ${account.address}`) + console.log() +} + +/** + * Query ETH balance for an address + */ +const balanceAction: NewTaskActionFunction = async (taskArgs, hre) => { + if (!taskArgs.account) { + console.error('\nError: --account is required') + console.error('Usage: npx hardhat eth:balance --account 0x... --network arbitrumOne') + return + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const chainId = await client.getChainId() + const account = taskArgs.account as `0x${string}` + const balance = await client.getBalance({ address: account }) + + console.log(`\nETH Balance`) + console.log(` Account: ${account}`) + console.log(` Network: ${networkName} (chainId: ${chainId})`) + console.log(` Balance: ${formatEther(balance)} ETH`) + console.log() +} + +/** + * Send ETH from deployer to an address + */ +const fundAction: NewTaskActionFunction = async (taskArgs, hre) => { + if (!taskArgs.to || !taskArgs.amount) { + console.error('\nError: --to and --amount are required') + console.error('Usage: npx hardhat eth:fund --to 0x... --amount 0.01 --network arbitrumOne') + return + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const chainId = await client.getChainId() + + // Get deployer key + const keyName = getDeployerKeyName(networkName) + const deployerKey = await resolveConfigVar(hre, keyName) + + if (!deployerKey) { + console.error('\nError: No deployer key configured.') + console.error(`Set via keystore: npx hardhat keystore set ${keyName}`) + console.error(`Or environment: export ${keyName}=0x...`) + return + } + + const account = privateKeyToAccount(deployerKey as `0x${string}`) + const to = taskArgs.to as `0x${string}` + const value = parseEther(taskArgs.amount) + + // Check deployer balance + const balance = await client.getBalance({ address: account.address }) + + if (balance < value) { + console.error(`\nError: Insufficient balance`) + console.error(` Deployer balance: ${formatEther(balance)} ETH`) + console.error(` Requested: ${taskArgs.amount} ETH`) + return + } + + console.log(`\nSending ETH`) + console.log(` From: ${account.address}`) + console.log(` To: ${to}`) + console.log(` Amount: ${taskArgs.amount} ETH`) + console.log(` Network: ${networkName} (chainId: ${chainId})`) + + const walletClient = createWalletClient({ + account, + transport: custom(conn.provider), + }) + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hash = await (walletClient as any).sendTransaction({ to, value }) + console.log(` TX: ${hash}`) + + const receipt = await client.waitForTransactionReceipt({ hash }) + if (receipt.status === 'success') { + const newBalance = await client.getBalance({ address: to }) + console.log(`\n Sent successfully!`) + console.log(` Recipient balance: ${formatEther(newBalance)} ETH\n`) + } else { + console.error(`\n Transaction failed\n`) + } +} + +// -- Task Definitions -- + +/** + * Verify a keystore/env variable holds the key for an expected address + * + * Examples: + * npx hardhat eth:check-key --key ARBITRUM_ONE_ORACLE_KEY + */ +export const ethCheckKeyTask = task('eth:check-key', 'Derive and display address from a keystore variable') + .addOption({ + name: 'key', + description: 'Keystore variable name (e.g. ARBITRUM_ONE_ORACLE_KEY)', + type: ArgumentType.STRING, + defaultValue: '', + }) + .setAction(async () => ({ default: checkKeyAction })) + .build() + +/** + * Query ETH balance for an address + * + * Examples: + * npx hardhat eth:balance --account 0x1234... --network arbitrumOne + */ +export const ethBalanceTask = task('eth:balance', 'Query ETH balance for an address') + .addOption({ + name: 'account', + description: 'Address to query balance for', + type: ArgumentType.STRING, + defaultValue: '', + }) + .setAction(async () => ({ default: balanceAction })) + .build() + +/** + * Send ETH from deployer to an address + * + * Uses the deployer key from the Hardhat keystore or environment. + * + * Examples: + * npx hardhat eth:fund --to 0x1234... --amount 0.01 --network arbitrumOne + */ +export const ethFundTask = task('eth:fund', 'Send ETH from deployer to an address') + .addOption({ + name: 'to', + description: 'Recipient address', + type: ArgumentType.STRING, + defaultValue: '', + }) + .addOption({ + name: 'amount', + description: 'Amount of ETH to send (e.g. 0.01)', + type: ArgumentType.STRING, + defaultValue: '', + }) + .setAction(async () => ({ default: fundAction })) + .build() + +export default [ethCheckKeyTask, ethBalanceTask, ethFundTask] diff --git a/packages/deployment/tasks/execute-governance.ts b/packages/deployment/tasks/execute-governance.ts index ea405265d..2fb205a74 100644 --- a/packages/deployment/tasks/execute-governance.ts +++ b/packages/deployment/tasks/execute-governance.ts @@ -1,50 +1,11 @@ import fs from 'fs' -import { configVariable, task } from 'hardhat/config' +import { task } from 'hardhat/config' import type { NewTaskActionFunction } from 'hardhat/types/tasks' import path from 'path' +import { autoDetectForkNetwork } from '../lib/address-book-utils.js' import { executeGovernanceTxs } from '../lib/execute-governance.js' - -/** - * Convert network name to env var prefix: arbitrumSepolia → ARBITRUM_SEPOLIA - */ -function networkToEnvPrefix(networkName: string): string { - return networkName.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase() -} - -/** - * Resolve a configuration variable using Hardhat's hook chain (keystore + env fallback) - * - * Uses hre.hooks.runHandlerChain to go through the configurationVariables fetchValue - * hook chain, which includes the keystore plugin. - */ -async function resolveConfigVar(hre: unknown, name: string): Promise { - try { - const variable = configVariable(name) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const hooks = (hre as any).hooks - - // Call the configurationVariables fetchValue hook chain - // Falls back to env var if not in keystore - const value = await hooks.runHandlerChain( - 'configurationVariables', - 'fetchValue', - [variable], - // Default handler: read from environment variable - async (_context: unknown, v: { name: string }) => { - const envValue = process.env[v.name] - if (typeof envValue !== 'string') { - throw new Error(`Environment variable ${v.name} not found`) - } - return envValue - }, - ) - return value - } catch { - // Key not configured in keystore or env - return undefined - } -} +import { networkToEnvPrefix, resolveConfigVar } from '../lib/task-utils.js' /** * Resolve governor key for a network. @@ -79,17 +40,17 @@ interface TaskArgs { * npx hardhat keystore set ARBITRUM_SEPOLIA_GOVERNOR_KEY * npx hardhat deploy:execute-governance --network arbitrumSepolia * - * For fork testing: - * FORK_NETWORK=arbitrumSepolia npx hardhat deploy:execute-governance --network fork + * For fork testing (auto-detects fork network from anvil): + * npx hardhat deploy:execute-governance --network fork */ const action: NewTaskActionFunction = async (_taskArgs, hre) => { + // Auto-detect fork network from anvil before checking + await autoDetectForkNetwork() + // HH v3: Connect to network to get network connection // eslint-disable-next-line @typescript-eslint/no-explicit-any const conn = await (hre as any).network.connect() - // Get governor key: try network-specific first, fall back to generic - const governorPrivateKey = await resolveGovernorKey(hre, conn.networkName) - // Create minimal Environment-like object for executeGovernanceTxs const env = { name: conn.networkName, @@ -112,8 +73,11 @@ const action: NewTaskActionFunction = async (_taskArgs, hre) => { }, } + // Lazy resolver for governor key - only called when actually needed (non-fork EOA mode) + const resolveKey = () => resolveGovernorKey(hre, conn.networkName) + // eslint-disable-next-line @typescript-eslint/no-explicit-any - await executeGovernanceTxs(env as any, { governorPrivateKey }) + await executeGovernanceTxs(env as any, { resolveGovernorKey: resolveKey }) } const executeGovernanceTask = task( diff --git a/packages/deployment/tasks/grant-role.ts b/packages/deployment/tasks/grant-role.ts index daea22f3a..df28572e7 100644 --- a/packages/deployment/tasks/grant-role.ts +++ b/packages/deployment/tasks/grant-role.ts @@ -1,4 +1,4 @@ -import { configVariable, task } from 'hardhat/config' +import { task } from 'hardhat/config' import { ArgumentType } from 'hardhat/types/arguments' import type { NewTaskActionFunction } from 'hardhat/types/tasks' import { @@ -19,8 +19,13 @@ import { getRoleHash, hasAdminRole, } from '../lib/contract-checks.js' -import { type AddressBookType, CONTRACT_REGISTRY } from '../lib/contract-registry.js' import { createGovernanceTxBuilder } from '../lib/execute-governance.js' +import { + getContractAddress, + getDeployerKeyName, + resolveConfigVar, + resolveContractFromRegistry, +} from '../lib/task-utils.js' import { graph } from '../rocketh/deploy.js' interface TaskArgs { @@ -30,73 +35,6 @@ interface TaskArgs { account: string } -/** - * Convert network name to env var prefix: arbitrumSepolia → ARBITRUM_SEPOLIA - */ -function networkToEnvPrefix(networkName: string): string { - return networkName.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase() -} - -/** - * Resolve a configuration variable using Hardhat's hook chain (keystore + env fallback) - */ -async function resolveConfigVar(hre: unknown, name: string): Promise { - try { - const variable = configVariable(name) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const hooks = (hre as any).hooks - - const value = await hooks.runHandlerChain( - 'configurationVariables', - 'fetchValue', - [variable], - async (_context: unknown, v: { name: string }) => { - const envValue = process.env[v.name] - if (typeof envValue !== 'string') { - throw new Error(`Variable ${v.name} not found`) - } - return envValue - }, - ) - return value - } catch { - return undefined - } -} - -/** - * Resolve contract from registry by name - */ -function resolveContractFromRegistry( - contractName: string, -): { addressBook: AddressBookType; roles: readonly string[] } | null { - for (const [book, contracts] of Object.entries(CONTRACT_REGISTRY)) { - const contract = contracts[contractName as keyof typeof contracts] as { roles?: readonly string[] } | undefined - if (contract?.roles) { - return { addressBook: book as AddressBookType, roles: contract.roles } - } - } - return null -} - -/** - * Get contract address from address book - */ -function getContractAddress(addressBook: AddressBookType, contractName: string, chainId: number): string | null { - const book = - addressBook === 'issuance' - ? graph.getIssuanceAddressBook(chainId) - : addressBook === 'horizon' - ? graph.getHorizonAddressBook(chainId) - : graph.getSubgraphServiceAddressBook(chainId) - - if (!book.entryExists(contractName)) { - return null - } - - return book.getEntry(contractName)?.address ?? null -} - const action: NewTaskActionFunction = async (taskArgs, hre) => { const contractName = taskArgs.contract || undefined const addressArg = taskArgs.address || undefined @@ -128,6 +66,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { }) as PublicClient const actualChainId = await client.getChainId() + await graph.autoDetect() const forkChainId = graph.getForkTargetChainId() const targetChainId = forkChainId ?? actualChainId @@ -184,7 +123,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { console.log(` Admin holders: ${adminInfo.adminMembers.length > 0 ? adminInfo.adminMembers.join(', ') : '(none)'}`) // Get deployer account (from keystore or env var) - const keyName = `${networkToEnvPrefix(networkName === 'fork' ? (process.env.HARDHAT_FORK ?? 'arbitrumSepolia') : networkName)}_DEPLOYER_KEY` + const keyName = getDeployerKeyName(networkName) const deployerKey = await resolveConfigVar(hre, keyName) let deployer: string | undefined @@ -206,7 +145,8 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { console.log(`\n Deployer has ${adminInfo.adminRoleName ?? 'admin role'}, executing directly...`) // Execute directly - const hash = await walletClient.writeContract({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hash = await (walletClient as any).writeContract({ address: contractAddress as `0x${string}`, abi: ACCESS_CONTROL_ENUMERABLE_ABI, functionName: 'grantRole', @@ -266,12 +206,12 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { * Grant a role to an account on a BaseUpgradeable contract * * Examples: - * npx hardhat roles:grant --contract RewardsEligibilityOracle --role ORACLE_ROLE --account 0x... --network arbitrumSepolia + * npx hardhat roles:grant --contract RewardsEligibilityOracleA --role ORACLE_ROLE --account 0x... --network arbitrumSepolia */ const grantRoleTask = task('roles:grant', 'Grant a role to an account') .addOption({ name: 'contract', - description: 'Contract name from registry (e.g., RewardsEligibilityOracle)', + description: 'Contract name from registry (e.g., RewardsEligibilityOracleA)', type: ArgumentType.STRING, defaultValue: '', }) diff --git a/packages/deployment/tasks/grt-tasks.ts b/packages/deployment/tasks/grt-tasks.ts new file mode 100644 index 000000000..1a8ffa099 --- /dev/null +++ b/packages/deployment/tasks/grt-tasks.ts @@ -0,0 +1,449 @@ +import { task } from 'hardhat/config' +import { ArgumentType } from 'hardhat/types/arguments' +import type { NewTaskActionFunction } from 'hardhat/types/tasks' +import { createPublicClient, createWalletClient, custom, formatEther, parseEther, type PublicClient } from 'viem' +import { privateKeyToAccount } from 'viem/accounts' + +import { GRAPH_TOKEN_ABI } from '../lib/abis.js' +import { getDeployerKeyName, resolveConfigVar } from '../lib/task-utils.js' +import { graph } from '../rocketh/deploy.js' + +// governor() is on the Governed base contract, not in IGraphToken +const GOVERNED_ABI = [ + { + inputs: [], + name: 'governor', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +/** + * Get L2GraphToken address from horizon address book + */ +function getGraphTokenAddress(chainId: number): string | null { + const book = graph.getHorizonAddressBook(chainId) + if (!book.entryExists('L2GraphToken')) { + return null + } + return book.getEntry('L2GraphToken')?.address ?? null +} + +// -- Task Types -- + +interface EmptyArgs { + // No arguments +} + +interface BalanceArgs { + account: string +} + +interface TransferArgs { + to: string + amount: string +} + +interface MintArgs { + to: string + amount: string +} + +// -- Task Actions -- + +/** + * Query GRT balance for an address + */ +const balanceAction: NewTaskActionFunction = async (taskArgs, hre) => { + if (!taskArgs.account) { + console.error('\nError: --account is required') + console.error('Usage: npx hardhat grt:balance --account 0x... --network arbitrumSepolia') + return + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + const tokenAddress = getGraphTokenAddress(targetChainId) + if (!tokenAddress) { + console.error(`\nError: L2GraphToken not found in address book for chain ${targetChainId}`) + return + } + + const account = taskArgs.account as `0x${string}` + + const balance = (await client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'balanceOf', + args: [account], + })) as bigint + + console.log(`\nGRT Balance`) + console.log(` Account: ${account}`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + console.log(` Token: ${tokenAddress}`) + console.log(` Balance: ${formatEther(balance)} GRT`) + console.log() +} + +/** + * Transfer GRT from deployer to an address + */ +const transferAction: NewTaskActionFunction = async (taskArgs, hre) => { + if (!taskArgs.to || !taskArgs.amount) { + console.error('\nError: --to and --amount are required') + console.error('Usage: npx hardhat grt:transfer --to 0x... --amount 10000 --network arbitrumSepolia') + return + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + const tokenAddress = getGraphTokenAddress(targetChainId) + if (!tokenAddress) { + console.error(`\nError: L2GraphToken not found in address book for chain ${targetChainId}`) + return + } + + // Get deployer key + const keyName = getDeployerKeyName(networkName) + const deployerKey = await resolveConfigVar(hre, keyName) + + if (!deployerKey) { + console.error('\nError: No deployer key configured.') + console.error(`Set via keystore: npx hardhat keystore set ${keyName}`) + console.error(`Or environment: export ${keyName}=0x...`) + return + } + + const account = privateKeyToAccount(deployerKey as `0x${string}`) + const to = taskArgs.to as `0x${string}` + const amount = parseEther(taskArgs.amount) + + // Check deployer balance + const balance = (await client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'balanceOf', + args: [account.address], + })) as bigint + + if (balance < amount) { + console.error(`\nError: Insufficient balance`) + console.error(` Deployer balance: ${formatEther(balance)} GRT`) + console.error(` Requested: ${taskArgs.amount} GRT`) + return + } + + console.log(`\nTransferring GRT`) + console.log(` From: ${account.address}`) + console.log(` To: ${to}`) + console.log(` Amount: ${taskArgs.amount} GRT`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + console.log(` Token: ${tokenAddress}`) + + const walletClient = createWalletClient({ + account, + transport: custom(conn.provider), + }) + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hash = await (walletClient as any).writeContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'transfer', + args: [to, amount], + }) + + console.log(` TX: ${hash}`) + + const receipt = await client.waitForTransactionReceipt({ hash }) + if (receipt.status === 'success') { + const newBalance = (await client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'balanceOf', + args: [to], + })) as bigint + + console.log(`\n Transferred successfully!`) + console.log(` Recipient balance: ${formatEther(newBalance)} GRT\n`) + } else { + console.error(`\n Transaction failed\n`) + } +} + +/** + * Mint GRT to an address (requires deployer to be a minter) + */ +const mintAction: NewTaskActionFunction = async (taskArgs, hre) => { + if (!taskArgs.to || !taskArgs.amount) { + console.error('\nError: --to and --amount are required') + console.error('Usage: npx hardhat grt:mint --to 0x... --amount 10000 --network arbitrumSepolia') + return + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + const tokenAddress = getGraphTokenAddress(targetChainId) + if (!tokenAddress) { + console.error(`\nError: L2GraphToken not found in address book for chain ${targetChainId}`) + return + } + + // Get deployer key + const keyName = getDeployerKeyName(networkName) + const deployerKey = await resolveConfigVar(hre, keyName) + + if (!deployerKey) { + console.error('\nError: No deployer key configured.') + console.error(`Set via keystore: npx hardhat keystore set ${keyName}`) + console.error(`Or environment: export ${keyName}=0x...`) + return + } + + const account = privateKeyToAccount(deployerKey as `0x${string}`) + const to = taskArgs.to as `0x${string}` + const amount = parseEther(taskArgs.amount) + + // Check deployer is a minter + const isMinter = (await client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'isMinter', + args: [account.address], + })) as boolean + + if (!isMinter) { + console.error(`\nError: Deployer ${account.address} is not a minter on GraphToken`) + console.error('The deployer must be added as a minter by the governor first.') + return + } + + console.log(`\nMinting GRT`) + console.log(` To: ${to}`) + console.log(` Amount: ${taskArgs.amount} GRT`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + console.log(` Token: ${tokenAddress}`) + console.log(` Minter: ${account.address}`) + + const walletClient = createWalletClient({ + account, + transport: custom(conn.provider), + }) + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hash = await (walletClient as any).writeContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'mint', + args: [to, amount], + }) + + console.log(` TX: ${hash}`) + + const receipt = await client.waitForTransactionReceipt({ hash }) + if (receipt.status === 'success') { + // Read new balance + const newBalance = (await client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'balanceOf', + args: [to], + })) as bigint + + console.log(`\n Minted successfully!`) + console.log(` New balance: ${formatEther(newBalance)} GRT\n`) + } else { + console.error(`\n Transaction failed\n`) + } +} + +/** + * Show GRT token status: governor, deployer minter check, total supply + */ +const statusAction: NewTaskActionFunction = async (_taskArgs, hre) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + const tokenAddress = getGraphTokenAddress(targetChainId) + if (!tokenAddress) { + console.error(`\nError: L2GraphToken not found in address book for chain ${targetChainId}`) + return + } + + // Read token info in parallel + const [governor, totalSupply] = await Promise.all([ + client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GOVERNED_ABI, + functionName: 'governor', + }) as Promise, + client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'totalSupply', + }) as Promise, + ]) + + console.log(`\nGRT Token Status`) + console.log(` Token: ${tokenAddress}`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + console.log(` Total supply: ${formatEther(totalSupply)} GRT`) + console.log(` Governor: ${governor}`) + + // Check if governor is a minter + const governorIsMinter = (await client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'isMinter', + args: [governor as `0x${string}`], + })) as boolean + console.log(` Governor is minter: ${governorIsMinter ? 'yes' : 'no'}`) + + // Check deployer if key is available + const keyName = getDeployerKeyName(networkName) + const deployerKey = await resolveConfigVar(hre, keyName) + + if (deployerKey) { + const deployer = privateKeyToAccount(deployerKey as `0x${string}`) + const deployerIsMinter = (await client.readContract({ + address: tokenAddress as `0x${string}`, + abi: GRAPH_TOKEN_ABI, + functionName: 'isMinter', + args: [deployer.address], + })) as boolean + + console.log(`\n Deployer: ${deployer.address}`) + console.log(` Deployer is minter: ${deployerIsMinter ? 'yes' : 'no'}`) + console.log(` Deployer is governor: ${deployer.address.toLowerCase() === governor.toLowerCase() ? 'yes' : 'no'}`) + + if (!deployerIsMinter) { + console.log(`\n To add deployer as minter, the governor must call:`) + console.log(` addMinter(${deployer.address})`) + } + } else { + console.log(`\n Deployer key not configured (${keyName})`) + } + + console.log() +} + +// -- Task Definitions -- + +/** + * Show GRT token status: governor, deployer minter status, total supply + * + * Examples: + * npx hardhat grt:status --network arbitrumSepolia + */ +export const grtStatusTask = task('grt:status', 'Show GRT token status (governor, minter, supply)') + .setAction(async () => ({ default: statusAction })) + .build() + +/** + * Query GRT balance for an address + * + * Examples: + * npx hardhat grt:balance --account 0x1234... --network arbitrumSepolia + */ +export const grtBalanceTask = task('grt:balance', 'Query GRT balance for an address') + .addOption({ + name: 'account', + description: 'Address to query balance for', + type: ArgumentType.STRING, + defaultValue: '', + }) + .setAction(async () => ({ default: balanceAction })) + .build() + +/** + * Transfer testnet GRT from deployer to an address + * + * Uses the deployer's existing balance. No minter role needed. + * + * Examples: + * npx hardhat grt:transfer --to 0x1234... --amount 10000 --network arbitrumSepolia + */ +export const grtTransferTask = task('grt:transfer', 'Transfer GRT from deployer to an address') + .addOption({ + name: 'to', + description: 'Recipient address', + type: ArgumentType.STRING, + defaultValue: '', + }) + .addOption({ + name: 'amount', + description: 'Amount of GRT to transfer (in whole tokens, e.g. 10000)', + type: ArgumentType.STRING, + defaultValue: '', + }) + .setAction(async () => ({ default: transferAction })) + .build() + +/** + * Mint testnet GRT to an address + * + * Requires deployer to be a minter on the GraphToken contract. + * The deployer/governor is a minter by default after deployment. + * + * Examples: + * npx hardhat grt:mint --to 0x1234... --amount 10000 --network arbitrumSepolia + */ +export const grtMintTask = task('grt:mint', 'Mint testnet GRT to an address') + .addOption({ + name: 'to', + description: 'Recipient address', + type: ArgumentType.STRING, + defaultValue: '', + }) + .addOption({ + name: 'amount', + description: 'Amount of GRT to mint (in whole tokens, e.g. 10000)', + type: ArgumentType.STRING, + defaultValue: '', + }) + .setAction(async () => ({ default: mintAction })) + .build() + +export default [grtStatusTask, grtBalanceTask, grtTransferTask, grtMintTask] diff --git a/packages/deployment/tasks/list-pending-implementations.ts b/packages/deployment/tasks/list-pending-implementations.ts index 3d85f50a4..76b0d4553 100644 --- a/packages/deployment/tasks/list-pending-implementations.ts +++ b/packages/deployment/tasks/list-pending-implementations.ts @@ -5,6 +5,7 @@ import type { NewTaskActionFunction } from 'hardhat/types/tasks' import type { AddressBookEntry, AddressBookOps } from '../lib/address-book-ops.js' import { + autoDetectForkNetwork, getForkTargetChainId, getHorizonAddressBook, getIssuanceAddressBook, @@ -33,6 +34,9 @@ const action: NewTaskActionFunction = async (_taskArgs, hre) => { const conn = await (hre as any).network.connect() const networkName = conn.networkName + // Auto-detect fork network from anvil before checking + await autoDetectForkNetwork() + // Get target chain ID (fork mode or provider) const forkChainId = getForkTargetChainId() let targetChainId: number diff --git a/packages/deployment/tasks/list-roles.ts b/packages/deployment/tasks/list-roles.ts index 1f0a8a4ac..46af75366 100644 --- a/packages/deployment/tasks/list-roles.ts +++ b/packages/deployment/tasks/list-roles.ts @@ -4,12 +4,8 @@ import type { NewTaskActionFunction } from 'hardhat/types/tasks' import { createPublicClient, custom, type PublicClient } from 'viem' import { enumerateContractRoles, type RoleInfo } from '../lib/contract-checks.js' -import { - type AddressBookType, - CONTRACT_REGISTRY, - Contracts, - type IssuanceContractName, -} from '../lib/contract-registry.js' +import { Contracts, type IssuanceContractName } from '../lib/contract-registry.js' +import { getContractAddress, resolveContractFromRegistry } from '../lib/task-utils.js' import { graph } from '../rocketh/deploy.js' interface TaskArgs { @@ -52,43 +48,6 @@ function printRoleInfo(role: RoleInfo, knownRoles: RoleInfo[]): void { } } -/** - * Resolve contract from registry by name - * - * Searches across all address books for a matching contract name. - * Returns the contract metadata and address book type if found. - */ -function resolveContractFromRegistry( - contractName: string, -): { addressBook: AddressBookType; roles: readonly string[] } | null { - // Search issuance first (most likely for this use case) - for (const [book, contracts] of Object.entries(CONTRACT_REGISTRY)) { - const contract = contracts[contractName as keyof typeof contracts] as { roles?: readonly string[] } | undefined - if (contract?.roles) { - return { addressBook: book as AddressBookType, roles: contract.roles } - } - } - return null -} - -/** - * Get contract address from address book - */ -function getContractAddress(addressBook: AddressBookType, contractName: string, chainId: number): string | null { - const book = - addressBook === 'issuance' - ? graph.getIssuanceAddressBook(chainId) - : addressBook === 'horizon' - ? graph.getHorizonAddressBook(chainId) - : graph.getSubgraphServiceAddressBook(chainId) - - if (!book.entryExists(contractName)) { - return null - } - - return book.getEntry(contractName)?.address ?? null -} - const action: NewTaskActionFunction = async (taskArgs, hre) => { // Empty strings treated as not provided const contractName = taskArgs.contract || undefined @@ -97,7 +56,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { // Validate: must provide either --contract or --address if (!contractName && !address) { console.error('\nError: Must provide either --contract or --address') - console.error(' --contract Contract name from registry (e.g., RewardsEligibilityOracle)') + console.error(' --contract Contract name from registry (e.g., RewardsEligibilityOracleA)') console.error(' --address Contract address (requires known role list)\n') return } @@ -115,6 +74,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { const actualChainId = await client.getChainId() // Determine target chain ID (handle fork mode) + await graph.autoDetect() const forkChainId = graph.getForkTargetChainId() const targetChainId = forkChainId ?? actualChainId @@ -189,13 +149,13 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { * List all role holders for a BaseUpgradeable contract * * Examples: - * npx hardhat roles:list --contract RewardsEligibilityOracle --network arbitrumSepolia + * npx hardhat roles:list --contract RewardsEligibilityOracleA --network arbitrumSepolia * npx hardhat roles:list --address 0x62c2... --network arbitrumSepolia */ const listRolesTask = task('roles:list', 'List all role holders for a contract') .addOption({ name: 'contract', - description: 'Contract name from registry (e.g., RewardsEligibilityOracle)', + description: 'Contract name from registry (e.g., RewardsEligibilityOracleA)', type: ArgumentType.STRING, defaultValue: '', }) diff --git a/packages/deployment/tasks/reo-tasks.ts b/packages/deployment/tasks/reo-tasks.ts new file mode 100644 index 000000000..4489ee3ce --- /dev/null +++ b/packages/deployment/tasks/reo-tasks.ts @@ -0,0 +1,597 @@ +import { task } from 'hardhat/config' +import type { NewTaskActionFunction } from 'hardhat/types/tasks' +import { + createPublicClient, + createWalletClient, + custom, + encodeFunctionData, + type PublicClient, + type WalletClient, +} from 'viem' +import { privateKeyToAccount } from 'viem/accounts' + +import { PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, REWARDS_ELIGIBILITY_ORACLE_ABI } from '../lib/abis.js' +import { accountHasRole, enumerateContractRoles, getRoleHash } from '../lib/contract-checks.js' +import { createGovernanceTxBuilder } from '../lib/execute-governance.js' +import { formatDuration, formatTimestamp, getDeployerKeyName, resolveConfigVar } from '../lib/task-utils.js' +import { graph } from '../rocketh/deploy.js' + +// -- Types -- + +type REOInstance = 'A' | 'B' | 'Mock' + +const VALID_INSTANCES: REOInstance[] = ['A', 'B', 'Mock'] + +interface TaskArgs { + instance: string +} + +/** + * Get address book entry name for an REO instance + */ +function reoEntryName(instance: REOInstance): string { + return `RewardsEligibilityOracle${instance}` +} + +/** + * Get REO address from issuance address book for a specific instance + */ +function getREOAddress(chainId: number, instance: REOInstance): string | null { + const book = graph.getIssuanceAddressBook(chainId) + const name = reoEntryName(instance) as Parameters[0] + if (!book.entryExists(name)) { + return null + } + return book.getEntry(name)?.address ?? null +} + +/** + * Parse and validate --instance flag. Returns null if invalid. + * Accepts case-insensitive input: "a", "A", "b", "B", "mock", "Mock" + */ +function parseInstance(raw: string): REOInstance | null { + const lower = raw.toLowerCase() + const mapping: Record = { a: 'A', b: 'B', mock: 'Mock' } + return mapping[lower] ?? null +} + +// -- Enable/Disable Shared Logic -- + +interface SetValidationArgs { + enabled: boolean + instance: REOInstance + hre: unknown +} + +async function setEligibilityValidation({ enabled, instance, hre }: SetValidationArgs): Promise { + const action = enabled ? 'Enable' : 'Disable' + const actionLower = enabled ? 'enable' : 'disable' + + // Connect to network + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + // Create viem client + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + // Get REO address + const reoAddress = getREOAddress(targetChainId, instance) + if (!reoAddress) { + console.error(`\nError: ${reoEntryName(instance)} not found in address book for chain ${targetChainId}`) + return + } + + // Check current state + const currentState = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getEligibilityValidation', + })) as boolean + + if (currentState === enabled) { + console.log(`\n✓ [${instance}] Eligibility validation already ${actionLower}d`) + console.log(' No action needed.\n') + return + } + + // Get OPERATOR_ROLE hash + const operatorRoleHash = await getRoleHash(client, reoAddress, 'OPERATOR_ROLE') + if (!operatorRoleHash) { + console.error('\nError: Could not read OPERATOR_ROLE from contract') + return + } + + console.log(`\n🔧 ${action} Eligibility Validation [Instance ${instance}]`) + console.log(` Contract: ${reoAddress}`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + console.log(` Current: ${currentState ? 'enabled' : 'disabled'}`) + console.log(` Target: ${enabled ? 'enabled' : 'disabled'}`) + + // Get deployer account (from keystore or env var) + const keyName = getDeployerKeyName(networkName) + const deployerKey = await resolveConfigVar(hre, keyName) + + let deployer: string | undefined + let walletClient: WalletClient | undefined + + if (deployerKey) { + const account = privateKeyToAccount(deployerKey as `0x${string}`) + deployer = account.address + walletClient = createWalletClient({ + account, + transport: custom(conn.provider), + }) + } + + // Check if deployer has OPERATOR_ROLE + const canExecuteDirectly = deployer ? await accountHasRole(client, reoAddress, operatorRoleHash, deployer) : false + + if (canExecuteDirectly && walletClient && deployer) { + console.log(`\n Deployer has OPERATOR_ROLE, executing directly...`) + + // Execute directly + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hash = await (walletClient as any).writeContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'setEligibilityValidation', + args: [enabled], + }) + + console.log(` TX: ${hash}`) + + // Wait for confirmation + const receipt = await client.waitForTransactionReceipt({ hash }) + if (receipt.status === 'success') { + console.log(`\n✓ [${instance}] Eligibility validation ${actionLower}d successfully\n`) + } else { + console.error(`\n✗ Transaction failed\n`) + } + } else { + // Generate governance TX + console.log(`\n Requires OPERATOR_ROLE to ${actionLower}`) + console.log(' Generating governance TX...') + + // Create a minimal environment for the TxBuilder + const env = { + name: networkName, + network: { provider: conn.provider }, + showMessage: console.log, + } + + const txName = `reo-${instance.toLowerCase()}-${actionLower}-validation` + const builder = await createGovernanceTxBuilder(env as Parameters[0], txName, { + name: `${action} REO ${instance} Validation`, + description: `${action} eligibility validation on ${reoEntryName(instance)}`, + }) + + // Encode the setEligibilityValidation call + const data = encodeFunctionData({ + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'setEligibilityValidation', + args: [enabled], + }) + + builder.addTx({ + to: reoAddress, + data, + value: '0', + }) + + const txFile = builder.saveToFile() + console.log(`\n✓ Governance TX saved: ${txFile}`) + console.log('\nNext steps:') + console.log(' • Fork testing: npx hardhat deploy:execute-governance --network fork') + console.log(' • Safe multisig: Upload JSON to Transaction Builder') + console.log('') + } +} + +// -- Status for a single instance -- + +async function showInstanceStatus( + client: PublicClient, + reoAddress: string, + instance: REOInstance, + networkName: string, + targetChainId: number, +): Promise { + // Mock has a simplified status (no roles, no validation toggle, no oracle) + if (instance === 'Mock') { + console.log(`\n📊 RewardsEligibilityOracle Mock Status`) + console.log(` Address: ${reoAddress}`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + console.log(` Type: MockRewardsEligibilityOracle (testnet, indexers self-manage eligibility)`) + console.log() + return + } + + console.log(`\n📊 RewardsEligibilityOracle ${instance} Status`) + console.log(` Address: ${reoAddress}`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + + // Read all status values + const [validationEnabled, eligibilityPeriod, oracleUpdateTimeout, lastOracleUpdateTime] = await Promise.all([ + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getEligibilityValidation', + }) as Promise, + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getEligibilityPeriod', + }) as Promise, + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getOracleUpdateTimeout', + }) as Promise, + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getLastOracleUpdateTime', + }) as Promise, + ]) + + // Calculate derived states + const now = BigInt(Math.floor(Date.now() / 1000)) + const timeSinceLastUpdate = lastOracleUpdateTime > 0n ? now - lastOracleUpdateTime : null + const timeoutExceeded = timeSinceLastUpdate !== null && timeSinceLastUpdate > oracleUpdateTimeout + const effectivelyDisabled = !validationEnabled || timeoutExceeded + + // Configuration section + console.log(`\n🔧 Configuration`) + console.log(` Validation enabled: ${validationEnabled ? '✓ yes' : '✗ no'}`) + console.log(` Eligibility period: ${formatDuration(eligibilityPeriod)} (${eligibilityPeriod} seconds)`) + console.log(` Oracle timeout: ${formatDuration(oracleUpdateTimeout)} (${oracleUpdateTimeout} seconds)`) + + // Oracle activity section + console.log(`\n📡 Oracle Activity`) + console.log(` Last update: ${formatTimestamp(lastOracleUpdateTime)}`) + if (timeSinceLastUpdate === null) { + console.log(` ⚠️ No oracle updates yet`) + } else if (timeoutExceeded) { + console.log(` ⚠️ Timeout exceeded! All indexers treated as eligible (fail-safe active)`) + } + + // Effective state section + console.log(`\n🎯 Effective State`) + if (effectivelyDisabled) { + console.log(` Status: ✗ DISABLED (all indexers eligible)`) + if (!validationEnabled) { + console.log(` Reason: Validation toggle is off`) + } else if (timeoutExceeded) { + console.log(` Reason: Oracle timeout exceeded (fail-safe)`) + } + } else { + console.log(` Status: ✓ ACTIVE (enforcing eligibility)`) + } + + // Check if RewardsManager is configured to use this REO instance + const horizonBook = graph.getHorizonAddressBook(targetChainId) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const rmAddress = (horizonBook as any).entryExists('RewardsManager') + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (horizonBook as any).getEntry('RewardsManager')?.address + : null + + if (rmAddress) { + try { + const configuredOracle = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, + functionName: 'getProviderEligibilityOracle', + })) as string + + const isConfigured = configuredOracle.toLowerCase() === reoAddress.toLowerCase() + if (isConfigured) { + console.log(` RewardsManager: ✓ using this instance`) + } else if (configuredOracle === '0x0000000000000000000000000000000000000000') { + console.log(` RewardsManager: ✗ no oracle configured`) + } else { + console.log(` RewardsManager: ✗ using different oracle (${configuredOracle})`) + } + } catch { + console.log(` RewardsManager: ? not upgraded yet (getProviderEligibilityOracle not available)`) + } + } + + // Role holders section + console.log(`\n🔐 Role Holders`) + const knownRoles = ['GOVERNOR_ROLE', 'PAUSE_ROLE', 'OPERATOR_ROLE', 'ORACLE_ROLE'] + const result = await enumerateContractRoles(client, reoAddress, knownRoles) + + for (const role of result.roles) { + const memberList = role.members.length > 0 ? role.members.join(', ') : '(none)' + console.log(` ${role.name} (${role.memberCount}): ${memberList}`) + } + + if (result.failedRoles.length > 0) { + console.log(` ⚠️ Failed to read: ${result.failedRoles.join(', ')}`) + } + + console.log() +} + +// -- Indexer listing for a single instance -- + +async function showInstanceIndexers( + client: PublicClient, + reoAddress: string, + instance: REOInstance, + networkName: string, + targetChainId: number, +): Promise { + console.log(`\n📋 RewardsEligibilityOracle ${instance} — Tracked Indexers`) + console.log(` Address: ${reoAddress}`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + + // Get indexer count and eligibility period in parallel + const [indexerCount, eligibilityPeriod, validationEnabled] = await Promise.all([ + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getIndexerCount', + }) as Promise, + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getEligibilityPeriod', + }) as Promise, + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getEligibilityValidation', + }) as Promise, + ]) + + console.log(` Validation: ${validationEnabled ? 'enabled' : 'disabled'}`) + console.log(` Eligibility period: ${formatDuration(eligibilityPeriod)}`) + console.log(` Tracked indexers: ${indexerCount}`) + + if (indexerCount === 0n) { + console.log('\n No indexers tracked.\n') + return + } + + // Fetch all indexer addresses + const indexers = (await client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getIndexers', + })) as `0x${string}`[] + + // Batch-read eligibility and renewal time for each indexer + const details = await Promise.all( + indexers.map(async (indexer) => { + const [eligible, renewalTime] = await Promise.all([ + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'isEligible', + args: [indexer], + }) as Promise, + client.readContract({ + address: reoAddress as `0x${string}`, + abi: REWARDS_ELIGIBILITY_ORACLE_ABI, + functionName: 'getEligibilityRenewalTime', + args: [indexer], + }) as Promise, + ]) + return { indexer, eligible, renewalTime } + }), + ) + + // Sort by renewal time (most recent first), then by address within each group + details.sort((a, b) => { + if (a.renewalTime !== b.renewalTime) { + return a.renewalTime < b.renewalTime ? 1 : -1 + } + return a.indexer.toLowerCase() < b.indexer.toLowerCase() ? -1 : 1 + }) + + // Display results grouped by renewal time with blank lines between groups + let lastRenewalTime: bigint | null = null + for (const { indexer, eligible, renewalTime } of details) { + if (lastRenewalTime !== null && renewalTime !== lastRenewalTime) { + console.log('') + } + lastRenewalTime = renewalTime + const status = eligible ? '✓' : '✗' + console.log(` ${status} ${indexer} renewed ${formatTimestamp(renewalTime)}`) + } + + // Summary + const eligibleCount = details.filter((d) => d.eligible).length + console.log(`\n Summary: ${eligibleCount}/${details.length} eligible\n`) +} + +// -- Task Actions -- + +const enableAction: NewTaskActionFunction = async (taskArgs, hre) => { + const instance = parseInstance(taskArgs.instance) + if (!instance) { + console.error(`\nError: --instance is required (a, b, or mock)`) + return + } + if (instance === 'Mock') { + console.error(`\nError: Mock REO has no validation toggle — it's always active`) + return + } + await setEligibilityValidation({ enabled: true, instance, hre }) +} + +const disableAction: NewTaskActionFunction = async (taskArgs, hre) => { + const instance = parseInstance(taskArgs.instance) + if (!instance) { + console.error(`\nError: --instance is required (a, b, or mock)`) + return + } + if (instance === 'Mock') { + console.error(`\nError: Mock REO has no validation toggle — it's always active`) + return + } + await setEligibilityValidation({ enabled: false, instance, hre }) +} + +const indexersAction: NewTaskActionFunction = async (taskArgs, hre) => { + // Connect to network + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + // Create viem client + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + // Determine which instances to show + const requestedInstance = taskArgs.instance ? parseInstance(taskArgs.instance) : null + const instancesToShow: REOInstance[] = requestedInstance ? [requestedInstance] : VALID_INSTANCES + + let found = false + for (const instance of instancesToShow) { + const reoAddress = getREOAddress(targetChainId, instance) + if (reoAddress) { + found = true + await showInstanceIndexers(client, reoAddress, instance, networkName, targetChainId) + } else if (requestedInstance) { + console.error(`\nError: ${reoEntryName(instance)} not found in address book for chain ${targetChainId}`) + } + } + + if (!found) { + console.error(`\nError: No REO instances found in address book for chain ${targetChainId}`) + } +} + +const statusAction: NewTaskActionFunction = async (taskArgs, hre) => { + // Connect to network + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + // Create viem client + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + // Determine which instances to show + const requestedInstance = taskArgs.instance ? parseInstance(taskArgs.instance) : null + const instancesToShow: REOInstance[] = requestedInstance ? [requestedInstance] : VALID_INSTANCES + + let found = false + for (const instance of instancesToShow) { + const reoAddress = getREOAddress(targetChainId, instance) + if (reoAddress) { + found = true + await showInstanceStatus(client, reoAddress, instance, networkName, targetChainId) + } else if (requestedInstance) { + // Only error if a specific instance was requested and not found + console.error(`\nError: ${reoEntryName(instance)} not found in address book for chain ${targetChainId}`) + } + } + + if (!found) { + console.error(`\nError: No REO instances found in address book for chain ${targetChainId}`) + } +} + +// -- Task Definitions -- + +/** + * Enable eligibility validation on a REO instance + * + * Requires OPERATOR_ROLE. If deployer has the role, executes directly. + * Otherwise generates a governance TX for multisig execution. + * + * Examples: + * npx hardhat reo:enable --instance a --network arbitrumSepolia + */ +export const reoEnableTask = task('reo:enable', 'Enable eligibility validation on a REO instance') + .addOption({ + name: 'instance', + description: 'REO instance (a, b, or mock)', + defaultValue: '', + }) + .setAction(async () => ({ default: enableAction })) + .build() + +/** + * Disable eligibility validation on a REO instance + * + * Requires OPERATOR_ROLE. If deployer has the role, executes directly. + * Otherwise generates a governance TX for multisig execution. + * + * WARNING: When validation is disabled, ALL indexers are treated as eligible. + * + * Examples: + * npx hardhat reo:disable --instance b --network arbitrumSepolia + */ +export const reoDisableTask = task('reo:disable', 'Disable eligibility validation on a REO instance') + .addOption({ + name: 'instance', + description: 'REO instance (a, b, or mock)', + defaultValue: '', + }) + .setAction(async () => ({ default: disableAction })) + .build() + +/** + * Show detailed status of REO instance(s) + * + * Displays configuration, oracle activity, effective state, and role holders. + * If --instance is omitted, shows status for all deployed instances. + * + * Examples: + * npx hardhat reo:status --network arbitrumSepolia # show all + * npx hardhat reo:status --instance a --network arbitrumSepolia # show A only + */ +export const reoStatusTask = task('reo:status', 'Show detailed REO status') + .addOption({ + name: 'instance', + description: 'REO instance (a, b, or mock; omit for all)', + defaultValue: '', + }) + .setAction(async () => ({ default: statusAction })) + .build() + +/** + * List tracked indexers with eligibility info + * + * Shows each indexer's eligibility status, renewal time, and expiry. + * If --instance is omitted, shows indexers for all deployed instances. + * + * Examples: + * npx hardhat reo:indexers --network arbitrumSepolia # show all + * npx hardhat reo:indexers --instance a --network arbitrumSepolia # show A only + */ +export const reoIndexersTask = task('reo:indexers', 'List tracked indexers with eligibility info') + .addOption({ + name: 'instance', + description: 'REO instance (a, b, or mock; omit for all)', + defaultValue: '', + }) + .setAction(async () => ({ default: indexersAction })) + .build() + +export default [reoEnableTask, reoDisableTask, reoStatusTask, reoIndexersTask] diff --git a/packages/deployment/tasks/reset-fork.ts b/packages/deployment/tasks/reset-fork.ts index f64335c3d..ff683423d 100644 --- a/packages/deployment/tasks/reset-fork.ts +++ b/packages/deployment/tasks/reset-fork.ts @@ -4,7 +4,7 @@ import path from 'node:path' import { task } from 'hardhat/config' import type { NewTaskActionFunction } from 'hardhat/types/tasks' -import { getForkNetwork, getForkStateDir } from '../lib/address-book-utils.js' +import { autoDetectForkNetwork, getForkNetwork, getForkStateDir } from '../lib/address-book-utils.js' interface TaskArgs { // No arguments for this task @@ -27,6 +27,8 @@ const action: NewTaskActionFunction = async (_taskArgs, hre) => { const conn = await (hre as any).network.connect() const networkName = conn.networkName + // Auto-detect fork network from anvil before checking + await autoDetectForkNetwork() const forkNetwork = getForkNetwork() if (!forkNetwork) { diff --git a/packages/deployment/tasks/revoke-role.ts b/packages/deployment/tasks/revoke-role.ts index 029d23336..10f239508 100644 --- a/packages/deployment/tasks/revoke-role.ts +++ b/packages/deployment/tasks/revoke-role.ts @@ -1,4 +1,4 @@ -import { configVariable, task } from 'hardhat/config' +import { task } from 'hardhat/config' import { ArgumentType } from 'hardhat/types/arguments' import type { NewTaskActionFunction } from 'hardhat/types/tasks' import { @@ -19,8 +19,13 @@ import { getRoleHash, hasAdminRole, } from '../lib/contract-checks.js' -import { type AddressBookType, CONTRACT_REGISTRY } from '../lib/contract-registry.js' import { createGovernanceTxBuilder } from '../lib/execute-governance.js' +import { + getContractAddress, + getDeployerKeyName, + resolveConfigVar, + resolveContractFromRegistry, +} from '../lib/task-utils.js' import { graph } from '../rocketh/deploy.js' interface TaskArgs { @@ -30,73 +35,6 @@ interface TaskArgs { account: string } -/** - * Convert network name to env var prefix: arbitrumSepolia → ARBITRUM_SEPOLIA - */ -function networkToEnvPrefix(networkName: string): string { - return networkName.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase() -} - -/** - * Resolve a configuration variable using Hardhat's hook chain (keystore + env fallback) - */ -async function resolveConfigVar(hre: unknown, name: string): Promise { - try { - const variable = configVariable(name) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const hooks = (hre as any).hooks - - const value = await hooks.runHandlerChain( - 'configurationVariables', - 'fetchValue', - [variable], - async (_context: unknown, v: { name: string }) => { - const envValue = process.env[v.name] - if (typeof envValue !== 'string') { - throw new Error(`Variable ${v.name} not found`) - } - return envValue - }, - ) - return value - } catch { - return undefined - } -} - -/** - * Resolve contract from registry by name - */ -function resolveContractFromRegistry( - contractName: string, -): { addressBook: AddressBookType; roles: readonly string[] } | null { - for (const [book, contracts] of Object.entries(CONTRACT_REGISTRY)) { - const contract = contracts[contractName as keyof typeof contracts] as { roles?: readonly string[] } | undefined - if (contract?.roles) { - return { addressBook: book as AddressBookType, roles: contract.roles } - } - } - return null -} - -/** - * Get contract address from address book - */ -function getContractAddress(addressBook: AddressBookType, contractName: string, chainId: number): string | null { - const book = - addressBook === 'issuance' - ? graph.getIssuanceAddressBook(chainId) - : addressBook === 'horizon' - ? graph.getHorizonAddressBook(chainId) - : graph.getSubgraphServiceAddressBook(chainId) - - if (!book.entryExists(contractName)) { - return null - } - - return book.getEntry(contractName)?.address ?? null -} - const action: NewTaskActionFunction = async (taskArgs, hre) => { const contractName = taskArgs.contract || undefined const addressArg = taskArgs.address || undefined @@ -128,6 +66,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { }) as PublicClient const actualChainId = await client.getChainId() + await graph.autoDetect() const forkChainId = graph.getForkTargetChainId() const targetChainId = forkChainId ?? actualChainId @@ -184,7 +123,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { console.log(` Admin holders: ${adminInfo.adminMembers.length > 0 ? adminInfo.adminMembers.join(', ') : '(none)'}`) // Get deployer account - const keyName = `${networkToEnvPrefix(networkName === 'fork' ? (process.env.HARDHAT_FORK ?? 'arbitrumSepolia') : networkName)}_DEPLOYER_KEY` + const keyName = getDeployerKeyName(networkName) const deployerKey = await resolveConfigVar(hre, keyName) let deployer: string | undefined @@ -206,7 +145,8 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { console.log(`\n Deployer has ${adminInfo.adminRoleName ?? 'admin role'}, executing directly...`) // Execute directly - const hash = await walletClient.writeContract({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hash = await (walletClient as any).writeContract({ address: contractAddress as `0x${string}`, abi: ACCESS_CONTROL_ENUMERABLE_ABI, functionName: 'revokeRole', @@ -266,12 +206,12 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { * Revoke a role from an account on a BaseUpgradeable contract * * Examples: - * npx hardhat roles:revoke --contract RewardsEligibilityOracle --role ORACLE_ROLE --account 0x... --network arbitrumSepolia + * npx hardhat roles:revoke --contract RewardsEligibilityOracleA --role ORACLE_ROLE --account 0x... --network arbitrumSepolia */ const revokeRoleTask = task('roles:revoke', 'Revoke a role from an account') .addOption({ name: 'contract', - description: 'Contract name from registry (e.g., RewardsEligibilityOracle)', + description: 'Contract name from registry (e.g., RewardsEligibilityOracleA)', type: ArgumentType.STRING, defaultValue: '', }) diff --git a/packages/deployment/tasks/ss-tasks.ts b/packages/deployment/tasks/ss-tasks.ts new file mode 100644 index 000000000..6479fa681 --- /dev/null +++ b/packages/deployment/tasks/ss-tasks.ts @@ -0,0 +1,306 @@ +import { task } from 'hardhat/config' +import type { NewTaskActionFunction } from 'hardhat/types/tasks' +import { createPublicClient, custom, type PublicClient } from 'viem' + +// Minimal ABI for RewardsManager public storage variable (not in the IRewardsManager interface) +const REWARDS_MANAGER_SIGNAL_ABI = [ + { + inputs: [], + name: 'minimumSubgraphSignal', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, +] as const +import { formatGRT } from '../lib/format.js' +import { formatDuration } from '../lib/task-utils.js' +import { graph } from '../rocketh/deploy.js' + +// -- ABIs -- + +// Minimal ABI for SubgraphService view functions +const SUBGRAPH_SERVICE_ABI = [ + { + inputs: [], + name: 'getProvisionTokensRange', + outputs: [{ type: 'uint256' }, { type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getDelegationRatio', + outputs: [{ type: 'uint32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'stakeToFeesRatio', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'curationFeesCut', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'maxPOIStaleness', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getThawingPeriodRange', + outputs: [{ type: 'uint64' }, { type: 'uint64' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getVerifierCutRange', + outputs: [{ type: 'uint32' }, { type: 'uint32' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getDisputeManager', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getGraphTallyCollector', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getCuration', + outputs: [{ type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getBlockClosingAllocationWithActiveAgreement', + outputs: [{ type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +// -- Helpers -- + +const PPM = 1_000_000 + +function formatPPM(value: bigint | number): string { + const pct = (Number(value) / PPM) * 100 + return `${pct}% (${value} PPM)` +} + +// -- Task Action -- + +const statusAction: NewTaskActionFunction = async (_taskArgs, hre) => { + // Connect to network + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const conn = await (hre as any).network.connect() + const networkName = conn.networkName + + const client = createPublicClient({ + transport: custom(conn.provider), + }) as PublicClient + + const actualChainId = await client.getChainId() + await graph.autoDetect() + const forkChainId = graph.getForkTargetChainId() + const targetChainId = forkChainId ?? actualChainId + + // Get SubgraphService address + const ssBook = graph.getSubgraphServiceAddressBook(targetChainId) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const ssAddress = (ssBook as any).entryExists('SubgraphService') + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (ssBook as any).getEntry('SubgraphService')?.address + : null + + if (!ssAddress) { + console.error(`\nError: SubgraphService not found in address book for chain ${targetChainId}`) + return + } + + // Get RewardsManager address + const horizonBook = graph.getHorizonAddressBook(targetChainId) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const rmAddress = (horizonBook as any).entryExists('RewardsManager') + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (horizonBook as any).getEntry('RewardsManager')?.address + : null + + console.log(`\n📊 SubgraphService Status`) + console.log(` Address: ${ssAddress}`) + console.log(` Network: ${networkName} (chainId: ${targetChainId})`) + + // Batch-read all SubgraphService parameters + const [ + provisionRange, + delegationRatio, + stakeToFees, + curationCut, + poiStaleness, + thawingRange, + verifierCutRange, + disputeManager, + tallyCollector, + curation, + ] = await Promise.all([ + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getProvisionTokensRange', + }) as Promise<[bigint, bigint]>, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getDelegationRatio', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'stakeToFeesRatio', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'curationFeesCut', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'maxPOIStaleness', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getThawingPeriodRange', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getVerifierCutRange', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getDisputeManager', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getGraphTallyCollector', + }) as Promise, + client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getCuration', + }) as Promise, + ]) + + // Try newer functions that may not be on current deployment + let blockClosingWithAgreement: boolean | null = null + try { + blockClosingWithAgreement = (await client.readContract({ + address: ssAddress as `0x${string}`, + abi: SUBGRAPH_SERVICE_ABI, + functionName: 'getBlockClosingAllocationWithActiveAgreement', + })) as boolean + } catch { + // Not available on current implementation + } + + // Display SubgraphService parameters + console.log(`\n🔧 Provision Parameters`) + console.log(` Min provision tokens: ${formatGRT(provisionRange[0])}`) + if (provisionRange[1] < 2n ** 256n - 1n) { + console.log(` Max provision tokens: ${formatGRT(provisionRange[1])}`) + } else { + console.log(` Max provision tokens: unlimited`) + } + console.log(` Delegation ratio: ${delegationRatio}x`) + + console.log(`\n📐 Thawing & Verifier Ranges`) + if (thawingRange[0] === thawingRange[1]) { + console.log(` Thawing period: ${formatDuration(thawingRange[0])} (fixed)`) + } else { + console.log(` Thawing period: ${formatDuration(thawingRange[0])} – ${formatDuration(thawingRange[1])}`) + } + console.log(` Verifier cut: ${formatPPM(verifierCutRange[0])} – ${formatPPM(verifierCutRange[1])}`) + + console.log(`\n💰 Fee Parameters`) + console.log(` Stake to fees ratio: ${stakeToFees}`) + console.log(` Curation fees cut: ${formatPPM(curationCut)}`) + + console.log(`\n⏱️ Staleness`) + console.log(` Max POI staleness: ${formatDuration(poiStaleness)} (${poiStaleness} seconds)`) + + if (blockClosingWithAgreement !== null) { + console.log(`\n🔒 Agreement Guards`) + console.log(` Block closing allocation with active agreement: ${blockClosingWithAgreement ? 'yes' : 'no'}`) + } + + console.log(`\n🔗 Linked Contracts`) + console.log(` DisputeManager: ${disputeManager}`) + console.log(` GraphTallyCollector: ${tallyCollector}`) + console.log(` Curation: ${curation}`) + + // RewardsManager parameters + if (rmAddress) { + console.log(`\n📊 RewardsManager`) + console.log(` Address: ${rmAddress}`) + + try { + const minimumSignal = (await client.readContract({ + address: rmAddress as `0x${string}`, + abi: REWARDS_MANAGER_SIGNAL_ABI, + functionName: 'minimumSubgraphSignal', + })) as bigint + + if (minimumSignal === 0n) { + console.log(` Minimum subgraph signal: 0 (disabled)`) + } else { + console.log(` Minimum subgraph signal: ${formatGRT(minimumSignal)}`) + } + } catch { + console.log(` Minimum subgraph signal: ? (not readable)`) + } + } + + console.log() +} + +// -- Task Definition -- + +/** + * Show SubgraphService configuration parameters + * + * Displays provision requirements, fee parameters, staleness thresholds, + * and linked contract addresses. + * + * Examples: + * npx hardhat ss:status --network arbitrumOne + * npx hardhat ss:status --network arbitrumSepolia + */ +export const ssStatusTask = task('ss:status', 'Show SubgraphService configuration parameters') + .setAction(async () => ({ default: statusAction })) + .build() + +export default [ssStatusTask] diff --git a/packages/deployment/tasks/sync.ts b/packages/deployment/tasks/sync.ts new file mode 100644 index 000000000..563cad8ad --- /dev/null +++ b/packages/deployment/tasks/sync.ts @@ -0,0 +1,37 @@ +import { task } from 'hardhat/config' +import type { NewTaskActionFunction } from 'hardhat/types/tasks' + +interface TaskArgs { + // No arguments for this task +} + +/** + * Explicit global address book sync. + * + * Runs the full sync (00_sync.ts) over every contract in every address book, + * reconciling on-chain implementation state with the recorded address books and + * rocketh deployment records. Use this when: + * + * - You want a full overview of address book state + * - Governance executed a TX batch out-of-band and address books need to catch up + * - A fork was reset and rocketh records need to be rebuilt + * + * Per-component actions sync the contracts they touch immediately before and + * after their work, so this task is no longer required as a prerequisite for + * normal `--tags Component,verb` invocations. + * + * Usage: + * npx hardhat deploy:sync --network arbitrumOne + * npx hardhat deploy:sync --network localhost (auto-detects fork network) + */ +const action: NewTaskActionFunction = async (_taskArgs, hre) => { + // Sync is read-only, so suppress the gas-price confirmation prompt that the + // rocketh deploy task shows by default. + await hre.tasks.getTask('deploy').run({ tags: 'sync', skipPrompts: true }) +} + +const syncTask = task('deploy:sync', 'Sync address books and deployment records with on-chain state') + .setAction(async () => ({ default: action })) + .build() + +export default syncTask diff --git a/packages/deployment/tasks/verify-contract.ts b/packages/deployment/tasks/verify-contract.ts index 793f921f3..921465dae 100644 --- a/packages/deployment/tasks/verify-contract.ts +++ b/packages/deployment/tasks/verify-contract.ts @@ -1,6 +1,6 @@ import { spawn } from 'child_process' import fs from 'fs' -import { configVariable, task } from 'hardhat/config' +import { task } from 'hardhat/config' import { ArgumentType } from 'hardhat/types/arguments' import type { NewTaskActionFunction } from 'hardhat/types/tasks' import os from 'os' @@ -8,6 +8,7 @@ import path from 'path' import { decodeAbiParameters } from 'viem' import type { AnyAddressBookOps } from '../lib/address-book-ops.js' +import { getLibraryResolver } from '../lib/artifact-loaders.js' import { computeBytecodeHash } from '../lib/bytecode-utils.js' import { type AddressBookType, @@ -17,7 +18,8 @@ import { getContractsByAddressBook, } from '../lib/contract-registry.js' import { loadArtifactFromSource } from '../lib/deploy-implementation.js' -import { verifyOZProxy } from '../lib/oz-proxy-verify.js' +import { checkEtherscanVerified, verifyOZProxy } from '../lib/oz-proxy-verify.js' +import { resolveConfigVar } from '../lib/task-utils.js' import { graph } from '../rocketh/deploy.js' const ADDRESS_BOOK_TYPES: AddressBookType[] = ['horizon', 'subgraph-service', 'issuance'] @@ -31,6 +33,8 @@ function getPackageDir(artifactSource: ArtifactSource): string { return 'packages/contracts' case 'subgraph-service': return 'packages/subgraph-service' + case 'horizon': + return 'packages/horizon' case 'issuance': return 'packages/issuance' case 'openzeppelin': @@ -50,6 +54,14 @@ function getFullyQualifiedContractName(artifactSource: ArtifactSource): string { case 'subgraph-service': // e.g., contracts/SubgraphService.sol:SubgraphService return `contracts/${artifactSource.name}.sol:${artifactSource.name}` + case 'horizon': { + // path is like 'contracts/staking/HorizonStaking.sol/HorizonStaking' + // Need to convert to 'contracts/staking/HorizonStaking.sol:HorizonStaking' + const parts = artifactSource.path.split('/') + const contractName = parts.pop()! + const solPath = parts.join('/') + return `${solPath}:${contractName}` + } case 'issuance': { // path is like 'contracts/allocate/IssuanceAllocator.sol/IssuanceAllocator' // Need to convert to 'contracts/allocate/IssuanceAllocator.sol:IssuanceAllocator' @@ -74,8 +86,8 @@ function findContractAddressBook( for (const addressBook of ADDRESS_BOOK_TYPES) { const metadata = getContractMetadata(addressBook, contractName) - // Only consider entries that are deployable and have an artifact source - if (metadata?.deployable && metadata.artifact) { + // Consider entries that are deployable with an artifact, or proxy-only contracts (shared impl) + if (metadata?.deployable && (metadata.artifact || metadata.proxyType)) { matches.push({ addressBook, metadata }) } } @@ -107,7 +119,7 @@ function getAllDeployableContracts(): Array<{ for (const addressBook of ADDRESS_BOOK_TYPES) { for (const [name, metadata] of getContractsByAddressBook(addressBook)) { - if (metadata.deployable && metadata.artifact) { + if (metadata.deployable && (metadata.artifact || metadata.proxyType)) { contracts.push({ name, addressBook, metadata }) } } @@ -116,32 +128,7 @@ function getAllDeployableContracts(): Array<{ return contracts } -/** - * Resolve a configuration variable using Hardhat's hook chain (keystore + env fallback) - */ -async function resolveConfigVar(hre: unknown, name: string): Promise { - try { - const variable = configVariable(name) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const hooks = (hre as any).hooks - - const value = await hooks.runHandlerChain( - 'configurationVariables', - 'fetchValue', - [variable], - async (_context: unknown, v: { name: string }) => { - const envValue = process.env[v.name] - if (typeof envValue !== 'string') { - throw new Error(`Environment variable ${v.name} not found`) - } - return envValue - }, - ) - return value - } catch { - return undefined - } -} +// resolveConfigVar imported from shared task-utils /** * Check if a package uses Hardhat v3 (which has different verify CLI options) @@ -348,7 +335,9 @@ function checkBytecodeMatch( } // Compare local artifact bytecodeHash with stored hash - const localBytecodeHash = computeBytecodeHash(artifact.deployedBytecode) + // Must pass linkReferences and resolver to match how hash was computed at deployment + const resolver = getLibraryResolver(metadata.artifact!.type) + const localBytecodeHash = computeBytecodeHash(artifact.deployedBytecode, artifact.deployedLinkReferences, resolver) if (localBytecodeHash !== deploymentMetadata.bytecodeHash) { return { matches: false, @@ -393,24 +382,23 @@ async function verifySingleContract( const isProxied = Boolean(metadata.proxyType) const implAddress = isProxied ? entry.implementation : entry.address + // Proxy-only contracts (shared implementation, no artifact) — only verify the proxy + // Implementation verification is handled by the shared _Implementation entry + const hasArtifact = Boolean(metadata.artifact) + // Check bytecode matches for implementation (using stored bytecodeHash) - if (implAddress) { + // This is a warning, not a blocker — Etherscan is the ultimate arbiter + let bytecodeMatches = true + if (hasArtifact && implAddress) { const bytecodeCheck = checkBytecodeMatch(contractName, metadata, addressBook) if (!bytecodeCheck.matches) { - return { - contract: contractName, - addressBook: addressBookType, - status: 'skipped', - reason: bytecodeCheck.reason, - } + bytecodeMatches = false + console.log(` ⚠️ ${bytecodeCheck.reason}`) } } - const packageDir = getPackageDir(metadata.artifact!) - const isHHv3 = isHardhatV3Package(metadata.artifact!) - const artifact = loadArtifactFromSource(metadata.artifact!) - const fullyQualifiedName = getFullyQualifiedContractName(metadata.artifact!) let implResult: { success: boolean; url?: string } = { success: true } + let verificationFailed = false // Get constructor args from deployment metadata const deploymentMetadata = addressBook.getDeploymentMetadata?.(contractName) @@ -423,75 +411,106 @@ async function verifySingleContract( if (entry.proxyDeployment?.verified) { console.log(` ✓ Proxy already verified: ${entry.proxyDeployment.verified}`) } else { - // Get proxy constructor args from address book (stored separately from implementation args) - const proxyArgsData = entry.proxyDeployment?.argsData - if (!proxyArgsData) { - console.log(` ⏭️ Proxy verification skipped (no constructor args in address book)`) + // Check Etherscan before submitting — avoids redundant submissions + const existingUrl = await checkEtherscanVerified(entry.address, apiKey, chainId) + if (existingUrl) { + console.log(` ✓ Proxy already verified: ${existingUrl}`) + addressBook.setVerified(contractName, existingUrl) } else { - console.log(` 📋 Verifying OZ TransparentUpgradeableProxy at: ${entry.address}`) - console.log(` 📦 Source: @openzeppelin/contracts v5.4.0 (from node_modules)`) + // Get proxy constructor args from address book (stored separately from implementation args) + const proxyArgsData = entry.proxyDeployment?.argsData + if (!proxyArgsData) { + console.log(` ⏭️ Proxy verification skipped (no constructor args in address book)`) + } else { + console.log(` 📋 Verifying OZ TransparentUpgradeableProxy at: ${entry.address}`) + console.log(` 📦 Source: @openzeppelin/contracts v5.4.0 (from node_modules)`) - const proxyResult = await verifyOZProxy(entry.address, proxyArgsData, apiKey, chainId) + const proxyResult = await verifyOZProxy(entry.address, proxyArgsData, apiKey, chainId) - if (proxyResult.success && proxyResult.url) { - console.log(` ✅ Proxy verification complete`) - // Record verification URL in address book (setVerified sets proxyDeployment.verified for proxied contracts) - addressBook.setVerified(contractName, proxyResult.url) - } else if (proxyResult.success) { - console.log(` ✅ Proxy verification complete (${proxyResult.message || 'no URL returned'})`) - } else { - console.log(` ⚠️ Proxy verification failed: ${proxyResult.message || 'unknown error'}`) + if (proxyResult.success && proxyResult.url) { + console.log(` ✅ Proxy verification complete`) + addressBook.setVerified(contractName, proxyResult.url) + } else if (proxyResult.success) { + console.log(` ✅ Proxy verification complete (${proxyResult.message || 'no URL returned'})`) + } else { + console.log(` ⚠️ Proxy verification failed: ${proxyResult.message || 'unknown error'}`) + verificationFailed = true + } } } } } // Verify implementation (if proxied and not proxy-only, or if not proxied) - if ((isProxied && !proxyOnly) || !isProxied) { + // Skip for proxy-only contracts with no artifact (shared implementation verified separately) + if (!hasArtifact) { + if (!proxyOnly) { + console.log(` ⏭️ Implementation verification skipped (shared implementation)`) + } + } else if ((isProxied && !proxyOnly) || !isProxied) { + const packageDir = getPackageDir(metadata.artifact!) + const isHHv3 = isHardhatV3Package(metadata.artifact!) + const artifact = loadArtifactFromSource(metadata.artifact!) + const fullyQualifiedName = getFullyQualifiedContractName(metadata.artifact!) + if (!implAddress) { console.log(' ⚠️ No implementation address found, skipping') } else { - // Skip if already verified + // Skip if already verified (local record) const implVerified = isProxied ? entry.implementationDeployment?.verified : entry.deployment?.verified if (implVerified) { const label = isProxied ? 'Implementation' : 'Contract' console.log(` ✓ ${label} already verified: ${implVerified}`) } else { - const label = isProxied ? 'implementation' : 'contract' - console.log(` 📋 Verifying ${label} at: ${implAddress}`) - // Pass constructor args for implementation contracts - // Use fullyQualifiedName to ensure hardhat uses current build artifacts - implResult = await runVerify( - packageDir, - networkName, - implAddress, - apiKey, - constructorArgsData, - artifact, - isHHv3, - fullyQualifiedName, - ) - if (implResult.success && implResult.url) { - console.log(` ✅ ${label.charAt(0).toUpperCase() + label.slice(1)} verification complete`) - // Record verification URL in address book + // Check Etherscan before attempting local verify — catches contracts + // verified out-of-band or where previous attempts failed locally + const existingImplUrl = await checkEtherscanVerified(implAddress, apiKey, chainId) + if (existingImplUrl) { + const label = isProxied ? 'Implementation' : 'Contract' + console.log(` ✓ ${label} already verified: ${existingImplUrl}`) if (isProxied) { - addressBook.setImplementationVerified(contractName, implResult.url) + addressBook.setImplementationVerified(contractName, existingImplUrl) } else { - addressBook.setVerified(contractName, implResult.url) + addressBook.setVerified(contractName, existingImplUrl) } - } else if (implResult.success) { - console.log(` ✅ ${label.charAt(0).toUpperCase() + label.slice(1)} verification complete`) + } else if (!bytecodeMatches) { + // Bytecode mismatch and not verified on Etherscan — skip + const label = isProxied ? 'Implementation' : 'Contract' + console.log(` ⏭️ ${label} verification skipped (bytecode mismatch)`) } else { - console.log( - ` ⚠️ ${label.charAt(0).toUpperCase() + label.slice(1)} verification failed (may already be verified)`, + const label = isProxied ? 'implementation' : 'contract' + console.log(` 📋 Verifying ${label} at: ${implAddress}`) + implResult = await runVerify( + packageDir, + networkName, + implAddress, + apiKey, + constructorArgsData, + artifact, + isHHv3, + fullyQualifiedName, ) + if (implResult.success && implResult.url) { + console.log(` ✅ ${label.charAt(0).toUpperCase() + label.slice(1)} verification complete`) + if (isProxied) { + addressBook.setImplementationVerified(contractName, implResult.url) + } else { + addressBook.setVerified(contractName, implResult.url) + } + } else if (implResult.success) { + console.log(` ✅ ${label.charAt(0).toUpperCase() + label.slice(1)} verification complete`) + } else { + console.log( + ` ⚠️ ${label.charAt(0).toUpperCase() + label.slice(1)} verification failed (may already be verified)`, + ) + verificationFailed = true + } } } } } - // Both failing or already verified is still "success" for the workflow - return { contract: contractName, addressBook: addressBookType, status: 'verified' } + return { contract: contractName, addressBook: addressBookType, status: verificationFailed ? 'failed' : 'verified' } } interface TaskArgs { @@ -534,7 +553,11 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { // Get API key from keystore const apiKey = await resolveConfigVar(hre, 'ARBISCAN_API_KEY') if (!apiKey) { - throw new Error('ARBISCAN_API_KEY not found. Set it in keystore:\n npx hardhat keystore set ARBISCAN_API_KEY') + throw new Error( + 'No Arbiscan API key configured.\n' + + 'Set via keystore: npx hardhat keystore set ARBISCAN_API_KEY\n' + + 'Or environment: export ARBISCAN_API_KEY=...', + ) } // Determine contracts to verify @@ -548,7 +571,7 @@ const action: NewTaskActionFunction = async (taskArgs, hre) => { if (explicitAddressBook) { addressBookType = explicitAddressBook as AddressBookType const foundMetadata = getContractMetadata(addressBookType, contract) - if (!foundMetadata?.deployable || !foundMetadata.artifact) { + if (!foundMetadata?.deployable || (!foundMetadata.artifact && !foundMetadata.proxyType)) { throw new Error(`Contract ${contract} not found as deployable in ${addressBookType} registry`) } metadata = foundMetadata diff --git a/packages/deployment/test/bytecode-comparison.test.ts b/packages/deployment/test/bytecode-comparison.test.ts index 394cf57e4..8e0ebef27 100644 --- a/packages/deployment/test/bytecode-comparison.test.ts +++ b/packages/deployment/test/bytecode-comparison.test.ts @@ -1,6 +1,11 @@ import { expect } from 'chai' -import { computeBytecodeHash, stripMetadata } from '../lib/bytecode-utils.js' +import { + computeBytecodeHash, + type LibraryArtifactResolver, + type LinkReferences, + stripMetadata, +} from '../lib/bytecode-utils.js' import { loadContractsArtifact } from '../lib/deploy-implementation.js' /** @@ -102,6 +107,55 @@ describe('Bytecode Utilities', function () { expect(hash).to.be.a('string') expect(hash).to.match(/^0x[a-f0-9]{64}$/) }) + + it('should handle bytecode with unlinked library placeholders', function () { + // Library placeholders are deterministic (keccak256 of "path:name")) and + // included as-is in the hash — they're part of the artifact identity + const placeholder = '__$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$__' + const code = '0x' + BASE_CODE + '73' + placeholder + METADATA_A + const hash = computeBytecodeHash(code) + expect(hash).to.be.a('string') + expect(hash).to.match(/^0x[a-f0-9]{64}$/) + }) + + it('should detect code changes around library placeholders', function () { + const placeholder = '__$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$__' + const codeA = '0x' + BASE_CODE + '73' + placeholder + METADATA_A + const codeB = '0x' + BASE_CODE + '6001' + '73' + placeholder + METADATA_A + expect(computeBytecodeHash(codeA)).to.not.equal(computeBytecodeHash(codeB)) + }) + + it('should resolve library placeholders with resolver', async function () { + const { keccak256: k, toUtf8Bytes: u } = await import('ethers') + const libPath = 'contracts/libs/MyLib.sol' + const libName = 'MyLib' + const placeholderHash = k(u(`${libPath}:${libName}`)).slice(2, 36) + const placeholder = `__$${placeholderHash}$__` + // Use placeholder in middle with enough valid hex around it, plus metadata suffix + const code = '0x' + BASE_CODE + '73' + placeholder + BASE_CODE + METADATA_A + + const linkRefs: LinkReferences = { + [libPath]: { [libName]: [{ length: 20, start: 0 }] }, + } + const libBytecodeA = '0x6001600201' + const libBytecodeB = '0x6001600301' // different library code + + const resolver: LibraryArtifactResolver = () => ({ + deployedBytecode: libBytecodeA, + }) + const resolverB: LibraryArtifactResolver = () => ({ + deployedBytecode: libBytecodeB, + }) + + const hashA = computeBytecodeHash(code, linkRefs, resolver) + const hashB = computeBytecodeHash(code, linkRefs, resolverB) + const hashNoResolver = computeBytecodeHash(code) + + // Different library code should produce different hashes + expect(hashA).to.not.equal(hashB) + // With resolver should differ from without (zero-filled) + expect(hashA).to.not.equal(hashNoResolver) + }) }) }) diff --git a/packages/deployment/test/chain-id-resolution.test.ts b/packages/deployment/test/chain-id-resolution.test.ts index 356f653d8..3e5948580 100644 --- a/packages/deployment/test/chain-id-resolution.test.ts +++ b/packages/deployment/test/chain-id-resolution.test.ts @@ -1,16 +1,18 @@ import type { Environment } from '@rocketh/core/types' import { expect } from 'chai' -import { getForkTargetChainId, getTargetChainIdFromEnv } from '../lib/address-book-utils.js' +import { getForkNetwork, getForkTargetChainId, getTargetChainIdFromEnv, isForkMode } from '../lib/address-book-utils.js' describe('Chain ID Resolution', function () { // Store original env vars to restore after tests let originalHardhatFork: string | undefined let originalForkNetwork: string | undefined + let originalHardhatNetwork: string | undefined beforeEach(function () { originalHardhatFork = process.env.HARDHAT_FORK originalForkNetwork = process.env.FORK_NETWORK + originalHardhatNetwork = process.env.HARDHAT_NETWORK }) afterEach(function () { @@ -25,6 +27,11 @@ describe('Chain ID Resolution', function () { } else { process.env.FORK_NETWORK = originalForkNetwork } + if (originalHardhatNetwork === undefined) { + delete process.env.HARDHAT_NETWORK + } else { + process.env.HARDHAT_NETWORK = originalHardhatNetwork + } }) describe('getForkTargetChainId', function () { @@ -81,6 +88,116 @@ describe('Chain ID Resolution', function () { expect(() => getForkTargetChainId()).to.throw('Unknown fork network: unknownNetwork') }) + + it('should return null when FORK_NETWORK is set but network is a real network', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'arbitrumSepolia' + + const result = getForkTargetChainId() + expect(result).to.be.null + }) + + it('should return chain ID when FORK_NETWORK is set and network is localhost', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'localhost' + + const result = getForkTargetChainId() + expect(result).to.equal(421614) + }) + + it('should return chain ID when explicit networkName is localhost', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'arbitrumSepolia' // would normally prevent fork mode + + // Explicit networkName overrides HARDHAT_NETWORK + const result = getForkTargetChainId('localhost') + expect(result).to.equal(421614) + }) + + it('should return null when explicit networkName is a real network', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + delete process.env.HARDHAT_NETWORK + + const result = getForkTargetChainId('arbitrumSepolia') + expect(result).to.be.null + }) + }) + + describe('isForkMode (network-aware)', function () { + it('should return false when no fork env vars are set', function () { + delete process.env.HARDHAT_FORK + delete process.env.FORK_NETWORK + + expect(isForkMode()).to.be.false + }) + + it('should return true when FORK_NETWORK is set and HARDHAT_NETWORK is localhost', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'localhost' + + expect(isForkMode()).to.be.true + }) + + it('should return true when FORK_NETWORK is set and HARDHAT_NETWORK is fork', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'fork' + + expect(isForkMode()).to.be.true + }) + + it('should return false when FORK_NETWORK is set but HARDHAT_NETWORK is a real network', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'arbitrumSepolia' + + expect(isForkMode()).to.be.false + }) + + it('should return false when FORK_NETWORK is set but HARDHAT_NETWORK is arbitrumOne', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'arbitrumOne' + + expect(isForkMode()).to.be.false + }) + + it('should use explicit networkName over HARDHAT_NETWORK', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'arbitrumSepolia' // real network + + // Explicit networkName says localhost - should be fork mode + expect(isForkMode('localhost')).to.be.true + }) + + it('should return false with explicit real networkName even if HARDHAT_NETWORK is local', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'localhost' + + // Explicit networkName says real network - should not be fork mode + expect(isForkMode('arbitrumSepolia')).to.be.false + }) + + it('should return true when FORK_NETWORK is set and no network context available', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + delete process.env.HARDHAT_NETWORK + + // No context - preserves existing behavior (trusts env var) + expect(isForkMode()).to.be.true + }) + }) + + describe('getForkNetwork (network-aware)', function () { + it('should return null on real networks even if FORK_NETWORK is set', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'arbitrumSepolia' + + expect(getForkNetwork()).to.be.null + }) + + it('should return fork network name on localhost', function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + process.env.HARDHAT_NETWORK = 'localhost' + + expect(getForkNetwork()).to.equal('arbitrumSepolia') + }) }) describe('getTargetChainIdFromEnv', function () { @@ -89,6 +206,7 @@ describe('Chain ID Resolution', function () { // Mock environment - provider won't be called in fork mode const mockEnv = { + name: 'localhost', network: { provider: { request: () => { @@ -108,6 +226,7 @@ describe('Chain ID Resolution', function () { // Mock environment with provider returning 421614 const mockEnv = { + name: 'arbitrumSepolia', network: { provider: { request: async ({ method }: { method: string }) => { @@ -130,6 +249,7 @@ describe('Chain ID Resolution', function () { // Test Arbitrum One (42161 = 0xA4B1) const mockEnvArb = { + name: 'arbitrumOne', network: { provider: { request: async () => '0xa4b1', // 42161 in hex @@ -140,17 +260,18 @@ describe('Chain ID Resolution', function () { const resultArb = await getTargetChainIdFromEnv(mockEnvArb) expect(resultArb).to.equal(42161) - // Test localhost (31337 = 0x7A69) - const mockEnvLocal = { + // Test Ethereum mainnet (1 = 0x1) + const mockEnvMainnet = { + name: 'mainnet', network: { provider: { - request: async () => '0x7a69', // 31337 in hex + request: async () => '0x1', // 1 in hex }, }, } as unknown as Environment - const resultLocal = await getTargetChainIdFromEnv(mockEnvLocal) - expect(resultLocal).to.equal(31337) + const resultMainnet = await getTargetChainIdFromEnv(mockEnvMainnet) + expect(resultMainnet).to.equal(1) }) it('should prefer fork chain ID over provider chain ID when forking', async function () { @@ -158,6 +279,7 @@ describe('Chain ID Resolution', function () { // Mock provider returning 31337 (local hardhat node) const mockEnv = { + name: 'localhost', network: { provider: { request: async () => '0x7a69', // 31337 in hex @@ -169,6 +291,24 @@ describe('Chain ID Resolution', function () { // Should return fork target (42161), not provider chain ID (31337) expect(result).to.equal(42161) }) + + it('should return provider chain ID on real network even if FORK_NETWORK is set', async function () { + process.env.FORK_NETWORK = 'arbitrumSepolia' + + // Running on arbitrumOne - FORK_NETWORK should be ignored + const mockEnv = { + name: 'arbitrumOne', + network: { + provider: { + request: async () => '0xa4b1', // 42161 in hex + }, + }, + } as unknown as Environment + + const result = await getTargetChainIdFromEnv(mockEnv) + // Should return provider chain ID (42161), not fork target (421614) + expect(result).to.equal(42161) + }) }) describe('Integration: Fork mode detection', function () { @@ -178,6 +318,7 @@ describe('Chain ID Resolution', function () { delete process.env.FORK_NETWORK const mockEnvNonFork = { + name: 'arbitrumSepolia', network: { provider: { request: async () => '0x66eee', // 421614 @@ -186,7 +327,7 @@ describe('Chain ID Resolution', function () { } as unknown as Environment const nonForkChainId = await getTargetChainIdFromEnv(mockEnvNonFork) - const forkChainId1 = getForkTargetChainId() + const forkChainId1 = getForkTargetChainId('arbitrumSepolia') expect(forkChainId1).to.be.null expect(nonForkChainId).to.equal(421614) @@ -195,6 +336,7 @@ describe('Chain ID Resolution', function () { process.env.FORK_NETWORK = 'arbitrumSepolia' const mockEnvFork = { + name: 'localhost', network: { provider: { request: async () => '0x7a69', // 31337 (local node) @@ -203,7 +345,7 @@ describe('Chain ID Resolution', function () { } as unknown as Environment const forkModeChainId = await getTargetChainIdFromEnv(mockEnvFork) - const forkChainId2 = getForkTargetChainId() + const forkChainId2 = getForkTargetChainId('localhost') expect(forkChainId2).to.equal(421614) expect(forkModeChainId).to.equal(421614) // Fork target, not 31337 diff --git a/packages/deployment/test/config-reconciliation.test.ts b/packages/deployment/test/config-reconciliation.test.ts new file mode 100644 index 000000000..2ea3fd131 --- /dev/null +++ b/packages/deployment/test/config-reconciliation.test.ts @@ -0,0 +1,231 @@ +import { expect } from 'chai' +import { HDNodeWallet } from 'ethers' +import fs from 'fs' +import JSON5 from 'json5' +import path from 'path' +import { fileURLToPath } from 'url' + +/** + * Deployment config reconciliation + * + * Catches drift between the per-network Ignition config files in + * `packages/horizon/ignition/configs/` and `packages/subgraph-service/ignition/configs/`. + * + * Four checks: + * + * 1. Cross-package sibling agreement. For each `(prefix, network)` pair where both + * horizon and subgraph-service have a config file (e.g. both `migrate.arbitrumOne.json5`), + * every overlapping non-empty `$global` field must match. Catches the failure mode where + * one package is updated but the sibling drifts. + * + * 2. localNetwork all-files `$global` agreement. For localNetwork specifically (one stack, + * one governor) every `$global` field meaningfully declared in more than one of the four + * `{horizon,subgraph-service}/{migrate,protocol}.localNetwork.json5` files must match + * across all of them. Stricter than #1 — catches same-package cross-prefix drift. + * + * 3. localNetwork same-package cross-prefix sub-object agreement. For localNetwork, each + * package's per-contract config blocks (e.g. `"DisputeManager": { ... }`) must agree + * leaf-by-leaf between `migrate` and `protocol`. Catches drift in things like + * `eip712Name`/`eip712Version` (which would silently break signature verification) and + * `disputePeriod`/`disputeDeposit` parameters. Restricted to localNetwork because for + * other networks (notably `default`) migrate and protocol are intentionally different + * templates with different parameter values. + * + * 4. localNetwork mnemonic-index correctness. Lines like + * "governor": "0x70997970…", // index 1 + * must have an address that derives from the hardhat default mnemonic at the stated + * BIP44 index. Catches copy-paste mistakes where someone updates the value but not the + * comment, or vice versa. + */ + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +const HARDHAT_DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk' +const PACKAGES_DIR = path.resolve(__dirname, '../..') +const PACKAGES = ['horizon', 'subgraph-service'] as const +const CONFIG_FILE_RE = /^(migrate|protocol)\.(.+)\.json5$/ + +type ConfigPrefix = 'migrate' | 'protocol' + +interface ConfigFile { + package: string + network: string + prefix: ConfigPrefix + filePath: string + globalFields: Record + subObjects: Record> + rawText: string +} + +function discoverConfigs(): ConfigFile[] { + const out: ConfigFile[] = [] + for (const pkg of PACKAGES) { + const dir = path.join(PACKAGES_DIR, pkg, 'ignition/configs') + if (!fs.existsSync(dir)) continue + for (const file of fs.readdirSync(dir)) { + const m = CONFIG_FILE_RE.exec(file) + if (!m) continue + const filePath = path.join(dir, file) + const rawText = fs.readFileSync(filePath, 'utf8') + const parsed = JSON5.parse>(rawText) + const globalFields = (parsed.$global ?? {}) as Record + const subObjects: Record> = {} + for (const [k, v] of Object.entries(parsed)) { + if (k === '$global') continue + if (typeof v === 'object' && v !== null && !Array.isArray(v)) { + subObjects[k] = v as Record + } + } + out.push({ + package: pkg, + network: m[2], + prefix: m[1] as ConfigPrefix, + filePath, + globalFields, + subObjects, + rawText, + }) + } + } + return out +} + +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + +function isMeaningful(value: unknown): boolean { + if (value === '' || value === null || value === undefined) return false + if (typeof value === 'string' && value.toLowerCase() === ZERO_ADDRESS) return false + return true +} + +function deriveHardhatAddress(index: number): string { + return HDNodeWallet.fromPhrase(HARDHAT_DEFAULT_MNEMONIC, undefined, `m/44'/60'/0'/0/${index}`).address +} + +function groupByPrefixAndNetwork(configs: ConfigFile[]): Map { + const out = new Map() + for (const c of configs) { + const key = `${c.prefix}.${c.network}` + if (!out.has(key)) out.set(key, []) + out.get(key)!.push(c) + } + return out +} + +describe('Deployment Config Reconciliation', () => { + const configs = discoverConfigs() + const grouped = groupByPrefixAndNetwork(configs) + + describe('Cross-package sibling agreement', () => { + for (const [key, files] of grouped) { + if (files.length < 2) continue + + it(`${key}.json5: overlapping $global fields agree across packages`, () => { + const overlap = new Set() + for (const field of Object.keys(files[0].globalFields)) { + if (files.every((f) => isMeaningful(f.globalFields[field]))) overlap.add(field) + } + + const mismatches: string[] = [] + for (const field of overlap) { + const distinct = new Set(files.map((f) => JSON.stringify(f.globalFields[field]))) + if (distinct.size > 1) { + const summary = files.map((f) => ` ${f.package}: ${JSON.stringify(f.globalFields[field])}`).join('\n') + mismatches.push(` ${field}:\n${summary}`) + } + } + + expect(mismatches, `Cross-package mismatches in ${key}.json5:\n${mismatches.join('\n')}`).to.have.lengthOf(0) + }) + } + }) + + describe('localNetwork all-files agreement', () => { + const localNetworkFiles = configs.filter((c) => c.network === 'localNetwork') + + if (localNetworkFiles.length >= 2) { + it('localNetwork: $global identity fields agree across all (package, prefix) files', () => { + const allFields = new Set() + for (const f of localNetworkFiles) { + for (const [k, v] of Object.entries(f.globalFields)) { + if (isMeaningful(v)) allFields.add(k) + } + } + + const mismatches: string[] = [] + for (const field of allFields) { + const present = localNetworkFiles.filter((f) => isMeaningful(f.globalFields[field])) + if (present.length < 2) continue + const distinct = new Set(present.map((f) => JSON.stringify(f.globalFields[field]))) + if (distinct.size > 1) { + const summary = present + .map((f) => ` ${f.package}/${f.prefix}.localNetwork.json5: ${JSON.stringify(f.globalFields[field])}`) + .join('\n') + mismatches.push(` ${field}:\n${summary}`) + } + } + + expect( + mismatches, + `localNetwork identity-field mismatches across files:\n${mismatches.join('\n')}`, + ).to.have.lengthOf(0) + }) + } + }) + + describe('localNetwork same-package cross-prefix sub-object agreement', () => { + // localNetwork-only: one stack, so per-contract config in protocol and migrate must agree. + // For other networks (e.g. `default`), migrate and protocol are different templates with + // intentionally different parameter values. + for (const pkg of PACKAGES) { + const migrate = configs.find((c) => c.package === pkg && c.network === 'localNetwork' && c.prefix === 'migrate') + const protocol = configs.find((c) => c.package === pkg && c.network === 'localNetwork' && c.prefix === 'protocol') + if (!migrate || !protocol) continue + + it(`${pkg}/localNetwork: per-contract sub-object leaves agree across migrate and protocol`, () => { + const sharedKeys = Object.keys(migrate.subObjects).filter((k) => k in protocol.subObjects) + + const mismatches: string[] = [] + for (const subKey of sharedKeys) { + const m = migrate.subObjects[subKey] + const p = protocol.subObjects[subKey] + for (const leaf of new Set([...Object.keys(m), ...Object.keys(p)])) { + if (!(leaf in m) || !(leaf in p)) continue // declared in only one side + if (JSON.stringify(m[leaf]) !== JSON.stringify(p[leaf])) { + mismatches.push( + ` ${subKey}.${leaf}: migrate=${JSON.stringify(m[leaf])} protocol=${JSON.stringify(p[leaf])}`, + ) + } + } + } + + expect( + mismatches, + `Sub-object leaf mismatches in ${pkg}/localNetwork:\n${mismatches.join('\n')}`, + ).to.have.lengthOf(0) + }) + } + }) + + describe('localNetwork mnemonic-index comments', () => { + const indexCommentRe = /"(0x[a-fA-F0-9]{40})"\s*,?\s*\/\/\s*index\s+(\d+)/g + + for (const cfg of configs) { + if (cfg.network !== 'localNetwork') continue + + it(`${cfg.package}/${path.basename(cfg.filePath)}: addresses match // index N comments`, () => { + const errors: string[] = [] + for (const match of cfg.rawText.matchAll(indexCommentRe)) { + const [, address, indexStr] = match + const index = Number.parseInt(indexStr, 10) + const expected = deriveHardhatAddress(index) + if (address.toLowerCase() !== expected.toLowerCase()) { + errors.push(`address ${address} marked "// index ${index}" should be ${expected}`) + } + } + expect(errors, errors.join('\n')).to.have.lengthOf(0) + }) + } + }) +}) diff --git a/packages/deployment/test/should-seed-rocketh.test.ts b/packages/deployment/test/should-seed-rocketh.test.ts new file mode 100644 index 000000000..a982d02e0 --- /dev/null +++ b/packages/deployment/test/should-seed-rocketh.test.ts @@ -0,0 +1,126 @@ +import { expect } from 'chai' + +import { getLibraryResolver, loadDirectAllocationArtifact } from '../lib/artifact-loaders.js' +import { computeBytecodeHash } from '../lib/bytecode-utils.js' +import { Contracts } from '../lib/contract-registry.js' +import { type ContractSpec, shouldSeedRocketh } from '../lib/sync-utils.js' + +/** + * shouldSeedRocketh — gate that decides whether sync should write rocketh's + * deployment record from the local artifact. + * + * The gate exists to prevent a silent failure mode: seeding rocketh from a + * stale local artifact masks rocketh's bytecode-change detection on the next + * deployFn call (it ends up comparing the new artifact to itself), so the + * impl never gets redeployed and dependent proxies never receive a pending + * implementation. Concretely, this caused shared-impl proxies (DefaultAllocation, + * ReclaimedRewards) to get stuck on stale code with no upgrade triggered. + * + * The rules below are the truth table that pins the gate against future + * regressions of any of those failure modes. + */ + +const sharedImpl = Contracts.issuance.DirectAllocation_Implementation + +function specForSharedImpl(overrides: Partial = {}): ContractSpec { + return { + name: sharedImpl.name, + addressBookType: 'issuance', + address: '0x0000000000000000000000000000000000000aaa', + prerequisite: false, + artifact: sharedImpl.artifact, + ...overrides, + } +} + +function localArtifactHash(): string { + const artifact = loadDirectAllocationArtifact() + return computeBytecodeHash( + artifact.deployedBytecode ?? '0x', + artifact.deployedLinkReferences, + getLibraryResolver('issuance'), + ) +} + +describe('shouldSeedRocketh', () => { + it('seeds when name is unregistered (proxy-recursion synthetic name passthrough)', () => { + // Regression: my first attempt of this gate broke RewardsManager sync because + // the proxy path recurses with `${name}_Implementation` synthetic names that + // aren't real registry entries. The gate must let those fall through. + const spec = specForSharedImpl({ name: 'RewardsManager_Implementation' }) + const result = shouldSeedRocketh(spec, {}) + expect(result.seed).to.be.true + expect(result.reason).to.match(/unregistered/) + }) + + it('seeds when contract is a prerequisite (e.g. L2GraphToken passthrough)', () => { + // Regression: prerequisites are deployed externally and never run through + // deployFn, so dedup-masking doesn't apply. They still need an env record + // for downstream reads. Skipping the seed broke L2GraphToken. + const spec = specForSharedImpl({ prerequisite: true }) + const result = shouldSeedRocketh(spec, {}) + expect(result.seed).to.be.true + expect(result.reason).to.match(/prerequisite/) + }) + + it('seeds when no artifact is configured (legacy entries with no comparison possible)', () => { + const spec = specForSharedImpl({ artifact: undefined }) + const result = shouldSeedRocketh(spec, {}) + expect(result.seed).to.be.true + expect(result.reason).to.match(/no artifact/) + }) + + it('seeds when address-book has no entry (nothing to mask)', () => { + const spec = specForSharedImpl() + const addressBook = { entryExists: () => false } + const result = shouldSeedRocketh(spec, addressBook) + expect(result.seed).to.be.true + expect(result.reason).to.match(/no entry/) + }) + + it('seeds when entry exists but has no stored bytecodeHash', () => { + const spec = specForSharedImpl() + const addressBook = { + entryExists: () => true, + getDeploymentMetadata: () => undefined, + } + const result = shouldSeedRocketh(spec, addressBook) + expect(result.seed).to.be.true + expect(result.reason).to.match(/no hash/) + }) + + it('seeds when stored hash matches local artifact hash (artifact verified)', () => { + const spec = specForSharedImpl() + const addressBook = { + entryExists: () => true, + getDeploymentMetadata: () => ({ + bytecodeHash: localArtifactHash(), + txHash: '', + argsData: '0x', + }), + } + const result = shouldSeedRocketh(spec, addressBook) + expect(result.seed).to.be.true + expect(result.reason).to.match(/verified/) + }) + + it('skips seed when stored hash does not match local artifact hash', () => { + // The core bug. Without this skip, sync seeds rocketh with the local + // artifact bytecode; rocketh then sees its own seeded bytecode == artifact + // and reports newlyDeployed=false on the next deployFn — masking the drift + // and stranding any proxy that depends on this impl with code-changed but + // no pendingImplementation. + const spec = specForSharedImpl() + const addressBook = { + entryExists: () => true, + getDeploymentMetadata: () => ({ + bytecodeHash: '0xstalehashfromearlierdeployment', + txHash: '', + argsData: '0x', + }), + } + const result = shouldSeedRocketh(spec, addressBook) + expect(result.seed).to.be.false + expect(result.reason).to.match(/unverified/) + }) +}) diff --git a/packages/deployment/tsconfig.json b/packages/deployment/tsconfig.json index 75fbe69b6..b97d405ac 100644 --- a/packages/deployment/tsconfig.json +++ b/packages/deployment/tsconfig.json @@ -5,6 +5,6 @@ "rootDir": ".", "composite": true }, - "include": ["lib/**/*", "tasks/**/*", "governance/**/*", "deploy/**/*", "rocketh/**/*", "hardhat.config.ts"], + "include": ["lib/**/*", "tasks/**/*", "deploy/**/*", "rocketh/**/*", "types/**/*", "hardhat.config.ts"], "exclude": ["node_modules", "dist", "artifacts", "cache", "test"] } diff --git a/packages/deployment/types/rocketh.d.ts b/packages/deployment/types/rocketh.d.ts new file mode 100644 index 000000000..af44ad34a --- /dev/null +++ b/packages/deployment/types/rocketh.d.ts @@ -0,0 +1,24 @@ +// Type augmentation: rocketh's skip() support is enabled via pnpm patch (patches/rocketh@0.17.13.patch). +// Deploy scripts also have early-return guards as a safety net. +import type { + UnknownDeployments, + UnresolvedNetworkSpecificData, + UnresolvedUnknownNamedAccounts, +} from '@rocketh/core/types' + +declare module '@rocketh/core/types' { + interface DeployScriptModule< + // eslint-disable-next-line @typescript-eslint/no-unused-vars + NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ArgumentsTypes = undefined, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + Deployments extends UnknownDeployments = UnknownDeployments, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + Extra extends Record = Record, + > { + skip?: () => Promise + } +} diff --git a/packages/horizon/ignition/modules/core/HorizonStaking.ts b/packages/horizon/ignition/modules/core/HorizonStaking.ts index a7bec9076..ec98c1066 100644 --- a/packages/horizon/ignition/modules/core/HorizonStaking.ts +++ b/packages/horizon/ignition/modules/core/HorizonStaking.ts @@ -15,12 +15,16 @@ export default buildModule('HorizonStaking', (m) => { const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') const maxThawingPeriod = m.getParameter('maxThawingPeriod') - // Deploy HorizonStaking implementation - const HorizonStakingImplementation = deployImplementation(m, { - name: 'HorizonStaking', - artifact: HorizonStakingArtifact, - constructorArgs: [Controller, subgraphServiceAddress], - }) + // Deploy HorizonStaking implementation - requires periphery and proxies to be registered in the controller + const HorizonStakingImplementation = deployImplementation( + m, + { + name: 'HorizonStaking', + artifact: HorizonStakingArtifact, + constructorArgs: [Controller, subgraphServiceAddress], + }, + { after: [GraphPeripheryModule, HorizonProxiesModule] }, + ) // Upgrade proxy to implementation contract const HorizonStaking = upgradeGraphProxy(m, GraphProxyAdmin, HorizonStakingProxy, HorizonStakingImplementation, { diff --git a/packages/subgraph-service/tasks/deploy.ts b/packages/subgraph-service/tasks/deploy.ts index 581138439..860e8c67b 100644 --- a/packages/subgraph-service/tasks/deploy.ts +++ b/packages/subgraph-service/tasks/deploy.ts @@ -91,6 +91,7 @@ task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon cont subgraphServiceProxyAddress: proxiesDeployment.Transparent_Proxy_SubgraphService.target as string, subgraphServiceProxyAdminAddress: proxiesDeployment.Transparent_ProxyAdmin_SubgraphService.target as string, graphTallyCollectorAddress: horizonDeployment.GraphTallyCollector.target as string, + recurringCollectorAddress: horizonDeployment.Transparent_Proxy_RecurringCollector.target as string, gnsProxyAddress: horizonDeployment.Graph_Proxy_L2GNS.target as string, gnsImplementationAddress: horizonDeployment.Implementation_L2GNS.target as string, subgraphNFTAddress: horizonDeployment.SubgraphNFT.target as string, diff --git a/packages/toolshed/src/deployments/address-book.ts b/packages/toolshed/src/deployments/address-book.ts index 63bbc26f6..147bc61c5 100644 --- a/packages/toolshed/src/deployments/address-book.ts +++ b/packages/toolshed/src/deployments/address-book.ts @@ -17,8 +17,8 @@ export type AddressBookJson=8.0.0' + specifier: 'catalog:' version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) typechain: - specifier: ^8.3.0 + specifier: 'catalog:' version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: specifier: 'catalog:' @@ -753,6 +737,9 @@ importers: '@graphprotocol/horizon': specifier: workspace:* version: link:../horizon + '@graphprotocol/interfaces': + specifier: workspace:* + version: link:../interfaces '@graphprotocol/issuance': specifier: workspace:* version: link:../issuance @@ -798,13 +785,13 @@ importers: version: 0.17.11(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/doc': specifier: ^0.17.16 - version: 0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/export': specifier: ^0.17.16 - version: 0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/node': specifier: ^0.17.16 - version: 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/proxy': specifier: ^0.17.12 version: 0.17.12(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -813,7 +800,7 @@ importers: version: 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@rocketh/verifier': specifier: ^0.17.16 - version: 0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@types/chai': specifier: ^4.3.0 version: 4.3.20 @@ -831,7 +818,10 @@ importers: version: 9.39.2(jiti@2.5.1) hardhat-deploy: specifier: 2.0.0-next.61 - version: 2.0.0-next.61(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(hardhat@3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 2.0.0-next.61(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(hardhat@3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + json5: + specifier: ^2.2.3 + version: 2.2.3 lint-staged: specifier: 'catalog:' version: 16.2.7 @@ -840,7 +830,7 @@ importers: version: 10.8.2 rocketh: specifier: ^0.17.13 - version: 0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) ts-node: specifier: ^10.9.0 version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) @@ -861,7 +851,7 @@ importers: version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: specifier: ^4.3.7 - version: 4.4.3(supports-color@9.4.0) + version: 4.4.3(supports-color@8.1.1) json5: specifier: ^2.2.3 version: 2.2.3 @@ -1371,7 +1361,7 @@ importers: version: 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 3.4.2 version: 3.4.2 @@ -1494,7 +1484,7 @@ importers: version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: specifier: ^4.4.0 - version: 4.4.3(supports-color@9.4.0) + version: 4.4.3(supports-color@8.1.1) ethers: specifier: 'catalog:' version: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -2563,20 +2553,12 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ethereum-waffle/chai@3.4.4': - resolution: {integrity: sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==} - engines: {node: '>=10.0'} - '@ethereum-waffle/chai@4.0.10': resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} engines: {node: '>=10.0'} peerDependencies: ethers: '*' - '@ethereum-waffle/compiler@3.4.4': - resolution: {integrity: sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==} - engines: {node: '>=10.0'} - '@ethereum-waffle/compiler@4.0.3': resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} engines: {node: '>=10.0'} @@ -2585,10 +2567,6 @@ packages: solc: '*' typechain: ^8.0.0 - '@ethereum-waffle/ens@3.4.4': - resolution: {integrity: sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==} - engines: {node: '>=10.0'} - '@ethereum-waffle/ens@4.0.3': resolution: {integrity: sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==} engines: {node: '>=10.0'} @@ -2597,20 +2575,12 @@ packages: '@ensdomains/resolver': ^0.2.4 ethers: '*' - '@ethereum-waffle/mock-contract@3.4.4': - resolution: {integrity: sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==} - engines: {node: '>=10.0'} - '@ethereum-waffle/mock-contract@4.0.4': resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} engines: {node: '>=10.0'} peerDependencies: ethers: '*' - '@ethereum-waffle/provider@3.4.4': - resolution: {integrity: sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==} - engines: {node: '>=10.0'} - '@ethereum-waffle/provider@4.0.5': resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} engines: {node: '>=10.0'} @@ -2659,9 +2629,6 @@ packages: '@ethereumjs/vm@5.6.0': resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==} - '@ethersproject/abi@5.0.0-beta.153': - resolution: {integrity: sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==} - '@ethersproject/abi@5.6.0': resolution: {integrity: sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg==} @@ -3535,14 +3502,6 @@ packages: '@ledgerhq/logs@5.50.0': resolution: {integrity: sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==} - '@ljharb/resumer@0.0.1': - resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==} - engines: {node: '>= 0.4'} - - '@ljharb/through@2.3.14': - resolution: {integrity: sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==} - engines: {node: '>= 0.4'} - '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -3888,9 +3847,6 @@ packages: '@openzeppelin/contracts@3.4.2': resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} - '@openzeppelin/contracts@4.9.6': - resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} - '@openzeppelin/contracts@5.4.0': resolution: {integrity: sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==} @@ -4023,27 +3979,15 @@ packages: '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} - '@resolver-engine/core@0.2.1': - resolution: {integrity: sha512-nsLQHmPJ77QuifqsIvqjaF5B9aHnDzJjp73Q1z6apY3e9nqYrx4Dtowhpsf7Jwftg/XzVDEMQC+OzUBNTS+S1A==} - '@resolver-engine/core@0.3.3': resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} - '@resolver-engine/fs@0.2.1': - resolution: {integrity: sha512-7kJInM1Qo2LJcKyDhuYzh9ZWd+mal/fynfL9BNjWOiTcOpX+jNfqb/UmGUqros5pceBITlWGqS4lU709yHFUbg==} - '@resolver-engine/fs@0.3.3': resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} - '@resolver-engine/imports-fs@0.2.2': - resolution: {integrity: sha512-gFCgMvCwyppjwq0UzIjde/WI+yDs3oatJhozG9xdjJdewwtd7LiF0T5i9lrHAUtqrQbqoFE4E+ZMRVHWpWHpKQ==} - '@resolver-engine/imports-fs@0.3.3': resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} - '@resolver-engine/imports@0.2.2': - resolution: {integrity: sha512-u5/HUkvo8q34AA+hnxxqqXGfby5swnH0Myw91o3Sm2TETJlNKXibFGSKBavAH+wvWdBi4Z5gS2Odu0PowgVOUg==} - '@resolver-engine/imports@0.3.3': resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} @@ -4149,14 +4093,6 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@0.14.0': - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -4371,14 +4307,6 @@ packages: '@streamparser/json@0.0.22': resolution: {integrity: sha512-b6gTSBjJ8G8SuO3Gbbj+zXbVx8NSs1EbpbMKpzGLWMdkR+98McH9bEjSz3+0mPJf68c5nxa3CrJHp5EQNXM6zQ==} - '@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'} @@ -4427,12 +4355,6 @@ packages: typechain: ^8.1.1 typescript: '>=4.3.0' - '@typechain/ethers-v5@2.0.0': - resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==} - peerDependencies: - ethers: ^5.0.0 - typechain: ^3.0.0 - '@typechain/ethers-v6@0.5.1': resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} peerDependencies: @@ -4479,9 +4401,6 @@ packages: '@types/bn.js@5.2.0': resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} @@ -4546,9 +4465,6 @@ packages: '@types/katex@0.16.7': resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/level-errors@3.0.2': resolution: {integrity: sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==} @@ -4592,12 +4508,6 @@ packages: '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - '@types/resolve@0.0.8': - resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} - - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} @@ -4764,9 +4674,6 @@ packages: '@whatwg-node/server@0.7.7': resolution: {integrity: sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg==} - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -4800,24 +4707,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - abstract-leveldown@2.6.3: - resolution: {integrity: sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - abstract-leveldown@2.7.2: - resolution: {integrity: sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - abstract-leveldown@3.0.0: - resolution: {integrity: sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==} - engines: {node: '>=4'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - abstract-leveldown@5.0.0: - resolution: {integrity: sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - abstract-leveldown@6.2.3: resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} engines: {node: '>=6'} @@ -4853,9 +4742,6 @@ packages: aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - aes-js@3.1.2: - resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} - aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} @@ -4884,9 +4770,6 @@ packages: ajv: optional: true - ajv@5.5.2: - resolution: {integrity: sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4938,10 +4821,6 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -4961,9 +4840,6 @@ packages: antlr4ts@0.5.0-alpha.4: resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - anymatch@1.3.2: - resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4988,30 +4864,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - arr-diff@2.0.0: - resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} - engines: {node: '>=0.10.0'} - - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - - array-back@1.0.4: - resolution: {integrity: sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==} - engines: {node: '>=0.12.0'} - - array-back@2.0.0: - resolution: {integrity: sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==} - engines: {node: '>=4'} - array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} @@ -5042,14 +4894,6 @@ packages: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} - array-unique@0.2.1: - resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} - engines: {node: '>=0.10.0'} - - array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - array.prototype.findlastindex@1.2.6: resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} @@ -5062,10 +4906,6 @@ packages: resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} - array.prototype.reduce@1.0.8: - resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -5073,9 +4913,6 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} @@ -5094,10 +4931,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - ast-parents@0.0.1: resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} @@ -5105,9 +4938,6 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - async-eventemitter@0.2.4: resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} @@ -5127,9 +4957,6 @@ packages: async@1.5.2: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - async@2.6.2: - resolution: {integrity: sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==} - async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -5143,11 +4970,6 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -5175,63 +4997,12 @@ packages: axios@1.12.2: resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - babel-code-frame@6.26.0: - resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} - - babel-core@6.26.3: - resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} - - babel-generator@6.26.1: - resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} - - babel-helper-builder-binary-assignment-operator-visitor@6.24.1: - resolution: {integrity: sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==} - - babel-helper-call-delegate@6.24.1: - resolution: {integrity: sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==} - - babel-helper-define-map@6.26.0: - resolution: {integrity: sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==} - - babel-helper-explode-assignable-expression@6.24.1: - resolution: {integrity: sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==} - - babel-helper-function-name@6.24.1: - resolution: {integrity: sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==} - - babel-helper-get-function-arity@6.24.1: - resolution: {integrity: sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==} - - babel-helper-hoist-variables@6.24.1: - resolution: {integrity: sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==} - - babel-helper-optimise-call-expression@6.24.1: - resolution: {integrity: sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==} - - babel-helper-regex@6.26.0: - resolution: {integrity: sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==} - - babel-helper-remap-async-to-generator@6.24.1: - resolution: {integrity: sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==} - - babel-helper-replace-supers@6.24.1: - resolution: {integrity: sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==} - - babel-helpers@6.24.1: - resolution: {integrity: sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==} - babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 - babel-messages@6.23.0: - resolution: {integrity: sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==} - - babel-plugin-check-es2015-constants@6.22.0: - resolution: {integrity: sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==} - babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} @@ -5240,107 +5011,17 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-syntax-async-functions@6.13.0: - resolution: {integrity: sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==} - - babel-plugin-syntax-exponentiation-operator@6.13.0: - resolution: {integrity: sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==} - 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==} - babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - babel-plugin-transform-async-to-generator@6.24.1: - resolution: {integrity: sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==} - - babel-plugin-transform-es2015-arrow-functions@6.22.0: - resolution: {integrity: sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==} - - babel-plugin-transform-es2015-block-scoped-functions@6.22.0: - resolution: {integrity: sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==} - - babel-plugin-transform-es2015-block-scoping@6.26.0: - resolution: {integrity: sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==} - - babel-plugin-transform-es2015-classes@6.24.1: - resolution: {integrity: sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==} - - babel-plugin-transform-es2015-computed-properties@6.24.1: - resolution: {integrity: sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==} - - babel-plugin-transform-es2015-destructuring@6.23.0: - resolution: {integrity: sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==} - - babel-plugin-transform-es2015-duplicate-keys@6.24.1: - resolution: {integrity: sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==} - - babel-plugin-transform-es2015-for-of@6.23.0: - resolution: {integrity: sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==} - - babel-plugin-transform-es2015-function-name@6.24.1: - resolution: {integrity: sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==} - - babel-plugin-transform-es2015-literals@6.22.0: - resolution: {integrity: sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==} - - babel-plugin-transform-es2015-modules-amd@6.24.1: - resolution: {integrity: sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==} - - babel-plugin-transform-es2015-modules-commonjs@6.26.2: - resolution: {integrity: sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==} - - babel-plugin-transform-es2015-modules-systemjs@6.24.1: - resolution: {integrity: sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==} - - babel-plugin-transform-es2015-modules-umd@6.24.1: - resolution: {integrity: sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==} - - babel-plugin-transform-es2015-object-super@6.24.1: - resolution: {integrity: sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==} - - babel-plugin-transform-es2015-parameters@6.24.1: - resolution: {integrity: sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==} - - babel-plugin-transform-es2015-shorthand-properties@6.24.1: - resolution: {integrity: sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==} - - babel-plugin-transform-es2015-spread@6.22.0: - resolution: {integrity: sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==} - - babel-plugin-transform-es2015-sticky-regex@6.24.1: - resolution: {integrity: sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==} - - babel-plugin-transform-es2015-template-literals@6.22.0: - resolution: {integrity: sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==} - - babel-plugin-transform-es2015-typeof-symbol@6.23.0: - resolution: {integrity: sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==} - - babel-plugin-transform-es2015-unicode-regex@6.24.1: - resolution: {integrity: sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==} - - babel-plugin-transform-exponentiation-operator@6.24.1: - resolution: {integrity: sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==} - - babel-plugin-transform-regenerator@6.26.0: - resolution: {integrity: sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==} - - 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==} peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-env@1.7.0: - resolution: {integrity: sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==} - babel-preset-fbjs@3.4.0: resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: @@ -5352,32 +5033,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-register@6.26.0: - resolution: {integrity: sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==} - - babel-runtime@6.26.0: - resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} - - babel-template@6.26.0: - resolution: {integrity: sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==} - - babel-traverse@6.26.0: - resolution: {integrity: sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==} - - babel-types@6.26.0: - resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} - - babelify@7.3.0: - resolution: {integrity: sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA==} - - babylon@6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - - backoff@2.5.0: - resolution: {integrity: sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==} - engines: {node: '>= 0.6'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -5393,10 +5048,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base@0.11.2: - 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 @@ -5424,10 +5075,6 @@ packages: bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -5438,9 +5085,6 @@ packages: bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - bip39@2.5.0: - resolution: {integrity: sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==} - bip39@3.0.4: resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==} @@ -5478,10 +5122,6 @@ packages: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - bowser@2.12.1: resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} @@ -5495,14 +5135,6 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - braces@1.8.5: - resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} - engines: {node: '>=0.10.0'} - - braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -5510,33 +5142,12 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browser-stdout@1.3.0: - resolution: {integrity: sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==} - browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - - browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - - browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} - - browserify-sign@4.2.3: - resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} - engines: {node: '>= 0.12'} - - browserslist@3.2.8: - resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} - hasBin: true - browserslist@4.26.0: resolution: {integrity: sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -5557,9 +5168,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer-to-arraybuffer@0.0.5: - resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} - buffer-writer@2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} engines: {node: '>=4'} @@ -5602,12 +5210,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - bytewise-core@1.2.3: - resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} - - 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'} @@ -5616,14 +5218,6 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} - cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - - cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -5632,17 +5226,6 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} - cacheable-request@6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} - engines: {node: '>=8'} - - cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - - cachedown@1.0.0: - resolution: {integrity: sha512-t+yVk82vQWCJF3PsWHMld+jhhjkkWjcAzz8NbFx1iULOXWl8Tm/FdM4smZNVw3MRr0X+lVTx9PKzvEn4Ng19RQ==} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -5678,10 +5261,6 @@ packages: resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} engines: {node: '>=0.10.0'} - camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -5733,10 +5312,6 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -5786,12 +5361,6 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} - checkpoint-store@1.1.0: - resolution: {integrity: sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==} - - chokidar@1.7.0: - resolution: {integrity: sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -5826,22 +5395,10 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cids@0.7.5: - resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} - engines: {node: '>=4.0.0', npm: '>=3.0.0'} - deprecated: This module has been superseded by the multiformats module - cipher-base@1.0.6: resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} engines: {node: '>= 0.10'} - class-is@1.1.0: - resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} - - class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -5866,14 +5423,6 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - - cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cli-truncate@5.0.0: resolution: {integrity: sha512-ds7u02fPOOBpcUl2VSjLF3lfnAik9u7Zt0BTaaAQlT5RtABALl4cvpJHthXx+rM50J4gSfXKPH5Tix/tfdefUQ==} engines: {node: '>=20'} @@ -5885,9 +5434,6 @@ packages: cliui@3.2.0: resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - cliui@4.1.0: - resolution: {integrity: sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==} - cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -5898,17 +5444,6 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} @@ -5916,10 +5451,6 @@ packages: coingecko-api@1.0.10: resolution: {integrity: sha512-7YLLC85+daxAw5QlBWoHVBVpJRwoPr4HtwanCr8V/WRjoyHTa1Lb9DQAvv4MDJZHiz4no6HGnDQnddtjV35oRA==} - collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -5956,10 +5487,6 @@ packages: command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - command-line-args@4.0.7: - resolution: {integrity: sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==} - hasBin: true - command-line-args@5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} @@ -5984,15 +5511,9 @@ packages: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} - commander@2.11.0: - resolution: {integrity: sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} - commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -6011,9 +5532,6 @@ packages: compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -6044,9 +5562,6 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} - content-hash@2.5.2: - resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} - content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -6064,9 +5579,6 @@ packages: engines: {node: '>=16'} hasBin: true - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -6081,24 +5593,9 @@ packages: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - - cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - - copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - core-js-pure@3.45.1: resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} - core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -6144,9 +5641,6 @@ packages: engines: {node: '>=0.8'} hasBin: true - create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - create-hash@1.1.3: resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} @@ -6159,9 +5653,6 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-fetch@2.2.6: - resolution: {integrity: sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==} - cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} @@ -6175,13 +5666,6 @@ packages: resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==} engines: {node: '>=16.0.0'} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -6189,13 +5673,6 @@ packages: crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - crypto-browserify@3.12.0: - resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - dargs@8.1.0: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} @@ -6236,23 +5713,6 @@ packages: supports-color: optional: true - debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.6: - resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -6281,14 +5741,6 @@ packages: 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==} - engines: {node: '>=0.10'} - - decompress-response@3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} - decompress-response@4.2.1: resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} engines: {node: '>=8'} @@ -6308,10 +5760,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-equal@1.1.2: - resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} - engines: {node: '>= 0.4'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -6319,22 +5767,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defer-to-connect@1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - deferred-leveldown@1.2.2: - resolution: {integrity: sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - deferred-leveldown@4.0.2: - resolution: {integrity: sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - deferred-leveldown@5.3.0: resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} engines: {node: '>=6'} @@ -6352,21 +5788,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - - define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - - define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - - defined@1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -6395,9 +5816,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - destroy@1.0.4: resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==} @@ -6405,10 +5823,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-indent@4.0.0: - resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} - engines: {node: '>=0.10.0'} - detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -6421,14 +5835,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@3.3.1: - resolution: {integrity: sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==} - engines: {node: '>=0.3.1'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -6437,9 +5843,6 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} @@ -6454,9 +5857,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -6472,10 +5872,6 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotignore@0.1.2: - resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} - hasBin: true - dottie@2.0.6: resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} @@ -6487,9 +5883,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} @@ -6544,11 +5937,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding-down@5.0.4: - resolution: {integrity: sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - encoding-down@6.3.0: resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} engines: {node: '>=6'} @@ -6576,9 +5964,6 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - eol@0.9.1: - resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} - err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -6596,9 +5981,6 @@ packages: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} - es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -6623,17 +6005,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - esbuild@0.25.9: resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} @@ -6748,10 +6119,6 @@ packages: jiti: optional: true - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6790,9 +6157,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - eth-block-tracker@3.0.1: - resolution: {integrity: sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==} - eth-ens-namehash@2.0.8: resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} @@ -6804,46 +6168,9 @@ packages: '@codechecks/client': optional: true - eth-json-rpc-infura@3.2.1: - resolution: {integrity: sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - eth-json-rpc-middleware@1.6.0: - resolution: {integrity: sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==} - - eth-lib@0.1.29: - resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} - - eth-lib@0.2.8: - resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} - - eth-query@2.1.2: - resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} - - eth-sig-util@1.4.2: - resolution: {integrity: sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==} - deprecated: Deprecated in favor of '@metamask/eth-sig-util' - - eth-sig-util@3.0.0: - resolution: {integrity: sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==} - deprecated: Deprecated in favor of '@metamask/eth-sig-util' - - eth-tx-summary@3.2.4: - resolution: {integrity: sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==} - - ethashjs@0.0.8: - resolution: {integrity: sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==} - deprecated: 'New package name format for new versions: @ethereumjs/ethash. Please update.' - ethereum-bloom-filters@1.2.0: resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} - ethereum-common@0.0.18: - resolution: {integrity: sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==} - - ethereum-common@0.2.0: - resolution: {integrity: sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==} - ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} @@ -6853,11 +6180,6 @@ packages: ethereum-cryptography@2.2.1: resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - ethereum-waffle@3.4.4: - resolution: {integrity: sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==} - engines: {node: '>=10.0'} - hasBin: true - ethereum-waffle@4.0.10: resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} engines: {node: '>=10.0'} @@ -6865,55 +6187,10 @@ packages: peerDependencies: ethers: '*' - ethereumjs-abi@0.6.5: - resolution: {integrity: sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g==} - deprecated: This library has been deprecated and usage is discouraged. - ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} deprecated: This library has been deprecated and usage is discouraged. - ethereumjs-abi@https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0: - resolution: {tarball: https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0} - version: 0.6.8 - - ethereumjs-account@2.0.5: - resolution: {integrity: sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==} - - ethereumjs-account@3.0.0: - resolution: {integrity: sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==} - deprecated: Please use Util.Account class found on package ethereumjs-util@^7.0.6 https://github.com/ethereumjs/ethereumjs-util/releases/tag/v7.0.6 - - ethereumjs-block@1.7.1: - resolution: {integrity: sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==} - deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' - - ethereumjs-block@2.2.2: - resolution: {integrity: sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==} - deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' - - ethereumjs-blockchain@4.0.4: - resolution: {integrity: sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==} - deprecated: 'New package name format for new versions: @ethereumjs/blockchain. Please update.' - - ethereumjs-common@1.5.0: - resolution: {integrity: sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==} - deprecated: 'New package name format for new versions: @ethereumjs/common. Please update.' - - ethereumjs-tx@1.3.7: - resolution: {integrity: sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==} - deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' - - ethereumjs-tx@2.1.2: - resolution: {integrity: sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==} - deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' - - ethereumjs-util@4.5.1: - resolution: {integrity: sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==} - - ethereumjs-util@5.2.1: - resolution: {integrity: sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==} - ethereumjs-util@6.2.1: resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} @@ -6925,18 +6202,6 @@ packages: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} - ethereumjs-vm@2.6.0: - resolution: {integrity: sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==} - deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' - - ethereumjs-vm@4.2.0: - resolution: {integrity: sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==} - deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' - - ethereumjs-wallet@0.6.5: - resolution: {integrity: sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==} - deprecated: 'New package name format for new versions: @ethereumjs/wallet. Please update.' - ethers@5.6.2: resolution: {integrity: sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ==} @@ -6965,20 +6230,10 @@ packages: resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} engines: {node: '>=6.5.0', npm: '>=3'} - ethlint@1.2.5: - resolution: {integrity: sha512-x2nKK98zmd72SFWL3Ul1S6scWYf5QqG221N6/mFNMO661g7ASvTRINGIWVvHzsvflW6y4tvgMSjnTN5RCTuZug==} - hasBin: true - - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - eventemitter3@4.0.4: - resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} - eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -6992,26 +6247,6 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - expand-brackets@0.1.5: - resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} - engines: {node: '>=0.10.0'} - - expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - - expand-range@1.8.2: - resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} - engines: {node: '>=0.10.0'} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -7027,21 +6262,6 @@ packages: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -7052,14 +6272,6 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - extglob@0.3.2: - resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} - engines: {node: '>=0.10.0'} - - extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - extract-files@11.0.0: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} @@ -7068,18 +6280,12 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - fake-merkle-patricia-tree@1.0.1: - resolution: {integrity: sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==} - fast-base64-decode@1.0.0: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - fast-deep-equal@1.1.0: - resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -7145,9 +6351,6 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - fetch-ponyfill@4.1.0: - resolution: {integrity: sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g==} - fets@0.1.5: resolution: {integrity: sha512-mL/ya591WOgCP1yBBPbp8E37nynj8QQF6iQCUVl0aHDL80BZ9SOL4BcKBy0dnKdC+clnnAkMm05KB9hsj4m4jQ==} @@ -7162,18 +6365,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filename-regex@2.0.1: - resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} - engines: {node: '>=0.10.0'} - - fill-range@2.2.4: - resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} - engines: {node: '>=0.10.0'} - - fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -7186,14 +6377,6 @@ packages: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - - find-replace@1.0.3: - resolution: {integrity: sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==} - engines: {node: '>=4.0.0'} - find-replace@3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} @@ -7202,10 +6385,6 @@ packages: resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} engines: {node: '>=0.10.0'} - find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -7218,12 +6397,6 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} - find-yarn-workspace-root@1.2.1: - resolution: {integrity: sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==} - - find-yarn-workspace-root@2.0.0: - resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -7238,9 +6411,6 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - flow-stoplight@1.0.0: - resolution: {integrity: sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA==} - fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} @@ -7260,14 +6430,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - for-own@0.1.5: - resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} - engines: {node: '>=0.10.0'} - foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} @@ -7309,10 +6471,6 @@ packages: fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -7331,9 +6489,6 @@ packages: resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} - fs-extra@4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -7346,9 +6501,6 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs-minipass@1.2.7: - resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} - fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -7363,12 +6515,6 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -7387,13 +6533,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - ganache-core@2.13.2: - resolution: {integrity: sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==} - engines: {node: '>=8.9.0'} - deprecated: ganache-core is now ganache; visit https://trfl.io/g7 for details - bundledDependencies: - - keccak - ganache@7.4.3: resolution: {integrity: sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==} hasBin: true @@ -7445,18 +6584,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - - get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -7468,10 +6595,6 @@ packages: get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} @@ -7487,13 +6610,6 @@ packages: github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-base@0.3.0: - resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} - engines: {node: '>=0.10.0'} - - glob-parent@2.0.0: - resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -7515,13 +6631,9 @@ packages: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} deprecated: Glob versions prior to v9 are no longer supported - glob@7.1.2: - resolution: {integrity: sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==} - deprecated: Glob versions prior to v9 are no longer supported - glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -7544,9 +6656,6 @@ packages: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} - global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -7555,10 +6664,6 @@ packages: resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} - globals@9.18.0: - resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} - engines: {node: '>=0.10.0'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -7575,18 +6680,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} - got@9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} - graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -7639,10 +6736,6 @@ packages: resolution: {integrity: sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - growl@1.10.3: - resolution: {integrity: sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==} - engines: {node: '>=4.x'} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -7726,10 +6819,6 @@ packages: resolution: {integrity: sha512-0Z0KI/m6wJYCMZgDK3QuVqR59lSa3aMu6QHKqnbIYXKu/phQ+YFKJZAY4zkUKX21ZjcrrRg25qLUzZw1bO6g/A==} hasBin: true - has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -7738,10 +6827,6 @@ packages: resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} engines: {node: '>=0.10.0'} - has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -7768,33 +6853,9 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - - has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - - has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - - has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - - has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - hash-base@2.0.2: resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} - hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} - hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -7809,10 +6870,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - he@1.1.1: - resolution: {integrity: sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==} - hasBin: true - he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -7820,9 +6877,6 @@ packages: header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - heap@0.2.6: - resolution: {integrity: sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ==} - heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} @@ -7843,10 +6897,6 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - home-or-tmp@2.0.0: - resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} - engines: {node: '>=0.10.0'} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -7872,9 +6922,6 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-https@1.0.0: - resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -7886,10 +6933,6 @@ packages: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} - http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -7906,15 +6949,6 @@ packages: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - husky@7.0.4: - resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} - engines: {node: '>=12'} - hasBin: true - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -8058,20 +7092,12 @@ packages: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} - is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -8090,10 +7116,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -8102,25 +7124,14 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} - is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} @@ -8132,14 +7143,6 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} - - is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} - is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} @@ -8149,26 +7152,6 @@ packages: engines: {node: '>=8'} hasBin: true - is-dotfile@1.0.3: - resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} - engines: {node: '>=0.10.0'} - - is-equal-shallow@0.1.3: - resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} - engines: {node: '>=0.10.0'} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - - is-extglob@1.0.0: - resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -8177,14 +7160,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-finite@1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} - - is-fn@1.0.0: - resolution: {integrity: sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@1.0.0: resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} engines: {node: '>=0.10.0'} @@ -8197,25 +7172,14 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - is-fullwidth-code-point@5.1.0: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - is-generator-function@1.1.0: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} - is-glob@2.0.1: - resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} - engines: {node: '>=0.10.0'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -8245,18 +7209,6 @@ packages: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} - is-number@2.1.0: - resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} - engines: {node: '>=0.10.0'} - - is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - - is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -8269,22 +7221,6 @@ packages: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-posix-bracket@0.1.1: - resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} - engines: {node: '>=0.10.0'} - - is-primitive@2.0.0: - resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} - engines: {node: '>=0.10.0'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -8301,10 +7237,6 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -8369,9 +7301,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -8381,14 +7310,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - isomorphic-unfetch@3.1.0: resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} @@ -8469,13 +7390,6 @@ packages: js-sha3@0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - - js-tokens@3.0.2: - resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -8497,14 +7411,6 @@ packages: jsc-safe-url@0.2.4: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@1.3.0: - resolution: {integrity: sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -8516,9 +7422,6 @@ packages: json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.0: - resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -8531,22 +7434,10 @@ packages: json-pointer@0.6.2: resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} - json-rpc-engine@3.8.0: - resolution: {integrity: sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==} - - json-rpc-error@2.0.0: - resolution: {integrity: sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug==} - - json-rpc-random-id@1.0.1: - resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} - json-schema-to-ts@2.12.0: resolution: {integrity: sha512-uTde38yBm5lzJSRPWRaasxZo72pb+JGE4iUksNdNfAkFaLhV4N9akeBxPPUpZy5onINt9Zo0oTLrAoEXyZESiQ==} engines: {node: '>=16'} - json-schema-traverse@0.3.1: - resolution: {integrity: sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -8559,10 +7450,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stable-stringify@1.3.0: - resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} - engines: {node: '>= 0.4'} - json-stream-stringify@3.1.6: resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} engines: {node: '>=7.10.1'} @@ -8570,10 +7457,6 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@0.5.1: - resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} - hasBin: true - json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -8595,9 +7478,6 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - jsonify@0.0.1: - resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -8625,27 +7505,13 @@ packages: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} - keyv@3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - klaw-sync@6.0.0: - resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} - klaw@1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} @@ -8668,10 +7534,6 @@ packages: resolution: {integrity: sha512-ShaNPPzgUi+iGj9bsQ0TPRm6MuOcPpc1NklL0/IzJsvB0OdHwWoPhmeTVR5z0oC3zzLebrojozo/nt8d2XTZbQ==} hasBin: true - level-codec@7.0.1: - resolution: {integrity: sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==} - deprecated: Superseded by level-transcoder (https://github.com/Level/community#faq) - level-codec@9.0.2: resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} engines: {node: '>=6'} @@ -8682,80 +7544,33 @@ packages: engines: {node: '>=6'} deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - level-errors@1.0.5: - resolution: {integrity: sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - level-errors@2.0.1: resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} engines: {node: '>=6'} deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - level-iterator-stream@1.3.1: - resolution: {integrity: sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==} - - level-iterator-stream@2.0.3: - resolution: {integrity: sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==} - engines: {node: '>=4'} - - level-iterator-stream@3.0.1: - resolution: {integrity: sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==} - engines: {node: '>=6'} - level-iterator-stream@4.0.2: resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} engines: {node: '>=6'} - level-mem@3.0.1: - resolution: {integrity: sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==} - engines: {node: '>=6'} - deprecated: Superseded by memory-level (https://github.com/Level/community#faq) - level-mem@5.0.1: resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==} engines: {node: '>=6'} deprecated: Superseded by memory-level (https://github.com/Level/community#faq) - level-packager@4.0.1: - resolution: {integrity: sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - level-packager@5.1.1: resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} engines: {node: '>=6'} deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - level-post@1.0.7: - resolution: {integrity: sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==} - - level-sublevel@6.6.4: - resolution: {integrity: sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==} - level-supports@1.0.1: resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} engines: {node: '>=6'} - level-ws@0.0.0: - resolution: {integrity: sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==} - - level-ws@1.0.0: - resolution: {integrity: sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==} - engines: {node: '>=6'} - level-ws@2.0.0: resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} engines: {node: '>=6'} - levelup@1.3.9: - resolution: {integrity: sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - - levelup@3.1.1: - resolution: {integrity: sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==} - engines: {node: '>=6'} - deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) - levelup@4.4.0: resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} engines: {node: '>=6'} @@ -8779,35 +7594,17 @@ packages: lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - lilconfig@2.0.5: - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} - engines: {node: '>=10'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@12.5.0: - resolution: {integrity: sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - lint-staged@16.2.7: resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} engines: {node: '>=20.17'} hasBin: true - listr2@4.0.5: - resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} - engines: {node: '>=12'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - listr2@9.0.5: resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} @@ -8823,10 +7620,6 @@ packages: localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -8896,9 +7689,6 @@ packages: lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - lodash@4.17.20: - resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -8906,10 +7696,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -8918,12 +7704,6 @@ packages: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} - looper@2.0.0: - resolution: {integrity: sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ==} - - looper@3.0.0: - resolution: {integrity: sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -8940,14 +7720,6 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8959,12 +7731,6 @@ packages: resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} engines: {node: 20 || >=22} - lru-cache@3.2.0: - resolution: {integrity: sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow==} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -8979,9 +7745,6 @@ packages: lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - ltgt@2.1.3: - resolution: {integrity: sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw==} - ltgt@2.2.1: resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} @@ -8999,10 +7762,6 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -9038,9 +7797,6 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - math-random@1.0.4: - resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} - mcl-wasm@0.7.9: resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} engines: {node: '>=8.9.0'} @@ -9055,19 +7811,6 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - mem@1.1.0: - resolution: {integrity: sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==} - engines: {node: '>=4'} - - memdown@1.4.1: - resolution: {integrity: sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==} - deprecated: Superseded by memory-level (https://github.com/Level/community#faq) - - memdown@3.0.0: - resolution: {integrity: sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==} - engines: {node: '>=6'} - deprecated: Superseded by memory-level (https://github.com/Level/community#faq) - memdown@5.1.0: resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} engines: {node: '>=6'} @@ -9087,9 +7830,6 @@ packages: merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -9097,12 +7837,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - merkle-patricia-tree@2.3.2: - resolution: {integrity: sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==} - - merkle-patricia-tree@3.0.0: - resolution: {integrity: sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==} - merkle-patricia-tree@4.2.4: resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} @@ -9261,14 +7995,6 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - micromatch@2.3.11: - resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} - engines: {node: '>=0.10.0'} - - micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -9290,10 +8016,6 @@ packages: engines: {node: '>=4'} hasBin: true - mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -9302,10 +8024,6 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - mimic-response@2.1.0: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} engines: {node: '>=8'} @@ -9318,9 +8036,6 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -9346,9 +8061,6 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@0.0.8: - resolution: {integrity: sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -9372,9 +8084,6 @@ packages: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} - minipass@2.9.0: - resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} - minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -9387,30 +8096,13 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@1.3.3: - resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} - minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp-promise@5.0.1: - resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} - engines: {node: '>=4'} - deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. - - mkdirp@0.5.1: - resolution: {integrity: sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==} - deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) - hasBin: true - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -9433,18 +8125,6 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true - mocha@4.1.0: - resolution: {integrity: sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==} - engines: {node: '>= 4.0.0'} - hasBin: true - - mock-fs@4.14.0: - resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} - - mock-property@1.0.3: - resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} - engines: {node: '>= 0.4'} - moment-timezone@0.5.48: resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} @@ -9465,25 +8145,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multibase@0.6.1: - resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} - deprecated: This module has been superseded by the multiformats module - - multibase@0.7.0: - resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} - deprecated: This module has been superseded by the multiformats module - - multicodec@0.5.7: - resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} - deprecated: This module has been superseded by the multiformats module - - multicodec@1.0.4: - resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} - deprecated: This module has been superseded by the multiformats module - - multihashes@0.4.21: - resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} - murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} @@ -9502,17 +8163,10 @@ packages: nan@2.23.0: resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} - nano-json-stream-parser@0.1.2: - resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} - nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} - nanomatch@1.2.13: - 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==} @@ -9545,16 +8199,10 @@ packages: neoqs@6.13.0: resolution: {integrity: sha512-IysBpjrEG9qiUb/IT6XrXSz2ASzBxLebp4s8/GBm7STYC315vMNqH0aWdRR+f7KvXK4aRlLcf5r2Z6dOTxQSrQ==} - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - ngeohash@0.6.3: resolution: {integrity: sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==} engines: {node: '>=v0.2.0'} - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -9576,9 +8224,6 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-fetch@1.7.3: - resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} - node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -9647,14 +8292,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - normalize-url@8.1.0: resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} @@ -9667,14 +8304,6 @@ packages: resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} engines: {node: ^16.14.0 || >=18.0.0} - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - npmlog@4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} deprecated: This package is no longer supported. @@ -9701,35 +8330,17 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - object-inspect@1.10.3: resolution: {integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==} - object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@0.4.0: - resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -9738,22 +8349,10 @@ packages: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} - object.groupby@1.0.3: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.omit@2.0.1: - resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} - engines: {node: '>=0.10.0'} - - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -9761,9 +8360,6 @@ packages: obliterator@2.0.5: resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} - oboe@2.1.4: - resolution: {integrity: sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ==} - on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} @@ -9815,18 +8411,10 @@ packages: ordinal@1.0.3: resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} - os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - os-locale@1.4.0: resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} engines: {node: '>=0.10.0'} - os-locale@2.1.0: - resolution: {integrity: sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==} - engines: {node: '>=4'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -9854,14 +8442,6 @@ packages: typescript: optional: true - p-cancelable@1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - - p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -9874,10 +8454,6 @@ packages: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} - p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -9890,10 +8466,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -9926,10 +8498,6 @@ packages: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} - p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -9954,10 +8522,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-asn1@5.1.7: - resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} - engines: {node: '>= 0.10'} - parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} @@ -9968,13 +8532,6 @@ packages: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} engines: {node: '>=0.8'} - parse-glob@3.0.4: - resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} - engines: {node: '>=0.10.0'} - - parse-headers@2.0.6: - resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} - parse-json@2.2.0: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} @@ -9994,20 +8551,6 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - - patch-package@6.2.2: - resolution: {integrity: sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==} - engines: {npm: '>5'} - hasBin: true - - patch-package@6.5.1: - resolution: {integrity: sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==} - engines: {node: '>=10', npm: '>5'} - hasBin: true - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -10018,10 +8561,6 @@ packages: resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} engines: {node: '>=0.10.0'} - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -10034,10 +8573,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -10065,9 +8600,6 @@ packages: resolution: {integrity: sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg==} engines: {node: '>=8'} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -10093,11 +8625,6 @@ packages: resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} engines: {node: '>=0.12'} - pegjs@0.10.0: - resolution: {integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==} - engines: {node: '>=0.10'} - hasBin: true - performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -10163,11 +8690,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pidtree@0.5.0: - resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==} - engines: {node: '>=0.10'} - hasBin: true - pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -10211,10 +8733,6 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -10235,9 +8753,6 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - postinstall-postinstall@2.1.0: - resolution: {integrity: sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==} - prebuild-install@5.3.6: resolution: {integrity: sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==} engines: {node: '>=6'} @@ -10248,10 +8763,6 @@ packages: engines: {node: '>=6'} hasBin: true - precond@0.2.3: - resolution: {integrity: sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==} - engines: {node: '>= 0.6'} - prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -10260,14 +8771,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prepend-http@2.0.0: - resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} - engines: {node: '>=4'} - - preserve@0.2.0: - resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} - engines: {node: '>=0.10.0'} - prettier-plugin-solidity@2.1.0: resolution: {integrity: sha512-O5HX4/PCE5aqiaEiNGbSRLbSBZQ6kLswAav5LBSewwzhT+sZlN6iAaLZlZcJzPEnIAxwLEHP03xKEg92fflT9Q==} engines: {node: '>=20'} @@ -10288,10 +8791,6 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - private@0.1.8: - resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} - engines: {node: '>= 0.6'} - proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -10299,10 +8798,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - prom-client@14.0.1: resolution: {integrity: sha512-HxTArb6fkOntQHoRGvv4qd/BkorjliiuO2uSWC2KC17MUTKYttWdDoXX/vxOhQdkoECEM9BBH0pj2l8G8kev6w==} engines: {node: '>=10'} @@ -10318,10 +8813,6 @@ packages: promise-throttle@1.1.2: resolution: {integrity: sha512-dij7vjyXNewuuN/gyr+TX2KRjw48mbV5FEtgyXaIoJjGYAKT0au23/voNvy9eS4UNJjx2KUdEcO5Yyfc1h7vWQ==} - promise-to-callback@1.0.0: - resolution: {integrity: sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==} - engines: {node: '>=0.10.0'} - promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -10351,36 +8842,9 @@ packages: prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - - pull-cat@1.1.11: - resolution: {integrity: sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg==} - - pull-defer@0.2.3: - resolution: {integrity: sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==} - - pull-level@2.0.4: - resolution: {integrity: sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==} - - pull-live@1.0.1: - resolution: {integrity: sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA==} - - pull-pushable@2.2.0: - resolution: {integrity: sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg==} - - pull-stream@3.7.0: - resolution: {integrity: sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw==} - - pull-window@2.1.4: - resolution: {integrity: sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg==} - pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} @@ -10413,10 +8877,6 @@ packages: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -10436,10 +8896,6 @@ packages: 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==} - engines: {node: '>=0.10.0'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -10453,16 +8909,9 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - randomatic@3.1.1: - resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} - engines: {node: '>= 0.10.0'} - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -10536,12 +8985,6 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - - readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -10549,10 +8992,6 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -10581,33 +9020,13 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - regenerator-transform@0.10.1: - resolution: {integrity: sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==} - - regex-cache@0.4.4: - resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} - engines: {node: '>=0.10.0'} - - regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpu-core@2.0.0: - resolution: {integrity: sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==} - registry-auth-token@5.1.0: resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} engines: {node: '>=14'} @@ -10616,31 +9035,12 @@ packages: resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} engines: {node: '>=12'} - regjsgen@0.2.0: - resolution: {integrity: sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==} - - regjsparser@0.1.5: - resolution: {integrity: sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==} - hasBin: true - relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - repeating@2.0.1: - resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} - engines: {node: '>=0.10.0'} - req-cwd@2.0.0: resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} engines: {node: '>=4'} @@ -10690,10 +9090,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -10709,12 +9105,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - responselike@1.0.2: - resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} - - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -10727,10 +9117,6 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - retry-as-promised@5.0.0: resolution: {integrity: sha512-6S+5LvtTl2ggBumk04hBo/4Uf6fRJUwIgunGZ7CYEBCeufGFW1Pu6ucUf/UskHeWOIsUcLOGLFXPig5tR5V1nA==} @@ -10814,10 +9200,6 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-event-emitter@1.0.1: - resolution: {integrity: sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==} - deprecated: Renamed to @metamask/safe-event-emitter - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -10826,9 +9208,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -10846,9 +9225,6 @@ packages: scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - scryptsy@1.2.1: - resolution: {integrity: sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw==} - secp256k1@4.0.4: resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} engines: {node: '>=18.0.0'} @@ -10856,9 +9232,6 @@ packages: secure-keys@1.0.0: resolution: {integrity: sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==} - seedrandom@3.0.1: - resolution: {integrity: sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==} - seedrandom@3.0.5: resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} @@ -10866,14 +9239,6 @@ packages: resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} engines: {node: '>=4.1'} - semaphore@1.1.0: - resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} - engines: {node: '>=0.8.0'} - - semver@5.4.1: - resolution: {integrity: sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==} - hasBin: true - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -10993,10 +9358,6 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} - servify@0.1.12: - resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} - engines: {node: '>=6'} - set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -11008,18 +9369,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - set-immediate-shim@1.0.1: - resolution: {integrity: sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==} - engines: {node: '>=0.10.0'} - set-proto@1.0.0: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -11037,18 +9390,10 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -11091,9 +9436,6 @@ packages: simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - simple-get@2.8.2: - resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} - simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} @@ -11106,14 +9448,6 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@1.0.0: - resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} - engines: {node: '>=0.10.0'} - - slash@2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -11122,18 +9456,10 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -11153,18 +9479,6 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - - snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - - snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} @@ -11173,21 +9487,10 @@ packages: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - sol-digger@0.0.2: - resolution: {integrity: sha512-oqrw1E/X2WWYUYCzKDM5INDDH2nWOWos4p2Cw2OF52qoZcTDzlKMJQ5pJFXKOCADCg6KggBO5WYE/vNb+kJ0Hg==} - - sol-explore@1.6.1: - resolution: {integrity: sha512-cmwg7l+QLj2LE3Qvwrdo4aPYcNYY425+bN5VPkgCjkO0CiSz33G5vM5BmMZNrfd/6yNGwcm0KtwDJmh5lUElEQ==} - solc@0.4.26: resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} hasBin: true - solc@0.6.12: - resolution: {integrity: sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==} - engines: {node: '>=8.0.0'} - hasBin: true - solc@0.8.15: resolution: {integrity: sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==} engines: {node: '>=10.0.0'} @@ -11290,39 +9593,12 @@ packages: peerDependencies: hardhat: ^2.8.0 - solium-plugin-security@0.1.1: - resolution: {integrity: sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==} - peerDependencies: - solium: ^1.0.0 - - solium@1.2.5: - resolution: {integrity: sha512-NuNrm7fp8JcDN/P+SAdM5TVa4wYDtwVtLY/rG4eBOZrC5qItsUhmQKR/YhjszaEW4c8tNUYhkhQcwOsS25znpw==} - hasBin: true - - solparse@2.2.8: - resolution: {integrity: sha512-Tm6hdfG72DOxD40SD+T5ddbekWglNWjzDRSNq7ZDIOHVsyaJSeeunUuWNj4DE7uDrJK3tGQuX0ZTDZWNYsGPMA==} - hasBin: true - sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - - source-map-support@0.4.18: - resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} - - source-map-support@0.5.12: - resolution: {integrity: sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - source-map@0.2.0: resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} engines: {node: '>=0.8.0'} @@ -11350,10 +9626,6 @@ packages: 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==} - engines: {node: '>=0.10.0'} - split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -11390,10 +9662,6 @@ packages: resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} - static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -11409,17 +9677,10 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - stream-to-pull-stream@1.7.3: - resolution: {integrity: sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - strict-uri-encode@1.1.0: - resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} - engines: {node: '>=0.10.0'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -11463,9 +9724,6 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -11500,14 +9758,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-hex-prefix@1.0.0: resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -11523,18 +9773,10 @@ packages: 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'} - supports-color@3.2.3: resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} engines: {node: '>=0.8.0'} - supports-color@4.4.0: - resolution: {integrity: sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==} - engines: {node: '>=4'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -11547,10 +9789,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -11558,9 +9796,6 @@ packages: swap-case@2.0.2: resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} - swarm-js@0.1.42: - resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} - sync-request@6.1.0: resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} engines: {node: '>=8.0.0'} @@ -11576,10 +9811,6 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tape@4.17.0: - resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==} - hasBin: true - tar-fs@2.1.3: resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} @@ -11587,11 +9818,6 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@4.4.19: - resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} - engines: {node: '>=4.5'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -11613,10 +9839,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - test-value@2.1.0: - resolution: {integrity: sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==} - engines: {node: '>=0.10.0'} - testrpc@0.0.1: resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. @@ -11641,9 +9863,6 @@ packages: throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through2@3.0.2: resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} @@ -11653,10 +9872,6 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} - tiny-lru@8.0.2: resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} engines: {node: '>=6'} @@ -11675,10 +9890,6 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - tmp@0.1.0: - resolution: {integrity: sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==} - engines: {node: '>=6'} - tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -11686,30 +9897,10 @@ packages: 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'} - - to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - - to-readable-stream@1.0.0: - resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} - engines: {node: '>=6'} - - to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -11724,18 +9915,10 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - trim-right@1.0.1: - resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} - engines: {node: '>=0.10.0'} - triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - truffle-flattener@1.6.0: - resolution: {integrity: sha512-scS5Bsi4CZyvlrmD4iQcLHTiG2RQFUXVheTgWeH6PuafmI+Lk5U87Es98loM3w3ImqC9/fPHq+3QIXbcPuoJ1Q==} - hasBin: true - ts-algebra@1.2.2: resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} @@ -11749,23 +9932,11 @@ packages: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} hasBin: true - ts-essentials@1.0.4: - resolution: {integrity: sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==} - - ts-essentials@6.0.7: - resolution: {integrity: sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==} - peerDependencies: - typescript: '>=3.7.0' - ts-essentials@7.0.3: resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: typescript: '>=3.7.0' - ts-generator@0.1.1: - resolution: {integrity: sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==} - hasBin: true - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -11824,15 +9995,9 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -11865,13 +10030,6 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - - typechain@3.0.0: - resolution: {integrity: sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==} - hasBin: true - typechain@8.3.2: resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true @@ -11894,9 +10052,6 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -11912,18 +10067,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typewise-core@1.2.0: - resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} - - typewise@1.0.3: - resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==} - - typewiselite@1.0.0: - resolution: {integrity: sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw==} - - typical@2.6.1: - resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} - typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -11947,9 +10090,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - ultron@1.1.1: - resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -11961,9 +10101,6 @@ packages: underscore@1.13.7: resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - underscore@1.9.1: - resolution: {integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -11982,10 +10119,6 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -12006,18 +10139,10 @@ packages: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} - unorm@1.6.0: - resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} - engines: {node: '>= 0.4.0'} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -12033,17 +10158,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - url-parse-lax@3.0.0: - resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} - engines: {node: '>=4'} - - url-set-query@1.0.0: - resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} - url@0.11.4: resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} engines: {node: '>= 0.4'} @@ -12058,10 +10172,6 @@ packages: resolution: {integrity: sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg==} engines: {node: '>=10.16.0'} - use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - utf-8-validate@5.0.10: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} @@ -12076,19 +10186,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - util.promisify@1.1.3: - resolution: {integrity: sha512-GIEaZ6o86fj09Wtf0VfZ5XP7tmd4t3jM5aZCgmBi231D0DB1AEBa3Aa6MP48DMsAIi96WkpWLimIWVwOjbDMOw==} - engines: {node: '>= 0.8'} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@3.3.2: - resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -12122,9 +10223,6 @@ packages: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} - varint@5.0.2: - resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -12159,111 +10257,16 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - web3-bzz@1.2.11: - resolution: {integrity: sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==} - engines: {node: '>=8.0.0'} - - web3-core-helpers@1.2.11: - resolution: {integrity: sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==} - engines: {node: '>=8.0.0'} - - web3-core-method@1.2.11: - resolution: {integrity: sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==} - engines: {node: '>=8.0.0'} - - web3-core-promievent@1.2.11: - resolution: {integrity: sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==} - engines: {node: '>=8.0.0'} - - web3-core-requestmanager@1.2.11: - resolution: {integrity: sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==} - engines: {node: '>=8.0.0'} - - web3-core-subscriptions@1.2.11: - resolution: {integrity: sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==} - engines: {node: '>=8.0.0'} - - web3-core@1.2.11: - resolution: {integrity: sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==} - engines: {node: '>=8.0.0'} - - web3-eth-abi@1.2.11: - resolution: {integrity: sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==} - engines: {node: '>=8.0.0'} - - web3-eth-accounts@1.2.11: - resolution: {integrity: sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==} - engines: {node: '>=8.0.0'} - - web3-eth-contract@1.2.11: - resolution: {integrity: sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==} - engines: {node: '>=8.0.0'} - - web3-eth-ens@1.2.11: - resolution: {integrity: sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==} - engines: {node: '>=8.0.0'} - - web3-eth-iban@1.2.11: - resolution: {integrity: sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==} - engines: {node: '>=8.0.0'} - - web3-eth-personal@1.2.11: - resolution: {integrity: sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==} - engines: {node: '>=8.0.0'} - - web3-eth@1.2.11: - resolution: {integrity: sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==} - engines: {node: '>=8.0.0'} - - web3-net@1.2.11: - resolution: {integrity: sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==} - engines: {node: '>=8.0.0'} - - web3-provider-engine@14.2.1: - resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} - deprecated: 'This package has been deprecated, see the README for details: https://github.com/MetaMask/web3-provider-engine' - - web3-providers-http@1.2.11: - resolution: {integrity: sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==} - engines: {node: '>=8.0.0'} - - web3-providers-ipc@1.2.11: - resolution: {integrity: sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==} - engines: {node: '>=8.0.0'} - - web3-providers-ws@1.2.11: - resolution: {integrity: sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==} - engines: {node: '>=8.0.0'} - - web3-shh@1.2.11: - resolution: {integrity: sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==} - engines: {node: '>=8.0.0'} - web3-utils@1.10.4: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} - web3-utils@1.2.11: - resolution: {integrity: sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==} - engines: {node: '>=8.0.0'} - - web3@1.2.11: - resolution: {integrity: sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==} - engines: {node: '>=8.0.0'} - webcrypto-core@1.8.1: resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - websocket@1.0.32: - resolution: {integrity: sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==} - engines: {node: '>=4.0.0'} - - whatwg-fetch@2.0.4: - resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} - whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -12375,28 +10378,6 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@3.3.3: - resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@5.2.4: - resolution: {integrity: sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@6.2.3: resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} peerDependencies: @@ -12480,22 +10461,6 @@ packages: utf-8-validate: optional: true - xhr-request-promise@0.1.3: - resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} - - xhr-request@1.1.0: - resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} - - xhr2-cookies@1.1.0: - resolution: {integrity: sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==} - - xhr@2.6.0: - resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} - - xtend@2.1.2: - resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} - engines: {node: '>=0.4'} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -12510,14 +10475,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yaeti@0.0.6: - resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} - engines: {node: '>=0.10.32'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -12552,16 +10509,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs-parser@8.1.0: - resolution: {integrity: sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==} - yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} - yargs@10.1.2: - resolution: {integrity: sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==} - yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -13060,7 +11011,7 @@ snapshots: '@babel/types': 7.28.4 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -13419,7 +11370,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/types': 7.28.4 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13942,7 +11893,7 @@ snapshots: '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -13958,7 +11909,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -13978,20 +11929,10 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@ethereum-waffle/chai@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': - dependencies: - '@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) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - '@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.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) json-bigint: 1.0.0 transitivePeerDependencies: @@ -13999,26 +11940,6 @@ snapshots: - '@ensdomains/resolver' - supports-color - '@ethereum-waffle/compiler@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@resolver-engine/imports': 0.3.3 - '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 2.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.9.3)) - '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.13 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - mkdirp: 0.5.6 - node-fetch: 2.7.0(encoding@0.1.13) - solc: 0.6.12 - ts-generator: 0.1.1 - typechain: 3.0.0(typescript@5.9.3) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - '@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(solc@0.8.15)(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@resolver-engine/imports': 0.3.3 @@ -14038,51 +11959,21 @@ snapshots: - supports-color - typescript - '@ethereum-waffle/ens@3.4.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: - '@ensdomains/ens': 0.4.5 - '@ensdomains/resolver': 0.2.4 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@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))': dependencies: '@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/mock-contract@3.4.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: - '@ethersproject/abi': 5.8.0 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@ethereum-waffle/mock-contract@4.0.4(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: ethers: 5.8.0(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)': - dependencies: - '@ethereum-waffle/ens': 3.4.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - ganache-core: 2.13.2(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - patch-package: 6.5.1 - postinstall-postinstall: 2.1.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - '@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))': 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.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) ganache: 7.4.3 transitivePeerDependencies: @@ -14102,7 +11993,7 @@ snapshots: '@ethereumjs/block': 3.6.3 '@ethereumjs/common': 2.6.5 '@ethereumjs/ethash': 1.1.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethereumjs-util: 7.1.5 level-mem: 5.0.1 lru-cache: 5.1.1 @@ -14170,20 +12061,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@ethersproject/abi@5.0.0-beta.153': - dependencies: - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.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 - optional: true - - '@ethersproject/abi@5.6.0': + '@ethersproject/abi@5.6.0': dependencies: '@ethersproject/address': 5.8.0 '@ethersproject/bignumber': 5.8.0 @@ -15255,7 +13133,7 @@ snapshots: '@graphprotocol/contracts': 7.2.1 '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-secure-accounts: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -15668,7 +13546,7 @@ snapshots: '@graphql-tools/utils': 10.9.1(graphql@16.11.0) dset: 3.1.4 graphql: 16.11.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 lodash.get: 4.4.2 lodash.topath: 4.5.2 tiny-lru: 8.0.2 @@ -15683,7 +13561,7 @@ snapshots: '@graphql-tools/utils': 9.2.1(graphql@16.11.0) dset: 3.1.4 graphql: 16.11.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 lodash.get: 4.4.2 lodash.topath: 4.5.2 tiny-lru: 8.0.2 @@ -16186,14 +14064,6 @@ snapshots: '@ledgerhq/logs@5.50.0': {} - '@ljharb/resumer@0.0.1': - dependencies: - '@ljharb/through': 2.3.14 - - '@ljharb/through@2.3.14': - dependencies: - call-bind: 1.0.8 - '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.4 @@ -16355,7 +14225,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 @@ -16364,7 +14234,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 @@ -16375,7 +14245,7 @@ snapshots: dependencies: '@nomicfoundation/hardhat-errors': 3.0.6 '@nomicfoundation/hardhat-utils': 3.0.6 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethereum-cryptography: 2.2.1 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -16403,7 +14273,7 @@ snapshots: '@nomicfoundation/ignition-core': 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.12 chalk: 4.1.2 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) fs-extra: 10.1.0 hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) json5: 2.2.3 @@ -16421,7 +14291,7 @@ snapshots: '@nomicfoundation/hardhat-utils': 3.0.6 '@nomicfoundation/hardhat-zod-utils': 3.0.1(zod@3.25.76) chalk: 5.6.2 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) hardhat: 3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) zod: 3.25.76 transitivePeerDependencies: @@ -16504,7 +14374,7 @@ snapshots: '@nomicfoundation/hardhat-utils@3.0.6': dependencies: '@streamparser/json-node': 0.0.22 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) env-paths: 2.2.1 ethereum-cryptography: 2.2.1 fast-equals: 5.4.0 @@ -16521,7 +14391,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -16536,7 +14406,7 @@ snapshots: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 @@ -16554,7 +14424,7 @@ snapshots: '@nomicfoundation/hardhat-zod-utils': 3.0.1(zod@3.25.76) cbor2: 1.12.0 chalk: 5.6.2 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) hardhat: 3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) semver: 7.7.2 zod: 3.25.76 @@ -16574,7 +14444,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -16631,13 +14501,18 @@ snapshots: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + '@nomiclabs/hardhat-ethers@2.2.3(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) fs-extra: 7.0.1 hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash: 4.17.21 @@ -16647,21 +14522,19 @@ 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.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': - dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@types/sinon-chai': 3.2.12 - ethereum-waffle: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - - '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-waffle@2.0.6(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: + '@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/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)) '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@ensdomains/ens' + - '@ensdomains/resolver' + - supports-color '@npmcli/agent@2.2.2': dependencies: @@ -16687,8 +14560,6 @@ snapshots: '@openzeppelin/contracts@3.4.2': {} - '@openzeppelin/contracts@4.9.6': {} - '@openzeppelin/contracts@5.4.0': {} '@openzeppelin/defender-base-client@1.54.6(debug@4.4.3)(encoding@0.1.13)': @@ -16756,7 +14627,7 @@ snapshots: '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.4.3)(encoding@0.1.13) '@openzeppelin/upgrades-core': 1.44.1 chalk: 4.1.2 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) proper-lockfile: 4.1.2 @@ -16782,7 +14653,7 @@ snapshots: cbor: 10.0.11 chalk: 4.1.2 compare-versions: 6.1.1 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) ethereumjs-util: 7.1.5 minimatch: 9.0.5 minimist: 1.2.8 @@ -16839,7 +14710,7 @@ snapshots: '@react-native/community-cli-plugin@0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@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) + debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 metro: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) metro-config: 0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -16859,7 +14730,7 @@ snapshots: chrome-launcher: 0.15.2 chromium-edge-launcher: 0.2.0 connect: 3.7.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 nullthrows: 1.1.1 open: 7.4.2 @@ -16887,13 +14758,6 @@ snapshots: '@repeaterjs/repeater@3.0.6': {} - '@resolver-engine/core@0.2.1': - dependencies: - debug: 3.2.7 - request: 2.88.2 - transitivePeerDependencies: - - supports-color - '@resolver-engine/core@0.3.3': dependencies: debug: 3.2.7 @@ -16902,13 +14766,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@resolver-engine/fs@0.2.1': - dependencies: - '@resolver-engine/core': 0.2.1 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - '@resolver-engine/fs@0.3.3': dependencies: '@resolver-engine/core': 0.3.3 @@ -16916,14 +14773,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@resolver-engine/imports-fs@0.2.2': - dependencies: - '@resolver-engine/fs': 0.2.1 - '@resolver-engine/imports': 0.2.2 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - '@resolver-engine/imports-fs@0.3.3': dependencies: '@resolver-engine/fs': 0.3.3 @@ -16932,14 +14781,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@resolver-engine/imports@0.2.2': - dependencies: - '@resolver-engine/core': 0.2.1 - debug: 3.2.7 - hosted-git-info: 2.8.9 - transitivePeerDependencies: - - supports-color - '@resolver-engine/imports@0.3.3': dependencies: '@resolver-engine/core': 0.3.3 @@ -16990,10 +14831,10 @@ snapshots: - utf-8-validate - zod - '@rocketh/doc@0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@rocketh/doc@0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@types/fs-extra': 11.0.4 abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) commander: 14.0.2 @@ -17006,24 +14847,24 @@ snapshots: - utf-8-validate - zod - '@rocketh/export@0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@rocketh/export@0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@types/fs-extra': 11.0.4 abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) chalk: 5.6.2 commander: 14.0.2 eip-1193: 0.6.5 fs-extra: 11.3.3 - rocketh: 0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + rocketh: 0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@types/prompts': 2.4.9 @@ -17034,7 +14875,7 @@ snapshots: named-logs: 0.4.1 named-logs-console: 0.5.1 prompts: 2.4.2 - rocketh: 0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + rocketh: 0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) tsx: 4.21.0 viem: 2.44.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -17071,10 +14912,10 @@ snapshots: - utf-8-validate - zod - '@rocketh/verifier@0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@rocketh/verifier@0.17.16(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@types/fs-extra': 11.0.4 '@types/qs': 6.14.0 chalk: 5.6.2 @@ -17180,12 +15021,6 @@ snapshots: '@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': @@ -17516,16 +15351,6 @@ snapshots: '@streamparser/json@0.0.22': {} - '@szmarczak/http-timer@1.1.2': - dependencies: - defer-to-connect: 1.1.3 - optional: true - - '@szmarczak/http-timer@4.0.6': - dependencies: - defer-to-connect: 2.0.1 - optional: true - '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 @@ -17571,7 +15396,7 @@ snapshots: '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@ethersproject/bignumber': 5.8.0 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/hardhat-upgrades': 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/upgrades-core': 1.44.1 @@ -17623,11 +15448,6 @@ snapshots: typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: 5.9.3 - '@typechain/ethers-v5@2.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.9.3))': - dependencies: - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - typechain: 3.0.0(typescript@5.9.3) - '@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3)': dependencies: ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -17685,14 +15505,6 @@ snapshots: dependencies: '@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.19.14 - '@types/responselike': 1.0.3 - optional: true - '@types/chai-as-promised@7.1.8': dependencies: '@types/chai': 4.3.20 @@ -17766,11 +15578,6 @@ snapshots: '@types/katex@0.16.7': {} - '@types/keyv@3.1.4': - dependencies: - '@types/node': 20.19.14 - optional: true - '@types/level-errors@3.0.2': {} '@types/levelup@4.3.3': @@ -17783,7 +15590,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.0.3 + minimatch: 10.1.1 '@types/mkdirp@0.5.2': dependencies: @@ -17817,15 +15624,6 @@ snapshots: '@types/qs@6.14.0': {} - '@types/resolve@0.0.8': - dependencies: - '@types/node': 20.19.14 - - '@types/responselike@1.0.3': - dependencies: - '@types/node': 20.19.14 - optional: true - '@types/secp256k1@4.0.6': dependencies: '@types/node': 20.19.14 @@ -17883,7 +15681,7 @@ snapshots: '@typescript-eslint/types': 8.53.1 '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.53.1 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.2(jiti@2.5.1) typescript: 5.9.3 transitivePeerDependencies: @@ -17893,7 +15691,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) '@typescript-eslint/types': 8.53.1 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -17912,7 +15710,7 @@ snapshots: '@typescript-eslint/types': 8.53.1 '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.5.1))(typescript@5.9.3) - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.2(jiti@2.5.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 @@ -17927,7 +15725,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) '@typescript-eslint/types': 8.53.1 '@typescript-eslint/visitor-keys': 8.53.1 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 @@ -18064,8 +15862,6 @@ snapshots: '@whatwg-node/fetch': 0.8.8 tslib: 2.8.1 - '@yarnpkg/lockfile@1.1.0': {} - JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -18087,22 +15883,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - abstract-leveldown@2.6.3: - dependencies: - xtend: 4.0.2 - - abstract-leveldown@2.7.2: - dependencies: - xtend: 4.0.2 - - abstract-leveldown@3.0.0: - dependencies: - xtend: 4.0.2 - - abstract-leveldown@5.0.0: - dependencies: - xtend: 4.0.2 - abstract-leveldown@6.2.3: dependencies: buffer: 5.7.1 @@ -18138,14 +15918,11 @@ snapshots: aes-js@3.0.0: {} - aes-js@3.1.2: - optional: true - aes-js@4.0.0-beta.5: {} agent-base@6.0.2: dependencies: - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -18164,13 +15941,6 @@ snapshots: optionalDependencies: ajv: 8.17.1 - ajv@5.5.2: - dependencies: - co: 4.6.0 - fast-deep-equal: 1.1.0 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.3.1 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -18224,8 +15994,6 @@ snapshots: ansi-regex@6.2.2: {} - ansi-styles@2.2.1: {} - ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -18240,11 +16008,6 @@ snapshots: antlr4ts@0.5.0-alpha.4: {} - anymatch@1.3.2: - dependencies: - micromatch: 2.3.11 - normalize-path: 2.1.1 - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -18277,24 +16040,6 @@ snapshots: argparse@2.0.1: {} - arr-diff@2.0.0: - dependencies: - arr-flatten: 1.1.0 - - arr-diff@4.0.0: {} - - arr-flatten@1.1.0: {} - - arr-union@3.1.0: {} - - array-back@1.0.4: - dependencies: - typical: 2.6.1 - - array-back@2.0.0: - dependencies: - typical: 2.6.1 - array-back@3.1.0: {} array-back@4.0.2: {} @@ -18323,10 +16068,6 @@ snapshots: array-uniq@1.0.3: {} - array-unique@0.2.1: {} - - array-unique@0.3.2: {} - array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 @@ -18351,17 +16092,6 @@ snapshots: es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 - array.prototype.reduce@1.0.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-array-method-boxes-properly: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - is-string: 1.1.1 - arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 @@ -18374,13 +16104,6 @@ snapshots: asap@2.0.6: {} - asn1.js@4.10.1: - dependencies: - bn.js: 4.12.2 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - optional: true - asn1@0.2.6: dependencies: safer-buffer: 2.1.2 @@ -18397,14 +16120,10 @@ snapshots: assertion-error@2.0.1: {} - assign-symbols@1.0.0: {} - ast-parents@0.0.1: {} astral-regex@2.0.0: {} - async-each@1.0.6: {} - async-eventemitter@0.2.4: dependencies: async: 2.6.4 @@ -18423,10 +16142,6 @@ snapshots: async@1.5.2: {} - async@2.6.2: - dependencies: - lodash: 4.17.21 - async@2.6.4: dependencies: lodash: 4.17.21 @@ -18437,8 +16152,6 @@ snapshots: at-least-node@1.0.0: {} - atob@2.1.2: {} - atomic-sleep@1.0.0: {} auto-bind@4.0.0: {} @@ -18472,140 +16185,6 @@ snapshots: transitivePeerDependencies: - debug - babel-code-frame@6.26.0: - dependencies: - chalk: 1.1.3 - esutils: 2.0.3 - js-tokens: 3.0.2 - - babel-core@6.26.3: - dependencies: - babel-code-frame: 6.26.0 - babel-generator: 6.26.1 - babel-helpers: 6.24.1 - babel-messages: 6.23.0 - babel-register: 6.26.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - convert-source-map: 1.9.0 - debug: 2.6.9 - json5: 0.5.1 - lodash: 4.17.21 - minimatch: 3.1.2 - path-is-absolute: 1.0.1 - private: 0.1.8 - slash: 1.0.0 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - - babel-generator@6.26.1: - dependencies: - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - detect-indent: 4.0.0 - jsesc: 1.3.0 - lodash: 4.17.21 - source-map: 0.5.7 - trim-right: 1.0.1 - - babel-helper-builder-binary-assignment-operator-visitor@6.24.1: - dependencies: - babel-helper-explode-assignable-expression: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-call-delegate@6.24.1: - dependencies: - babel-helper-hoist-variables: 6.24.1 - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-define-map@6.26.0: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-helper-explode-assignable-expression@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-function-name@6.24.1: - dependencies: - babel-helper-get-function-arity: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-get-function-arity@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-helper-hoist-variables@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-helper-optimise-call-expression@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-helper-regex@6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - lodash: 4.17.21 - - babel-helper-remap-async-to-generator@6.24.1: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-replace-supers@6.24.1: - dependencies: - babel-helper-optimise-call-expression: 6.24.1 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helpers@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - babel-jest@29.7.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 @@ -18619,14 +16198,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-messages@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-check-es2015-constants@6.22.0: - dependencies: - babel-runtime: 6.26.0 - babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.27.1 @@ -18644,242 +16215,32 @@ snapshots: '@types/babel__core': 7.20.5 '@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.29.1: dependencies: hermes-parser: 0.29.1 - babel-plugin-syntax-trailing-function-commas@6.22.0: {} - babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} - babel-plugin-transform-async-to-generator@6.24.1: - dependencies: - babel-helper-remap-async-to-generator: 6.24.1 - babel-plugin-syntax-async-functions: 6.13.0 - babel-runtime: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-arrow-functions@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-block-scoped-functions@6.22.0: + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): dependencies: - babel-runtime: 6.26.0 + '@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-plugin-transform-es2015-block-scoping@6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-classes@6.24.1: - dependencies: - babel-helper-define-map: 6.26.0 - babel-helper-function-name: 6.24.1 - babel-helper-optimise-call-expression: 6.24.1 - babel-helper-replace-supers: 6.24.1 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-computed-properties@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-destructuring@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-duplicate-keys@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-plugin-transform-es2015-for-of@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-function-name@6.24.1: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-literals@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-modules-amd@6.24.1: - dependencies: - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-modules-commonjs@6.26.2: - dependencies: - babel-plugin-transform-strict-mode: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-modules-systemjs@6.24.1: - dependencies: - babel-helper-hoist-variables: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-modules-umd@6.24.1: - dependencies: - babel-plugin-transform-es2015-modules-amd: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-object-super@6.24.1: - dependencies: - babel-helper-replace-supers: 6.24.1 - babel-runtime: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-parameters@6.24.1: - dependencies: - babel-helper-call-delegate: 6.24.1 - babel-helper-get-function-arity: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-shorthand-properties@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-plugin-transform-es2015-spread@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-sticky-regex@6.24.1: - dependencies: - babel-helper-regex: 6.26.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-plugin-transform-es2015-template-literals@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-typeof-symbol@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-unicode-regex@6.24.1: - dependencies: - babel-helper-regex: 6.26.0 - babel-runtime: 6.26.0 - regexpu-core: 2.0.0 - - babel-plugin-transform-exponentiation-operator@6.24.1: - dependencies: - babel-helper-builder-binary-assignment-operator-visitor: 6.24.1 - babel-plugin-syntax-exponentiation-operator: 6.13.0 - babel-runtime: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-regenerator@6.26.0: - dependencies: - regenerator-transform: 0.10.1 - - babel-plugin-transform-strict-mode@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - 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: - babel-plugin-check-es2015-constants: 6.22.0 - babel-plugin-syntax-trailing-function-commas: 6.22.0 - babel-plugin-transform-async-to-generator: 6.24.1 - babel-plugin-transform-es2015-arrow-functions: 6.22.0 - babel-plugin-transform-es2015-block-scoped-functions: 6.22.0 - babel-plugin-transform-es2015-block-scoping: 6.26.0 - babel-plugin-transform-es2015-classes: 6.24.1 - babel-plugin-transform-es2015-computed-properties: 6.24.1 - babel-plugin-transform-es2015-destructuring: 6.23.0 - babel-plugin-transform-es2015-duplicate-keys: 6.24.1 - babel-plugin-transform-es2015-for-of: 6.23.0 - babel-plugin-transform-es2015-function-name: 6.24.1 - babel-plugin-transform-es2015-literals: 6.22.0 - babel-plugin-transform-es2015-modules-amd: 6.24.1 - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - babel-plugin-transform-es2015-modules-systemjs: 6.24.1 - babel-plugin-transform-es2015-modules-umd: 6.24.1 - babel-plugin-transform-es2015-object-super: 6.24.1 - babel-plugin-transform-es2015-parameters: 6.24.1 - babel-plugin-transform-es2015-shorthand-properties: 6.24.1 - babel-plugin-transform-es2015-spread: 6.22.0 - babel-plugin-transform-es2015-sticky-regex: 6.24.1 - babel-plugin-transform-es2015-template-literals: 6.22.0 - babel-plugin-transform-es2015-typeof-symbol: 6.23.0 - babel-plugin-transform-es2015-unicode-regex: 6.24.1 - babel-plugin-transform-exponentiation-operator: 6.24.1 - babel-plugin-transform-regenerator: 6.26.0 - browserslist: 3.2.8 - invariant: 2.2.4 - semver: 5.7.2 - transitivePeerDependencies: - - supports-color - - babel-preset-fbjs@3.4.0(@babel/core@7.28.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) @@ -18918,67 +16279,6 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) - babel-register@6.26.0: - dependencies: - babel-core: 6.26.3 - babel-runtime: 6.26.0 - core-js: 2.6.12 - home-or-tmp: 2.0.0 - lodash: 4.17.21 - mkdirp: 0.5.6 - source-map-support: 0.4.18 - transitivePeerDependencies: - - supports-color - - babel-runtime@6.26.0: - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 - - babel-template@6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-traverse@6.26.0: - dependencies: - babel-code-frame: 6.26.0 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - debug: 2.6.9 - globals: 9.18.0 - invariant: 2.2.4 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-types@6.26.0: - dependencies: - babel-runtime: 6.26.0 - esutils: 2.0.3 - lodash: 4.17.21 - to-fast-properties: 1.0.3 - - babelify@7.3.0: - dependencies: - babel-core: 6.26.3 - object-assign: 4.1.1 - transitivePeerDependencies: - - supports-color - - babylon@6.18.0: {} - - backoff@2.5.0: - dependencies: - precond: 0.2.3 - balanced-match@1.0.2: {} base-64@0.1.0: {} @@ -18991,16 +16291,6 @@ snapshots: base64-js@1.5.1: {} - base@0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - baseline-browser-mapping@2.8.4: {} basic-auth@2.0.1: @@ -19028,8 +16318,6 @@ snapshots: bignumber.js@9.3.1: {} - binary-extensions@1.13.1: {} - binary-extensions@2.3.0: {} bindings@1.5.0: @@ -19039,14 +16327,6 @@ snapshots: bintrees@1.0.2: {} - bip39@2.5.0: - dependencies: - create-hash: 1.2.0 - 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.19.14 @@ -19135,24 +16415,6 @@ snapshots: transitivePeerDependencies: - supports-color - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - optional: true - bowser@2.12.1: {} boxen@5.1.2: @@ -19175,35 +16437,12 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@1.8.5: - dependencies: - expand-range: 1.8.2 - preserve: 0.2.0 - repeat-element: 1.1.4 - - braces@2.3.2: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - braces@3.0.3: dependencies: fill-range: 7.1.1 brorand@1.1.0: {} - browser-stdout@1.3.0: {} - browser-stdout@1.3.1: {} browserify-aes@1.2.0: @@ -19215,47 +16454,6 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserify-cipher@1.0.1: - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - optional: true - - browserify-des@1.0.2: - dependencies: - cipher-base: 1.0.6 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - optional: true - - browserify-rsa@4.1.1: - dependencies: - bn.js: 5.2.2 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - optional: true - - browserify-sign@4.2.3: - dependencies: - bn.js: 5.2.2 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.6.1 - hash-base: 3.0.5 - inherits: 2.0.4 - parse-asn1: 5.1.7 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - optional: true - - browserslist@3.2.8: - dependencies: - caniuse-lite: 1.0.30001741 - electron-to-chromium: 1.5.218 - browserslist@4.26.0: dependencies: baseline-browser-mapping: 2.8.4 @@ -19284,9 +16482,6 @@ snapshots: buffer-from@1.1.2: {} - buffer-to-arraybuffer@0.0.5: - optional: true - buffer-writer@2.0.0: {} buffer-xor@1.0.3: {} @@ -19314,6 +16509,7 @@ snapshots: bufferutil@4.0.9: dependencies: node-gyp-build: 4.8.4 + optional: true bundle-require@5.1.0(esbuild@0.25.9): dependencies: @@ -19328,15 +16524,6 @@ snapshots: bytes@3.1.2: {} - bytewise-core@1.2.3: - dependencies: - typewise-core: 1.2.0 - - bytewise@1.1.0: - dependencies: - bytewise-core: 1.2.3 - typewise: 1.0.3 - cac@6.7.14: {} cacache@18.0.4: @@ -19354,21 +16541,6 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 - cache-base@1.0.1: - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - - cacheable-lookup@5.0.4: - optional: true - cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -19381,33 +16553,6 @@ snapshots: normalize-url: 8.1.0 responselike: 3.0.0 - cacheable-request@6.1.0: - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.2.0 - keyv: 3.1.0 - lowercase-keys: 2.0.0 - normalize-url: 4.5.1 - responselike: 1.0.2 - optional: true - - cacheable-request@7.0.4: - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - optional: true - - cachedown@1.0.0: - dependencies: - abstract-leveldown: 2.7.2 - lru-cache: 3.2.0 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -19444,8 +16589,6 @@ snapshots: camelcase@3.0.0: {} - camelcase@4.1.0: {} - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -19507,14 +16650,6 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chalk@1.1.3: - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -19589,25 +16724,6 @@ snapshots: check-error@2.1.3: {} - checkpoint-store@1.1.0: - dependencies: - functional-red-black-tree: 1.0.1 - - chokidar@1.7.0: - dependencies: - anymatch: 1.3.2 - async-each: 1.0.6 - glob-parent: 2.0.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 2.0.1 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -19657,30 +16773,11 @@ snapshots: ci-info@3.9.0: {} - cids@0.7.5: - dependencies: - buffer: 5.7.1 - class-is: 1.1.0 - multibase: 0.6.1 - multicodec: 1.0.4 - multihashes: 0.4.21 - optional: true - cipher-base@1.0.6: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - class-is@1.1.0: - optional: true - - class-utils@0.3.6: - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - clean-stack@2.2.0: {} cli-boxes@2.2.1: {} @@ -19706,16 +16803,6 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 - cli-truncate@2.1.0: - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - - cli-truncate@3.1.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - cli-truncate@5.0.0: dependencies: slice-ansi: 7.1.2 @@ -19729,12 +16816,6 @@ snapshots: strip-ansi: 3.0.1 wrap-ansi: 2.1.0 - cliui@4.1.0: - dependencies: - string-width: 2.1.1 - strip-ansi: 4.0.0 - wrap-ansi: 2.1.0 - cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -19753,24 +16834,10 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-response@1.0.3: - dependencies: - mimic-response: 1.0.1 - optional: true - - clone@2.1.2: {} - - co@4.6.0: {} - code-point-at@1.1.0: {} coingecko-api@1.0.10: {} - collection-visit@1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -19808,12 +16875,6 @@ snapshots: command-exists@1.2.9: {} - command-line-args@4.0.7: - dependencies: - array-back: 2.0.0 - find-replace: 1.0.3 - typical: 2.6.1 - command-line-args@5.2.1: dependencies: array-back: 3.1.0 @@ -19836,12 +16897,8 @@ snapshots: commander@14.0.2: {} - commander@2.11.0: {} - commander@2.20.3: {} - commander@3.0.2: {} - commander@8.3.0: {} commander@9.5.0: {} @@ -19855,8 +16912,6 @@ snapshots: compare-versions@6.1.1: {} - component-emitter@1.3.1: {} - concat-map@0.0.1: {} concat-stream@1.6.2: @@ -19899,13 +16954,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - content-hash@2.5.2: - dependencies: - cids: 0.7.5 - multicodec: 0.5.7 - multihashes: 0.4.21 - optional: true - content-type@1.0.5: {} conventional-changelog-angular@7.0.0: @@ -19923,8 +16971,6 @@ snapshots: meow: 12.1.1 split2: 4.2.0 - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} cookie-signature@1.0.6: {} @@ -19933,18 +16979,8 @@ snapshots: cookie@0.5.0: {} - cookie@0.7.1: - optional: true - - cookiejar@2.1.4: - optional: true - - copy-descriptor@0.1.1: {} - core-js-pure@3.45.1: {} - core-js@2.6.12: {} - core-util-is@1.0.2: {} core-util-is@1.0.3: {} @@ -19971,7 +17007,7 @@ snapshots: cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: @@ -19981,19 +17017,13 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: typescript: 5.9.3 crc-32@1.2.2: {} - create-ecdh@4.0.4: - dependencies: - bn.js: 4.12.2 - elliptic: 6.6.1 - optional: true - create-hash@1.1.3: dependencies: cipher-base: 1.0.6 @@ -20020,13 +17050,6 @@ snapshots: create-require@1.1.1: {} - cross-fetch@2.2.6(encoding@0.1.13): - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - whatwg-fetch: 2.0.4 - transitivePeerDependencies: - - encoding - cross-fetch@3.1.5(encoding@0.1.13): dependencies: node-fetch: 2.6.7(encoding@0.1.13) @@ -20049,20 +17072,6 @@ snapshots: dependencies: tslib: 2.8.1 - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@6.0.6: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -20071,26 +17080,6 @@ snapshots: crypt@0.0.2: {} - crypto-browserify@3.12.0: - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.3 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - inherits: 2.0.4 - pbkdf2: 3.1.3 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - optional: true - - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - dargs@8.1.0: {} dashdash@1.14.1: @@ -20127,16 +17116,6 @@ snapshots: dependencies: ms: 2.0.0 - debug@3.1.0(supports-color@4.4.0): - dependencies: - ms: 2.0.0 - optionalDependencies: - supports-color: 4.4.0 - - debug@3.2.6: - dependencies: - ms: 2.1.3 - debug@3.2.7: dependencies: ms: 2.1.3 @@ -20147,12 +17126,6 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.4.3(supports-color@9.4.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 9.4.0 - decamelize@1.2.0: {} decamelize@4.0.0: {} @@ -20161,13 +17134,6 @@ snapshots: dependencies: character-entities: 2.0.2 - decode-uri-component@0.2.2: {} - - decompress-response@3.3.0: - dependencies: - mimic-response: 1.0.1 - optional: true - decompress-response@4.2.1: dependencies: mimic-response: 2.1.0 @@ -20185,33 +17151,12 @@ snapshots: deep-eql@5.0.2: {} - deep-equal@1.1.2: - dependencies: - is-arguments: 1.2.0 - is-date-object: 1.1.0 - is-regex: 1.2.1 - object-is: 1.1.6 - object-keys: 1.1.1 - regexp.prototype.flags: 1.5.4 - deep-extend@0.6.0: {} deep-is@0.1.4: {} - defer-to-connect@1.1.3: - optional: true - defer-to-connect@2.0.1: {} - deferred-leveldown@1.2.2: - dependencies: - abstract-leveldown: 2.6.3 - - deferred-leveldown@4.0.2: - dependencies: - abstract-leveldown: 5.0.0 - inherits: 2.0.4 - deferred-leveldown@5.3.0: dependencies: abstract-leveldown: 6.2.3 @@ -20231,21 +17176,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - define-property@0.2.5: - dependencies: - is-descriptor: 0.1.7 - - define-property@1.0.0: - dependencies: - is-descriptor: 1.0.3 - - define-property@2.0.2: - dependencies: - is-descriptor: 1.0.3 - isobject: 3.0.1 - - defined@1.0.1: {} - delayed-stream@1.0.0: {} delegates@1.0.0: @@ -20266,20 +17196,10 @@ snapshots: dequal@2.0.3: {} - des.js@1.1.0: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - optional: true - destroy@1.0.4: {} destroy@1.2.0: {} - detect-indent@4.0.0: - dependencies: - repeating: 2.0.1 - detect-indent@6.1.0: {} detect-libc@1.0.3: @@ -20289,21 +17209,10 @@ snapshots: dependencies: dequal: 2.0.3 - diff@3.3.1: {} - - diff@3.5.0: {} - diff@4.0.2: {} diff@5.2.0: {} - diffie-hellman@5.0.3: - dependencies: - bn.js: 4.12.2 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - optional: true - difflib@0.2.4: dependencies: heap: 0.2.7 @@ -20321,8 +17230,6 @@ snapshots: dependencies: esutils: 2.0.3 - dom-walk@0.1.2: {} - dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -20336,10 +17243,6 @@ snapshots: dotenv@16.6.1: {} - dotignore@0.1.2: - dependencies: - minimatch: 3.1.2 - dottie@2.0.6: {} dset@3.1.4: {} @@ -20350,9 +17253,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexer3@0.1.5: - optional: true - duplexify@4.1.3: dependencies: end-of-stream: 1.4.5 @@ -20414,14 +17314,6 @@ snapshots: encodeurl@2.0.0: {} - encoding-down@5.0.4: - dependencies: - abstract-leveldown: 5.0.0 - inherits: 2.0.4 - level-codec: 9.0.2 - level-errors: 2.0.1 - xtend: 4.0.2 - encoding-down@6.3.0: dependencies: abstract-leveldown: 6.3.0 @@ -20432,6 +17324,7 @@ snapshots: encoding@0.1.13: dependencies: iconv-lite: 0.6.3 + optional: true end-of-stream@1.4.5: dependencies: @@ -20448,8 +17341,6 @@ snapshots: environment@1.1.0: {} - eol@0.9.1: {} - err-code@2.0.3: {} errno@0.1.8: @@ -20521,8 +17412,6 @@ snapshots: unbox-primitive: 1.1.0 which-typed-array: 1.1.19 - es-array-method-boxes-properly@1.0.0: {} - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -20548,24 +17437,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - esbuild@0.25.9: optionalDependencies: '@esbuild/aix-ppc64': 0.25.9 @@ -20732,7 +17603,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -20756,13 +17627,6 @@ snapshots: transitivePeerDependencies: - supports-color - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - espree@10.4.0: dependencies: acorn: 8.15.0 @@ -20789,18 +17653,6 @@ snapshots: etag@1.8.1: {} - eth-block-tracker@3.0.1: - dependencies: - eth-query: 2.1.2 - ethereumjs-tx: 1.3.7 - ethereumjs-util: 5.2.1 - ethjs-util: 0.1.6 - json-rpc-engine: 3.8.0 - pify: 2.3.0 - tape: 4.17.0 - transitivePeerDependencies: - - supports-color - eth-ens-namehash@2.0.8: dependencies: idna-uts46-hx: 2.3.1 @@ -20826,102 +17678,10 @@ snapshots: - debug - utf-8-validate - eth-json-rpc-infura@3.2.1(encoding@0.1.13): - dependencies: - cross-fetch: 2.2.6(encoding@0.1.13) - eth-json-rpc-middleware: 1.6.0 - json-rpc-engine: 3.8.0 - json-rpc-error: 2.0.0 - transitivePeerDependencies: - - encoding - - supports-color - - eth-json-rpc-middleware@1.6.0: - dependencies: - async: 2.6.4 - eth-query: 2.1.2 - eth-tx-summary: 3.2.4 - ethereumjs-block: 1.7.1 - ethereumjs-tx: 1.3.7 - ethereumjs-util: 5.2.1 - ethereumjs-vm: 2.6.0 - fetch-ponyfill: 4.1.0 - json-rpc-engine: 3.8.0 - json-rpc-error: 2.0.0 - json-stable-stringify: 1.3.0 - promise-to-callback: 1.0.0 - tape: 4.17.0 - transitivePeerDependencies: - - supports-color - - eth-lib@0.1.29(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - bn.js: 4.12.2 - elliptic: 6.6.1 - nano-json-stream-parser: 0.1.2 - servify: 0.1.12 - ws: 3.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - xhr-request-promise: 0.1.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - - eth-lib@0.2.8: - dependencies: - bn.js: 4.12.2 - elliptic: 6.6.1 - xhr-request-promise: 0.1.3 - optional: true - - eth-query@2.1.2: - dependencies: - json-rpc-random-id: 1.0.1 - xtend: 4.0.2 - - eth-sig-util@1.4.2: - dependencies: - ethereumjs-abi: https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0 - ethereumjs-util: 5.2.1 - - eth-sig-util@3.0.0: - dependencies: - buffer: 5.7.1 - elliptic: 6.6.1 - ethereumjs-abi: 0.6.5 - ethereumjs-util: 5.2.1 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - - eth-tx-summary@3.2.4: - dependencies: - async: 2.6.4 - clone: 2.1.2 - concat-stream: 1.6.2 - end-of-stream: 1.4.5 - eth-query: 2.1.2 - ethereumjs-block: 1.7.1 - ethereumjs-tx: 1.3.7 - ethereumjs-util: 5.2.1 - ethereumjs-vm: 2.6.0 - through2: 2.0.5 - - ethashjs@0.0.8: - dependencies: - async: 2.6.4 - buffer-xor: 2.0.2 - ethereumjs-util: 7.1.5 - miller-rabin: 4.0.1 - ethereum-bloom-filters@1.2.0: dependencies: '@noble/hashes': 1.8.0 - ethereum-common@0.0.18: {} - - ethereum-common@0.2.0: {} - ethereum-cryptography@0.1.3: dependencies: '@types/pbkdf2': 3.1.2 @@ -20954,20 +17714,6 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10): - dependencies: - '@ethereum-waffle/chai': 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@ethereum-waffle/compiler': 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@ethereum-waffle/mock-contract': 3.4.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@ethereum-waffle/provider': 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.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)) @@ -20987,92 +17733,11 @@ snapshots: - supports-color - typescript - ethereumjs-abi@0.6.5: - dependencies: - bn.js: 4.12.2 - ethereumjs-util: 4.5.1 - ethereumjs-abi@0.6.8: dependencies: bn.js: 4.12.2 ethereumjs-util: 6.2.1 - ethereumjs-abi@https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0: - dependencies: - bn.js: 4.12.2 - ethereumjs-util: 6.2.1 - - ethereumjs-account@2.0.5: - dependencies: - ethereumjs-util: 5.2.1 - rlp: 2.2.7 - safe-buffer: 5.2.1 - - ethereumjs-account@3.0.0: - dependencies: - ethereumjs-util: 6.2.1 - rlp: 2.2.7 - safe-buffer: 5.2.1 - - ethereumjs-block@1.7.1: - dependencies: - async: 2.6.4 - ethereum-common: 0.2.0 - ethereumjs-tx: 1.3.7 - ethereumjs-util: 5.2.1 - merkle-patricia-tree: 2.3.2 - - ethereumjs-block@2.2.2: - dependencies: - async: 2.6.4 - ethereumjs-common: 1.5.0 - ethereumjs-tx: 2.1.2 - ethereumjs-util: 5.2.1 - merkle-patricia-tree: 2.3.2 - - ethereumjs-blockchain@4.0.4: - dependencies: - async: 2.6.4 - ethashjs: 0.0.8 - ethereumjs-block: 2.2.2 - ethereumjs-common: 1.5.0 - ethereumjs-util: 6.2.1 - flow-stoplight: 1.0.0 - level-mem: 3.0.1 - lru-cache: 5.1.1 - rlp: 2.2.7 - semaphore: 1.1.0 - - ethereumjs-common@1.5.0: {} - - ethereumjs-tx@1.3.7: - dependencies: - ethereum-common: 0.0.18 - ethereumjs-util: 5.2.1 - - ethereumjs-tx@2.1.2: - dependencies: - ethereumjs-common: 1.5.0 - ethereumjs-util: 6.2.1 - - ethereumjs-util@4.5.1: - dependencies: - bn.js: 4.12.2 - create-hash: 1.2.0 - elliptic: 6.6.1 - ethereum-cryptography: 0.1.3 - rlp: 2.2.7 - - ethereumjs-util@5.2.1: - dependencies: - bn.js: 4.12.2 - create-hash: 1.2.0 - elliptic: 6.6.1 - ethereum-cryptography: 0.1.3 - ethjs-util: 0.1.6 - rlp: 2.2.7 - safe-buffer: 5.2.1 - ethereumjs-util@6.2.1: dependencies: '@types/bn.js': 4.11.6 @@ -21099,51 +17764,6 @@ snapshots: ethereum-cryptography: 0.1.3 rlp: 2.2.7 - ethereumjs-vm@2.6.0: - dependencies: - async: 2.6.4 - async-eventemitter: 0.2.4 - ethereumjs-account: 2.0.5 - ethereumjs-block: 2.2.2 - ethereumjs-common: 1.5.0 - ethereumjs-util: 6.2.1 - fake-merkle-patricia-tree: 1.0.1 - functional-red-black-tree: 1.0.1 - merkle-patricia-tree: 2.3.2 - rustbn.js: 0.2.0 - safe-buffer: 5.2.1 - - ethereumjs-vm@4.2.0: - dependencies: - async: 2.6.4 - async-eventemitter: 0.2.4 - core-js-pure: 3.45.1 - ethereumjs-account: 3.0.0 - ethereumjs-block: 2.2.2 - ethereumjs-blockchain: 4.0.4 - ethereumjs-common: 1.5.0 - ethereumjs-tx: 2.1.2 - ethereumjs-util: 6.2.1 - fake-merkle-patricia-tree: 1.0.1 - functional-red-black-tree: 1.0.1 - merkle-patricia-tree: 2.3.2 - rustbn.js: 0.2.0 - safe-buffer: 5.2.1 - util.promisify: 1.1.3 - - ethereumjs-wallet@0.6.5: - dependencies: - aes-js: 3.1.2 - bs58check: 2.1.2 - ethereum-cryptography: 0.1.3 - ethereumjs-util: 6.2.1 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - scryptsy: 1.2.1 - utf8: 3.0.0 - uuid: 3.4.0 - optional: true - ethers@5.6.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.6.0 @@ -21324,35 +17944,8 @@ snapshots: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 - ethlint@1.2.5(solium@1.2.5): - dependencies: - ajv: 5.5.2 - chokidar: 1.7.0 - colors: 1.4.0 - commander: 2.20.3 - diff: 3.5.0 - eol: 0.9.1 - js-string-escape: 1.0.1 - lodash: 4.17.21 - sol-digger: 0.0.2 - sol-explore: 1.6.1 - solium-plugin-security: 0.1.1(solium@1.2.5) - solparse: 2.2.8 - text-table: 0.2.0 - transitivePeerDependencies: - - solium - - supports-color - - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-target-shim@5.0.1: {} - eventemitter3@4.0.4: - optional: true - eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} @@ -21364,48 +17957,6 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.2.1 - execa@0.7.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - expand-brackets@0.1.5: - dependencies: - is-posix-bracket: 0.1.1 - - expand-brackets@2.1.4: - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - expand-range@1.8.2: - dependencies: - fill-range: 2.2.4 - expand-template@2.0.3: optional: true @@ -21482,56 +18033,6 @@ snapshots: transitivePeerDependencies: - supports-color - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - optional: true - - ext@1.7.0: - dependencies: - type: 2.7.3 - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - extend@3.0.2: {} extendable-error@0.1.7: {} @@ -21542,37 +18043,14 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extglob@0.3.2: - dependencies: - is-extglob: 1.0.0 - - extglob@2.0.4: - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - extract-files@11.0.0: {} extsprintf@1.3.0: {} - fake-merkle-patricia-tree@1.0.1: - dependencies: - checkpoint-store: 1.1.0 - fast-base64-decode@1.0.0: {} fast-decode-uri-component@1.0.1: {} - fast-deep-equal@1.1.0: {} - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -21641,10 +18119,6 @@ snapshots: fecha@4.2.3: {} - fetch-ponyfill@4.1.0: - dependencies: - node-fetch: 1.7.3 - fets@0.1.5: dependencies: '@ardatan/fast-json-stringify': 0.0.6(ajv-formats@2.1.1(ajv@8.17.1))(ajv@8.17.1) @@ -21671,23 +18145,6 @@ snapshots: file-uri-to-path@1.0.0: optional: true - filename-regex@2.0.1: {} - - fill-range@2.2.4: - dependencies: - is-number: 2.1.0 - isobject: 2.1.0 - randomatic: 3.1.1 - repeat-element: 1.1.4 - repeat-string: 1.6.1 - - fill-range@4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -21716,24 +18173,6 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - optional: true - - find-replace@1.0.3: - dependencies: - array-back: 1.0.4 - test-value: 2.1.0 - find-replace@3.0.0: dependencies: array-back: 3.1.0 @@ -21743,10 +18182,6 @@ snapshots: path-exists: 2.1.0 pinkie-promise: 2.0.1 - find-up@2.1.0: - dependencies: - locate-path: 2.0.0 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -21763,17 +18198,6 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 - find-yarn-workspace-root@1.2.1: - dependencies: - fs-extra: 4.0.3 - micromatch: 3.1.10 - transitivePeerDependencies: - - supports-color - - find-yarn-workspace-root@2.0.0: - dependencies: - micromatch: 4.0.8 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -21785,8 +18209,6 @@ snapshots: flow-enums-runtime@0.0.6: {} - flow-stoplight@1.0.0: {} - fmix@0.1.0: dependencies: imul: 1.0.1 @@ -21795,18 +18217,12 @@ snapshots: follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) for-each@0.3.5: dependencies: is-callable: 1.2.7 - for-in@1.0.2: {} - - for-own@0.1.5: - dependencies: - for-in: 1.0.2 - foreach@2.0.6: {} foreground-child@3.3.1: @@ -21855,10 +18271,6 @@ snapshots: fp-ts@1.19.3: {} - fragment-cache@0.2.1: - dependencies: - map-cache: 0.2.2 - fresh@0.5.2: {} fs-constants@1.0.0: @@ -21884,12 +18296,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@4.0.3: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -21909,11 +18315,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-minipass@1.2.7: - dependencies: - minipass: 2.9.0 - optional: true - fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -21926,12 +18327,6 @@ snapshots: fs.realpath@1.0.0: {} - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.23.0 - optional: true - fsevents@2.3.3: optional: true @@ -21950,44 +18345,6 @@ snapshots: functions-have-names@1.2.3: {} - ganache-core@2.13.2(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10): - dependencies: - abstract-leveldown: 3.0.0 - async: 2.6.2 - bip39: 2.5.0 - cachedown: 1.0.0 - clone: 2.1.2 - debug: 3.2.6 - encoding-down: 5.0.4 - eth-sig-util: 3.0.0 - ethereumjs-abi: 0.6.8 - ethereumjs-account: 3.0.0 - ethereumjs-block: 2.2.2 - ethereumjs-common: 1.5.0 - ethereumjs-tx: 2.1.2 - ethereumjs-util: 6.2.1 - ethereumjs-vm: 4.2.0 - heap: 0.2.6 - level-sublevel: 6.6.4 - levelup: 3.1.1 - lodash: 4.17.20 - lru-cache: 5.1.1 - merkle-patricia-tree: 3.0.0 - patch-package: 6.2.2 - seedrandom: 3.0.1 - source-map-support: 0.5.12 - tmp: 0.1.0 - web3-provider-engine: 14.2.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - websocket: 1.0.32 - optionalDependencies: - ethereumjs-wallet: 0.6.5 - web3: 1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - ganache@7.4.3: optionalDependencies: bufferutil: 4.0.5 @@ -22037,18 +18394,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@3.0.0: {} - - get-stream@4.1.0: - dependencies: - pump: 3.0.3 - optional: true - - get-stream@5.2.0: - dependencies: - pump: 3.0.3 - optional: true - get-stream@6.0.1: {} get-symbol-description@1.1.0: @@ -22061,8 +18406,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-value@2.0.6: {} - getpass@0.1.7: dependencies: assert-plus: 1.0.0 @@ -22081,15 +18424,6 @@ snapshots: github-from-package@0.0.0: optional: true - glob-base@0.3.0: - dependencies: - glob-parent: 2.0.0 - is-glob: 2.0.1 - - glob-parent@2.0.0: - dependencies: - is-glob: 2.0.1 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -22124,15 +18458,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@7.1.2: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - glob@7.1.7: dependencies: fs.realpath: 1.0.0 @@ -22173,17 +18498,10 @@ snapshots: kind-of: 6.0.3 which: 1.3.1 - global@4.4.0: - dependencies: - min-document: 2.19.0 - process: 0.11.10 - globals@14.0.0: {} globals@16.4.0: {} - globals@9.18.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -22211,21 +18529,6 @@ snapshots: gopd@1.2.0: {} - got@11.8.6: - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - optional: true - got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -22240,23 +18543,6 @@ snapshots: p-cancelable: 3.0.0 responselike: 3.0.0 - got@9.6.0: - dependencies: - '@sindresorhus/is': 0.14.0 - '@szmarczak/http-timer': 1.1.2 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - cacheable-request: 6.1.0 - decompress-response: 3.3.0 - duplexer3: 0.1.5 - get-stream: 4.1.0 - lowercase-keys: 1.0.1 - mimic-response: 1.0.1 - p-cancelable: 1.1.0 - to-readable-stream: 1.0.0 - url-parse-lax: 3.0.0 - optional: true - graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} @@ -22327,8 +18613,6 @@ snapshots: graphql@16.8.0: {} - growl@1.10.3: {} - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -22375,7 +18659,7 @@ snapshots: axios: 0.21.4(debug@4.4.3) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: 4.0.4 @@ -22406,7 +18690,7 @@ snapshots: axios: 0.21.4(debug@4.4.3) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) form-data: 3.0.4 fs-extra: 9.1.0 hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -22418,12 +18702,12 @@ snapshots: - supports-color - utf-8-validate - hardhat-deploy@2.0.0-next.61(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(hardhat@3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + hardhat-deploy@2.0.0-next.61(@rocketh/node@0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(hardhat@3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@nomicfoundation/hardhat-zod-utils': 3.0.1(zod@3.25.76) - '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@rocketh/node': 0.17.16(bufferutil@4.0.9)(rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@types/debug': 4.1.12 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) hardhat: 3.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) named-logs-console: 0.5.1 slash: 5.1.0 @@ -22452,7 +18736,7 @@ snapshots: hardhat-secure-accounts@0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -22464,7 +18748,7 @@ snapshots: hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -22476,7 +18760,7 @@ snapshots: hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -22503,7 +18787,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -22552,7 +18836,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -22600,7 +18884,7 @@ snapshots: adm-zip: 0.4.16 chalk: 5.6.2 chokidar: 4.0.3 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 ethereum-cryptography: 2.2.1 micro-eth-signer: 0.14.0 @@ -22615,16 +18899,10 @@ snapshots: - supports-color - utf-8-validate - has-ansi@2.0.0: - dependencies: - ansi-regex: 2.1.1 - has-bigints@1.1.0: {} has-flag@1.0.0: {} - has-flag@2.0.0: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -22646,37 +18924,10 @@ snapshots: has-unicode@2.0.1: optional: true - has-value@0.3.1: - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - - has-value@1.0.0: - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - has-values@0.1.4: {} - - has-values@1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - - has@1.0.4: {} - hash-base@2.0.2: dependencies: inherits: 2.0.4 - hash-base@3.0.5: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - optional: true - hash-base@3.1.0: dependencies: inherits: 2.0.4 @@ -22694,8 +18945,6 @@ snapshots: dependencies: function-bind: 1.1.2 - he@1.1.1: {} - he@1.2.0: {} header-case@2.0.4: @@ -22703,8 +18952,6 @@ snapshots: capital-case: 1.0.4 tslib: 2.8.1 - heap@0.2.6: {} - heap@0.2.7: {} helmet@5.0.2: {} @@ -22723,11 +18970,6 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - home-or-tmp@2.0.0: - dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - hosted-git-info@2.8.9: {} hosted-git-info@7.0.2: @@ -22761,13 +19003,10 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-https@1.0.0: - optional: true - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22781,12 +19020,6 @@ snapshots: jsprim: 1.4.2 sshpk: 1.18.0 - http2-wrapper@1.0.3: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - optional: true - http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -22795,23 +19028,19 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color human-id@4.1.1: {} - human-signals@2.1.0: {} - - husky@7.0.4: {} - husky@9.1.7: {} iconv-lite@0.4.24: @@ -22821,6 +19050,7 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + optional: true iconv-lite@0.7.0: dependencies: @@ -22932,10 +19162,6 @@ snapshots: is-relative: 1.0.0 is-windows: 1.0.2 - is-accessor-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -22943,11 +19169,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -22970,10 +19191,6 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -22983,22 +19200,12 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-buffer@1.1.6: {} - is-callable@1.2.7: {} - is-ci@2.0.0: - dependencies: - ci-info: 2.0.0 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - is-data-view@1.0.2: dependencies: call-bound: 1.0.4 @@ -23012,44 +19219,16 @@ snapshots: is-decimal@2.0.1: {} - is-descriptor@0.1.7: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - - is-descriptor@1.0.3: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - is-directory@0.3.1: {} is-docker@2.2.1: {} - is-dotfile@1.0.3: {} - - is-equal-shallow@0.1.3: - dependencies: - is-primitive: 2.0.0 - - is-extendable@0.1.1: {} - - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - - is-extglob@1.0.0: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 - is-finite@1.1.0: {} - - is-fn@1.0.0: {} - is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 @@ -23058,14 +19237,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@4.0.0: {} - is-fullwidth-code-point@5.1.0: dependencies: get-east-asian-width: 1.4.0 - is-function@1.0.2: {} - is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 @@ -23073,10 +19248,6 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 - is-glob@2.0.1: - dependencies: - is-extglob: 1.0.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -23100,41 +19271,18 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-number@2.1.0: - dependencies: - kind-of: 3.2.2 - - is-number@3.0.0: - dependencies: - kind-of: 3.2.2 - - is-number@4.0.0: {} - is-number@7.0.0: {} is-obj@2.0.0: {} is-plain-obj@2.1.0: {} - is-plain-object@2.0.4: + is-regex@1.2.1: dependencies: - isobject: 3.0.1 - - is-posix-bracket@0.1.1: {} - - is-primitive@2.0.0: {} - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.8 - has-tostringtag: 1.0.2 - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 is-relative@1.0.0: dependencies: @@ -23146,8 +19294,6 @@ snapshots: dependencies: call-bound: 1.0.4 - is-stream@1.1.0: {} - is-stream@2.0.1: {} is-string@1.1.1: @@ -23206,20 +19352,12 @@ snapshots: dependencies: is-docker: 2.2.1 - isarray@0.0.1: {} - isarray@1.0.0: {} isarray@2.0.5: {} isexe@2.0.0: {} - isobject@2.1.0: - dependencies: - isarray: 1.0.0 - - isobject@3.0.1: {} - isomorphic-unfetch@3.1.0(encoding@0.1.13): dependencies: node-fetch: 2.7.0(encoding@0.1.13) @@ -23343,10 +19481,6 @@ snapshots: js-sha3@0.8.0: {} - js-string-escape@1.0.1: {} - - js-tokens@3.0.2: {} - js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -23366,10 +19500,6 @@ snapshots: jsc-safe-url@0.2.4: {} - jsesc@0.5.0: {} - - jsesc@1.3.0: {} - jsesc@3.1.0: {} json-bigint-patch@0.0.8: {} @@ -23378,9 +19508,6 @@ snapshots: dependencies: bignumber.js: 9.3.1 - json-buffer@3.0.0: - optional: true - json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -23391,31 +19518,12 @@ snapshots: dependencies: foreach: 2.0.6 - json-rpc-engine@3.8.0: - dependencies: - async: 2.6.4 - babel-preset-env: 1.7.0 - babelify: 7.3.0 - json-rpc-error: 2.0.0 - promise-to-callback: 1.0.0 - safe-event-emitter: 1.0.1 - transitivePeerDependencies: - - supports-color - - json-rpc-error@2.0.0: - dependencies: - inherits: 2.0.4 - - json-rpc-random-id@1.0.1: {} - json-schema-to-ts@2.12.0: dependencies: '@babel/runtime': 7.28.4 '@types/json-schema': 7.0.15 ts-algebra: 1.2.2 - json-schema-traverse@0.3.1: {} - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -23424,20 +19532,10 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stable-stringify@1.3.0: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - isarray: 2.0.5 - jsonify: 0.0.1 - object-keys: 1.1.1 - json-stream-stringify@3.1.6: {} json-stringify-safe@5.0.1: {} - json5@0.5.1: {} - json5@1.0.2: dependencies: minimist: 1.2.8 @@ -23460,8 +19558,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonify@0.0.1: {} - jsonparse@1.3.1: {} jsonpointer@5.0.1: {} @@ -23490,29 +19586,12 @@ snapshots: node-gyp-build: 4.8.4 readable-stream: 3.6.2 - keyv@3.1.0: - dependencies: - json-buffer: 3.0.0 - optional: true - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@4.0.0: - dependencies: - is-buffer: 1.1.6 - kind-of@6.0.3: {} - klaw-sync@6.0.0: - dependencies: - graceful-fs: 4.2.11 - klaw@1.3.1: optionalDependencies: graceful-fs: 4.2.11 @@ -23534,122 +19613,42 @@ snapshots: dotenv: 16.6.1 dotenv-expand: 10.0.0 - level-codec@7.0.1: {} - level-codec@9.0.2: dependencies: buffer: 5.7.1 level-concat-iterator@2.0.1: {} - level-errors@1.0.5: - dependencies: - errno: 0.1.8 - level-errors@2.0.1: dependencies: errno: 0.1.8 - level-iterator-stream@1.3.1: - dependencies: - inherits: 2.0.4 - level-errors: 1.0.5 - readable-stream: 1.1.14 - xtend: 4.0.2 - - level-iterator-stream@2.0.3: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - xtend: 4.0.2 - - level-iterator-stream@3.0.1: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - xtend: 4.0.2 - level-iterator-stream@4.0.2: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 xtend: 4.0.2 - level-mem@3.0.1: - dependencies: - level-packager: 4.0.1 - memdown: 3.0.0 - level-mem@5.0.1: dependencies: level-packager: 5.1.1 memdown: 5.1.0 - level-packager@4.0.1: - dependencies: - encoding-down: 5.0.4 - levelup: 3.1.1 - level-packager@5.1.1: dependencies: encoding-down: 6.3.0 levelup: 4.4.0 - level-post@1.0.7: - dependencies: - ltgt: 2.1.3 - - level-sublevel@6.6.4: - dependencies: - bytewise: 1.1.0 - level-codec: 9.0.2 - level-errors: 2.0.1 - level-iterator-stream: 2.0.3 - ltgt: 2.1.3 - pull-defer: 0.2.3 - pull-level: 2.0.4 - pull-stream: 3.7.0 - typewiselite: 1.0.0 - xtend: 4.0.2 - level-supports@1.0.1: dependencies: xtend: 4.0.2 - level-ws@0.0.0: - dependencies: - readable-stream: 1.0.34 - xtend: 2.1.2 - - level-ws@1.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - xtend: 4.0.2 - level-ws@2.0.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 xtend: 4.0.2 - levelup@1.3.9: - dependencies: - deferred-leveldown: 1.2.2 - level-codec: 7.0.1 - level-errors: 1.0.5 - level-iterator-stream: 1.3.1 - prr: 1.0.1 - semver: 5.4.1 - xtend: 4.0.2 - - levelup@3.1.1: - dependencies: - deferred-leveldown: 4.0.2 - level-errors: 2.0.1 - level-iterator-stream: 3.0.1 - xtend: 4.0.2 - levelup@4.4.0: dependencies: deferred-leveldown: 5.3.0 @@ -23681,33 +19680,12 @@ snapshots: transitivePeerDependencies: - supports-color - lilconfig@2.0.5: {} - lines-and-columns@1.2.4: {} linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - lint-staged@12.5.0(enquirer@2.4.1): - dependencies: - cli-truncate: 3.1.0 - colorette: 2.0.20 - commander: 9.5.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) - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-inspect: 1.13.4 - pidtree: 0.5.0 - string-argv: 0.3.2 - supports-color: 9.4.0 - yaml: 1.10.2 - transitivePeerDependencies: - - enquirer - lint-staged@16.2.7: dependencies: commander: 14.0.2 @@ -23718,19 +19696,6 @@ snapshots: string-argv: 0.3.2 yaml: 2.8.1 - listr2@4.0.5(enquirer@2.4.1): - dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.20 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.4.1 - rxjs: 7.8.2 - through: 2.3.8 - wrap-ansi: 7.0.0 - optionalDependencies: - enquirer: 2.4.1 - listr2@9.0.5: dependencies: cli-truncate: 5.0.0 @@ -23754,11 +19719,6 @@ snapshots: dependencies: lie: 3.1.1 - locate-path@2.0.0: - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -23807,8 +19767,6 @@ snapshots: lodash.upperfirst@4.3.1: {} - lodash@4.17.20: {} - lodash@4.17.21: {} log-symbols@4.1.0: @@ -23816,13 +19774,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-update@4.0.0: - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - log-update@6.1.0: dependencies: ansi-escapes: 7.1.0 @@ -23840,10 +19791,6 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - looper@2.0.0: {} - - looper@3.0.0: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -23862,27 +19809,12 @@ snapshots: dependencies: tslib: 2.8.1 - lowercase-keys@1.0.1: - optional: true - - lowercase-keys@2.0.0: - optional: true - lowercase-keys@3.0.0: {} lru-cache@10.4.3: {} lru-cache@11.2.1: {} - lru-cache@3.2.0: - dependencies: - pseudomap: 1.0.2 - - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -23895,8 +19827,6 @@ snapshots: lru_map@0.3.3: {} - ltgt@2.1.3: {} - ltgt@2.2.1: {} make-error@1.3.6: {} @@ -23924,10 +19854,6 @@ snapshots: map-cache@0.2.2: {} - map-visit@1.0.0: - dependencies: - object-visit: 1.0.1 - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -24005,8 +19931,6 @@ snapshots: math-intrinsics@1.1.0: {} - math-random@1.0.4: {} - mcl-wasm@0.7.9: {} md5.js@1.3.5: @@ -24019,28 +19943,6 @@ snapshots: media-typer@0.3.0: {} - mem@1.1.0: - dependencies: - mimic-fn: 1.2.0 - - memdown@1.4.1: - dependencies: - abstract-leveldown: 2.7.2 - functional-red-black-tree: 1.0.1 - immediate: 3.3.0 - inherits: 2.0.4 - ltgt: 2.2.1 - safe-buffer: 5.1.2 - - memdown@3.0.0: - dependencies: - abstract-leveldown: 5.0.0 - functional-red-black-tree: 1.0.1 - immediate: 3.2.3 - inherits: 2.0.4 - ltgt: 2.2.1 - safe-buffer: 5.1.2 - memdown@5.1.0: dependencies: abstract-leveldown: 6.2.3 @@ -24058,34 +19960,10 @@ snapshots: merge-descriptors@1.0.1: {} - merge-descriptors@1.0.3: - optional: true - merge-stream@2.0.0: {} merge2@1.4.1: {} - merkle-patricia-tree@2.3.2: - dependencies: - async: 1.5.2 - ethereumjs-util: 5.2.1 - level-ws: 0.0.0 - levelup: 1.3.9 - memdown: 1.4.1 - readable-stream: 2.3.8 - rlp: 2.2.7 - semaphore: 1.1.0 - - merkle-patricia-tree@3.0.0: - dependencies: - async: 2.6.4 - ethereumjs-util: 5.2.1 - level-mem: 3.0.1 - level-ws: 1.0.0 - readable-stream: 3.6.2 - rlp: 2.2.7 - semaphore: 1.1.0 - merkle-patricia-tree@4.2.4: dependencies: '@types/levelup': 4.3.3 @@ -24146,7 +20024,7 @@ snapshots: metro-file-map@0.83.1: dependencies: - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -24242,7 +20120,7 @@ snapshots: chalk: 4.1.2 ci-info: 2.0.0 connect: 3.7.0 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -24441,7 +20319,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -24460,40 +20338,6 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@2.3.11: - dependencies: - arr-diff: 2.0.0 - array-unique: 0.2.1 - braces: 1.8.5 - expand-brackets: 0.1.5 - extglob: 0.3.2 - filename-regex: 2.0.1 - is-extglob: 1.0.0 - is-glob: 2.0.1 - kind-of: 3.2.2 - normalize-path: 2.1.1 - object.omit: 2.0.1 - parse-glob: 3.0.4 - regex-cache: 0.4.4 - - micromatch@3.1.10: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -24512,15 +20356,10 @@ snapshots: mime@1.6.0: {} - mimic-fn@1.2.0: {} - mimic-fn@2.1.0: {} mimic-function@5.0.1: {} - mimic-response@1.0.1: - optional: true - mimic-response@2.1.0: optional: true @@ -24528,10 +20367,6 @@ snapshots: mimic-response@4.0.0: {} - min-document@2.19.0: - dependencies: - dom-walk: 0.1.2 - minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -24556,8 +20391,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimist@0.0.8: {} - minimist@1.2.8: {} minipass-collect@2.0.1: @@ -24584,12 +20417,6 @@ snapshots: dependencies: minipass: 3.3.6 - minipass@2.9.0: - dependencies: - safe-buffer: 5.2.1 - yallist: 3.1.1 - optional: true - minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -24598,33 +20425,14 @@ snapshots: minipass@7.1.2: {} - minizlib@1.3.3: - dependencies: - minipass: 2.9.0 - optional: true - minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - mixin-deep@1.3.2: - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - mkdirp-classic@0.5.3: optional: true - mkdirp-promise@5.0.1: - dependencies: - mkdirp: 3.0.1 - optional: true - - mkdirp@0.5.1: - dependencies: - minimist: 0.0.8 - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -24660,31 +20468,6 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - mocha@4.1.0: - dependencies: - browser-stdout: 1.3.0 - commander: 2.11.0 - debug: 3.1.0(supports-color@4.4.0) - diff: 3.3.1 - escape-string-regexp: 1.0.5 - glob: 7.1.2 - growl: 1.10.3 - he: 1.1.1 - mkdirp: 0.5.1 - supports-color: 4.4.0 - - mock-fs@4.14.0: - optional: true - - mock-property@1.0.3: - dependencies: - define-data-property: 1.1.4 - functions-have-names: 1.2.3 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - hasown: 2.0.2 - isarray: 2.0.5 - moment-timezone@0.5.48: dependencies: moment: 2.30.1 @@ -24707,36 +20490,6 @@ snapshots: ms@2.1.3: {} - multibase@0.6.1: - dependencies: - base-x: 3.0.11 - buffer: 5.7.1 - optional: true - - multibase@0.7.0: - dependencies: - base-x: 3.0.11 - buffer: 5.7.1 - optional: true - - multicodec@0.5.7: - dependencies: - varint: 5.0.2 - optional: true - - multicodec@1.0.4: - dependencies: - buffer: 5.7.1 - varint: 5.0.2 - optional: true - - multihashes@0.4.21: - dependencies: - buffer: 5.7.1 - multibase: 0.7.0 - varint: 5.0.2 - optional: true - murmur-128@0.2.1: dependencies: encode-utf8: 1.0.3 @@ -24756,27 +20509,8 @@ snapshots: nan@2.23.0: optional: true - nano-json-stream-parser@0.1.2: - optional: true - nano-spawn@2.0.0: {} - nanomatch@1.2.13: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - nanospinner@1.2.2: dependencies: picocolors: 1.1.1 @@ -24809,12 +20543,8 @@ snapshots: neoqs@6.13.0: {} - next-tick@1.1.0: {} - ngeohash@0.6.3: {} - nice-try@1.0.5: {} - no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -24839,11 +20569,6 @@ snapshots: dependencies: lodash: 4.17.21 - node-fetch@1.7.3: - dependencies: - encoding: 0.1.13 - is-stream: 1.1.0 - node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -24906,12 +20631,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-url@4.5.1: - optional: true - - normalize-url@6.1.0: - optional: true - normalize-url@8.1.0: {} npm-package-arg@11.0.3: @@ -24934,14 +20653,6 @@ snapshots: transitivePeerDependencies: - supports-color - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - npmlog@4.1.2: dependencies: are-we-there-yet: 1.1.7 @@ -24967,31 +20678,12 @@ snapshots: object-assign@4.1.1: {} - object-copy@0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - object-inspect@1.10.3: {} - object-inspect@1.12.3: {} - object-inspect@1.13.4: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - object-keys@0.4.0: {} - object-keys@1.1.1: {} - object-visit@1.0.1: - dependencies: - isobject: 3.0.1 - object.assign@4.1.7: dependencies: call-bind: 1.0.8 @@ -25008,31 +20700,12 @@ snapshots: es-abstract: 1.24.0 es-object-atoms: 1.1.1 - object.getownpropertydescriptors@2.1.8: - dependencies: - array.prototype.reduce: 1.0.8 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - gopd: 1.2.0 - safe-array-concat: 1.1.3 - object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.0 - object.omit@2.0.1: - dependencies: - for-own: 0.1.5 - is-extendable: 0.1.1 - - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 - object.values@1.2.1: dependencies: call-bind: 1.0.8 @@ -25042,11 +20715,6 @@ snapshots: obliterator@2.0.5: {} - oboe@2.1.4: - dependencies: - http-https: 1.0.0 - optional: true - on-exit-leak-free@0.2.0: {} on-finished@2.3.0: @@ -25108,18 +20776,10 @@ snapshots: ordinal@1.0.3: {} - os-homedir@1.0.2: {} - os-locale@1.4.0: dependencies: lcid: 1.0.0 - os-locale@2.1.0: - dependencies: - execa: 0.7.0 - lcid: 1.0.0 - mem: 1.1.0 - os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -25160,12 +20820,6 @@ snapshots: transitivePeerDependencies: - zod - p-cancelable@1.1.0: - optional: true - - p-cancelable@2.1.1: - optional: true - p-cancelable@3.0.0: {} p-filter@2.1.0: @@ -25174,10 +20828,6 @@ snapshots: p-finally@1.0.0: {} - p-limit@1.3.0: - dependencies: - p-try: 1.0.0 - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -25190,10 +20840,6 @@ snapshots: dependencies: yocto-queue: 1.2.1 - p-locate@2.0.0: - dependencies: - p-limit: 1.3.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -25223,8 +20869,6 @@ snapshots: dependencies: p-finally: 1.0.0 - p-try@1.0.0: {} - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -25251,16 +20895,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse-asn1@5.1.7: - dependencies: - asn1.js: 4.10.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - hash-base: 3.0.5 - pbkdf2: 3.1.3 - safe-buffer: 5.2.1 - optional: true - parse-cache-control@1.0.1: {} parse-entities@4.0.2: @@ -25279,15 +20913,6 @@ snapshots: map-cache: 0.2.2 path-root: 0.1.1 - parse-glob@3.0.4: - dependencies: - glob-base: 0.3.0 - is-dotfile: 1.0.3 - is-extglob: 1.0.0 - is-glob: 2.0.1 - - parse-headers@2.0.6: {} - parse-json@2.2.0: dependencies: error-ex: 1.3.4 @@ -25311,42 +20936,6 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - pascalcase@0.1.1: {} - - patch-package@6.2.2: - dependencies: - '@yarnpkg/lockfile': 1.1.0 - chalk: 2.4.2 - cross-spawn: 6.0.6 - find-yarn-workspace-root: 1.2.1 - fs-extra: 7.0.1 - is-ci: 2.0.0 - klaw-sync: 6.0.0 - minimist: 1.2.8 - rimraf: 2.7.1 - semver: 5.7.2 - slash: 2.0.0 - tmp: 0.0.33 - transitivePeerDependencies: - - supports-color - - patch-package@6.5.1: - dependencies: - '@yarnpkg/lockfile': 1.1.0 - chalk: 4.1.2 - cross-spawn: 6.0.6 - find-yarn-workspace-root: 2.0.0 - fs-extra: 9.1.0 - is-ci: 2.0.0 - klaw-sync: 6.0.0 - minimist: 1.2.8 - open: 7.4.2 - rimraf: 2.7.1 - semver: 5.7.2 - slash: 2.0.0 - tmp: 0.0.33 - yaml: 1.10.2 - path-browserify@1.0.1: {} path-case@3.0.4: @@ -25358,16 +20947,12 @@ snapshots: dependencies: pinkie-promise: 2.0.1 - path-exists@3.0.0: {} - path-exists@4.0.0: {} path-exists@5.0.0: {} path-is-absolute@1.0.1: {} - path-key@2.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -25390,9 +20975,6 @@ snapshots: path-starts-with@2.0.1: {} - path-to-regexp@0.1.12: - optional: true - path-to-regexp@0.1.7: {} path-type@1.1.0: @@ -25418,8 +21000,6 @@ snapshots: sha.js: 2.4.12 to-buffer: 1.2.1 - pegjs@0.10.0: {} - performance-now@2.1.0: {} pg-cloudflare@1.2.7: @@ -25485,8 +21065,6 @@ snapshots: picomatch@4.0.3: {} - pidtree@0.5.0: {} - pidtree@0.6.0: {} pify@2.3.0: {} @@ -25527,8 +21105,6 @@ snapshots: pluralize@8.0.0: {} - posix-character-classes@0.1.1: {} - possible-typed-array-names@1.1.0: {} postgres-array@2.0.0: {} @@ -25541,8 +21117,6 @@ snapshots: dependencies: xtend: 4.0.2 - postinstall-postinstall@2.1.0: {} - prebuild-install@5.3.6: dependencies: detect-libc: 1.0.3 @@ -25579,17 +21153,10 @@ snapshots: tunnel-agent: 0.6.0 optional: true - precond@0.2.3: {} - prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} - prepend-http@2.0.0: - optional: true - - preserve@0.2.0: {} - prettier-plugin-solidity@2.1.0(prettier@3.8.1): dependencies: '@nomicfoundation/slang': 1.2.0 @@ -25607,14 +21174,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - private@0.1.8: {} - proc-log@4.2.0: {} process-nextick-args@2.0.1: {} - process@0.11.10: {} - prom-client@14.0.1: dependencies: tdigest: 0.1.2 @@ -25630,11 +21193,6 @@ snapshots: promise-throttle@1.1.2: {} - promise-to-callback@1.0.0: - dependencies: - is-fn: 1.0.0 - set-immediate-shim: 1.0.1 - promise@7.3.1: dependencies: asap: 2.0.6 @@ -25669,49 +21227,10 @@ snapshots: prr@1.0.1: {} - pseudomap@1.0.2: {} - psl@1.15.0: dependencies: punycode: 2.3.1 - public-encrypt@4.0.3: - dependencies: - bn.js: 4.12.2 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - parse-asn1: 5.1.7 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - optional: true - - pull-cat@1.1.11: {} - - pull-defer@0.2.3: {} - - pull-level@2.0.4: - dependencies: - level-post: 1.0.7 - pull-cat: 1.1.11 - pull-live: 1.0.1 - pull-pushable: 2.2.0 - pull-stream: 3.7.0 - pull-window: 2.1.4 - stream-to-pull-stream: 1.7.3 - - pull-live@1.0.1: - dependencies: - pull-cat: 1.1.11 - pull-stream: 3.7.0 - - pull-pushable@2.2.0: {} - - pull-stream@3.7.0: {} - - pull-window@2.1.4: - dependencies: - looper: 2.0.0 - pump@3.0.3: dependencies: end-of-stream: 1.4.5 @@ -25741,11 +21260,6 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - optional: true - qs@6.14.0: dependencies: side-channel: 1.1.0 @@ -25758,13 +21272,6 @@ snapshots: quansync@0.2.11: {} - query-string@5.1.1: - dependencies: - decode-uri-component: 0.2.2 - object-assign: 4.1.1 - strict-uri-encode: 1.1.0 - optional: true - queue-microtask@1.2.3: {} queue@6.0.2: @@ -25775,22 +21282,10 @@ snapshots: quick-lru@5.1.1: {} - randomatic@3.1.1: - dependencies: - is-number: 4.0.0 - kind-of: 6.0.3 - math-random: 1.0.4 - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - randomfill@1.0.4: - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - optional: true - range-parser@1.2.1: {} raw-body@2.4.2: @@ -25913,20 +21408,6 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readable-stream@1.0.34: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - - readable-stream@1.1.14: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -25943,14 +21424,6 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readdirp@2.2.1: - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10 - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -25980,27 +21453,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerate@1.4.2: {} - - regenerator-runtime@0.11.1: {} - regenerator-runtime@0.13.11: {} - regenerator-transform@0.10.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - private: 0.1.8 - - regex-cache@0.4.4: - dependencies: - is-equal-shallow: 0.1.3 - - regex-not@1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -26010,12 +21464,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regexpu-core@2.0.0: - dependencies: - regenerate: 1.4.2 - regjsgen: 0.2.0 - regjsparser: 0.1.5 - registry-auth-token@5.1.0: dependencies: '@pnpm/npm-conf': 2.3.1 @@ -26024,12 +21472,6 @@ snapshots: dependencies: rc: 1.2.8 - regjsgen@0.2.0: {} - - regjsparser@0.1.5: - dependencies: - jsesc: 0.5.0 - relay-runtime@12.0.0(encoding@0.1.13): dependencies: '@babel/runtime': 7.28.4 @@ -26040,14 +21482,6 @@ snapshots: remove-trailing-separator@1.1.0: {} - repeat-element@1.1.4: {} - - repeat-string@1.6.1: {} - - repeating@2.0.1: - dependencies: - is-finite: 1.1.0 - req-cwd@2.0.0: dependencies: req-from: 2.0.0 @@ -26099,8 +21533,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve-url@0.2.1: {} - resolve.exports@2.0.3: {} resolve@1.1.7: {} @@ -26115,16 +21547,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - responselike@1.0.2: - dependencies: - lowercase-keys: 1.0.1 - optional: true - - responselike@2.0.1: - dependencies: - lowercase-keys: 2.0.0 - optional: true - responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 @@ -26139,8 +21561,6 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - ret@0.1.15: {} - retry-as-promised@5.0.0: {} retry-as-promised@7.1.1: {} @@ -26183,7 +21603,7 @@ snapshots: dependencies: bn.js: 5.2.2 - rocketh@0.17.13(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + rocketh@0.17.13(patch_hash=9922612567456c164edd9dd5a0c9304bfd66babcebfe7c39dca333659ff1248f)(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@rocketh/core': 0.17.8(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) @@ -26234,10 +21654,6 @@ snapshots: safe-buffer@5.2.1: {} - safe-event-emitter@1.0.1: - dependencies: - events: 3.3.0 - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -26249,10 +21665,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-regex@1.1.0: - dependencies: - ret: 0.1.15 - safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} @@ -26278,11 +21690,6 @@ snapshots: scrypt-js@3.0.1: {} - scryptsy@1.2.1: - dependencies: - pbkdf2: 3.1.3 - optional: true - secp256k1@4.0.4: dependencies: elliptic: 6.6.1 @@ -26291,16 +21698,10 @@ snapshots: secure-keys@1.0.0: {} - seedrandom@3.0.1: {} - seedrandom@3.0.5: {} semaphore-async-await@1.5.1: {} - semaphore@1.1.0: {} - - semver@5.4.1: {} - semver@5.7.2: {} semver@6.3.1: {} @@ -26375,7 +21776,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 '@types/validator': 13.15.3 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) dottie: 2.0.6 inflection: 1.13.4 lodash: 4.17.21 @@ -26399,7 +21800,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 '@types/validator': 13.15.3 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) dottie: 2.0.6 inflection: 1.13.4 lodash: 4.17.21 @@ -26452,17 +21853,6 @@ snapshots: transitivePeerDependencies: - supports-color - servify@0.1.12: - dependencies: - body-parser: 1.20.3 - cors: 2.8.5 - express: 4.21.2 - request: 2.88.2 - xhr: 2.6.0 - transitivePeerDependencies: - - supports-color - optional: true - set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -26481,21 +21871,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - set-immediate-shim@1.0.1: {} - set-proto@1.0.0: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - setimmediate@1.0.5: {} setprototypeof@1.2.0: {} @@ -26513,16 +21894,10 @@ snapshots: shallowequal@1.1.0: {} - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} shell-quote@1.8.3: {} @@ -26570,13 +21945,6 @@ snapshots: simple-concat@1.0.1: optional: true - simple-get@2.8.2: - dependencies: - decompress-response: 3.3.0 - once: 1.4.0 - simple-concat: 1.0.1 - optional: true - simple-get@3.1.1: dependencies: decompress-response: 4.2.1 @@ -26592,31 +21960,16 @@ snapshots: sisteransi@1.0.5: {} - slash@1.0.0: {} - - slash@2.0.0: {} - slash@3.0.0: {} slash@5.1.0: {} - slice-ansi@3.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 4.0.0 - slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -26633,33 +21986,10 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - snapdragon-node@2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - snapdragon-util@3.0.1: - dependencies: - kind-of: 3.2.2 - - snapdragon@0.8.2: - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -26669,10 +21999,6 @@ snapshots: ip-address: 10.0.1 smart-buffer: 4.2.0 - sol-digger@0.0.2: {} - - sol-explore@1.6.1: {} - solc@0.4.26: dependencies: fs-extra: 0.30.0 @@ -26681,17 +22007,6 @@ snapshots: semver: 5.7.2 yargs: 4.8.1 - solc@0.6.12: - dependencies: - command-exists: 1.2.9 - commander: 3.0.2 - fs-extra: 0.30.0 - js-sha3: 0.8.0 - memorystream: 0.3.1 - require-from-string: 2.0.2 - semver: 5.7.2 - tmp: 0.0.33 - solc@0.8.15: dependencies: command-exists: 1.2.9 @@ -26838,62 +22153,15 @@ snapshots: hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) solidity-ast: 0.4.61 - solium-plugin-security@0.1.1(solium@1.2.5): - dependencies: - solium: 1.2.5 - - solium@1.2.5: - dependencies: - ajv: 5.5.2 - chokidar: 1.7.0 - colors: 1.4.0 - commander: 2.20.3 - diff: 3.5.0 - eol: 0.9.1 - js-string-escape: 1.0.1 - lodash: 4.17.21 - sol-digger: 0.0.2 - sol-explore: 1.6.1 - solium-plugin-security: 0.1.1(solium@1.2.5) - solparse: 2.2.8 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - solparse@2.2.8: - dependencies: - mocha: 4.1.0 - pegjs: 0.10.0 - yargs: 10.1.2 - sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 - source-map-resolve@0.5.3: - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - - source-map-support@0.4.18: - dependencies: - source-map: 0.5.7 - - source-map-support@0.5.12: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - source-map-url@0.4.1: {} - source-map@0.2.0: dependencies: amdefine: 1.0.1 @@ -26922,10 +22190,6 @@ snapshots: spdx-license-ids@3.0.22: {} - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - split2@3.2.2: dependencies: readable-stream: 3.6.2 @@ -26966,11 +22230,6 @@ snapshots: dependencies: type-fest: 0.7.1 - static-extend@0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - statuses@1.5.0: {} statuses@2.0.1: {} @@ -26982,16 +22241,8 @@ snapshots: stream-shift@1.0.3: {} - stream-to-pull-stream@1.7.3: - dependencies: - looper: 3.0.0 - pull-stream: 3.7.0 - streamsearch@1.1.0: {} - strict-uri-encode@1.1.0: - optional: true - string-argv@0.3.2: {} string-format@2.0.0: {} @@ -27053,8 +22304,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@0.10.31: {} - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -27089,10 +22338,6 @@ snapshots: strip-bom@3.0.0: {} - strip-eof@1.0.0: {} - - strip-final-newline@2.0.0: {} - strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 @@ -27103,17 +22348,11 @@ snapshots: strnum@2.1.1: {} - supports-color@2.0.0: {} - supports-color@3.2.3: dependencies: has-flag: 1.0.0 - supports-color@4.4.0: - dependencies: - has-flag: 2.0.0 - - supports-color@5.5.0: + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -27125,33 +22364,12 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} - supports-preserve-symlinks-flag@1.0.0: {} swap-case@2.0.2: dependencies: tslib: 2.8.1 - swarm-js@0.1.42(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - bluebird: 3.7.2 - buffer: 5.7.1 - eth-lib: 0.1.29(bufferutil@4.0.9)(utf-8-validate@5.0.10) - fs-extra: 4.0.3 - got: 11.8.6 - mime-types: 2.1.35 - mkdirp-promise: 5.0.1 - mock-fs: 4.14.0 - setimmediate: 1.0.5 - tar: 4.4.19 - xhr-request: 1.1.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - sync-request@6.1.0: dependencies: http-response-object: 3.0.2 @@ -27177,25 +22395,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tape@4.17.0: - dependencies: - '@ljharb/resumer': 0.0.1 - '@ljharb/through': 2.3.14 - call-bind: 1.0.8 - deep-equal: 1.1.2 - defined: 1.0.1 - dotignore: 0.1.2 - for-each: 0.3.5 - glob: 7.2.3 - has: 1.0.4 - inherits: 2.0.4 - is-regex: 1.1.4 - minimist: 1.2.8 - mock-property: 1.0.3 - object-inspect: 1.12.3 - resolve: 1.22.10 - string.prototype.trim: 1.2.10 - tar-fs@2.1.3: dependencies: chownr: 1.1.4 @@ -27213,17 +22412,6 @@ snapshots: readable-stream: 3.6.2 optional: true - tar@4.4.19: - dependencies: - chownr: 1.1.4 - fs-minipass: 1.2.7 - minipass: 2.9.0 - minizlib: 1.3.3 - mkdirp: 0.5.6 - safe-buffer: 5.2.1 - yallist: 3.1.1 - optional: true - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -27252,11 +22440,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - test-value@2.1.0: - dependencies: - array-back: 1.0.4 - typical: 2.6.1 - testrpc@0.0.1: {} text-extensions@2.4.0: {} @@ -27285,11 +22468,6 @@ snapshots: throat@5.0.0: {} - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - through2@3.0.2: dependencies: inherits: 2.0.4 @@ -27301,9 +22479,6 @@ snapshots: through@2.3.8: {} - timed-out@4.0.1: - optional: true - tiny-lru@8.0.2: {} tinyexec@1.0.1: {} @@ -27321,10 +22496,6 @@ snapshots: dependencies: os-tmpdir: 1.0.2 - tmp@0.1.0: - dependencies: - rimraf: 2.7.1 - tmpl@1.0.5: {} to-buffer@1.2.1: @@ -27333,31 +22504,10 @@ snapshots: safe-buffer: 5.2.1 typed-array-buffer: 1.0.3 - to-fast-properties@1.0.3: {} - - to-object-path@0.3.0: - dependencies: - kind-of: 3.2.2 - - to-readable-stream@1.0.0: - optional: true - - to-regex-range@2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - to-regex@3.0.2: - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - toidentifier@1.0.1: {} toposort-class@1.0.1: {} @@ -27369,20 +22519,8 @@ snapshots: tr46@0.0.3: {} - trim-right@1.0.1: {} - triple-beam@1.4.1: {} - truffle-flattener@1.6.0: - dependencies: - '@resolver-engine/imports-fs': 0.2.2 - '@solidity-parser/parser': 0.14.5 - find-up: 2.1.0 - mkdirp: 1.0.4 - tsort: 0.0.1 - transitivePeerDependencies: - - supports-color - ts-algebra@1.2.2: {} ts-api-utils@2.4.0(typescript@5.9.3): @@ -27396,28 +22534,10 @@ snapshots: command-line-usage: 6.1.3 string-format: 2.0.0 - ts-essentials@1.0.4: {} - - ts-essentials@6.0.7(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - ts-essentials@7.0.3(typescript@5.9.3): dependencies: typescript: 5.9.3 - ts-generator@0.1.1: - dependencies: - '@types/mkdirp': 0.5.2 - '@types/prettier': 2.7.3 - '@types/resolve': 0.0.8 - chalk: 2.4.2 - glob: 7.2.3 - mkdirp: 0.5.6 - prettier: 2.8.8 - resolve: 1.22.10 - ts-essentials: 1.0.4 - ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -27483,12 +22603,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 - tweetnacl-util@0.15.1: {} - tweetnacl@0.14.5: {} - tweetnacl@1.0.3: {} - type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -27512,25 +22628,10 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - type@2.7.3: {} - - typechain@3.0.0(typescript@5.9.3): - dependencies: - command-line-args: 4.0.7 - debug: 4.4.3(supports-color@9.4.0) - fs-extra: 7.0.1 - js-sha3: 0.8.0 - lodash: 4.17.21 - ts-essentials: 6.0.7(typescript@5.9.3) - ts-generator: 0.1.1 - transitivePeerDependencies: - - supports-color - - typescript - typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.3(supports-color@9.4.0) + debug: 4.4.3(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -27576,10 +22677,6 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - typedarray@0.0.6: {} typescript-eslint@8.53.1(eslint@9.39.2(jiti@2.5.1))(typescript@5.9.3): @@ -27595,16 +22692,6 @@ snapshots: typescript@5.9.3: {} - typewise-core@1.2.0: {} - - typewise@1.0.3: - dependencies: - typewise-core: 1.2.0 - - typewiselite@1.0.0: {} - - typical@2.6.1: {} - typical@4.0.0: {} typical@5.2.0: {} @@ -27618,9 +22705,6 @@ snapshots: uglify-js@3.19.3: optional: true - ultron@1.1.1: - optional: true - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -27632,9 +22716,6 @@ snapshots: underscore@1.13.7: {} - underscore@1.9.1: - optional: true - undici-types@6.21.0: {} undici@5.29.0: @@ -27647,13 +22728,6 @@ snapshots: unicorn-magic@0.1.0: {} - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -27670,15 +22744,8 @@ snapshots: dependencies: normalize-path: 2.1.1 - unorm@1.6.0: {} - unpipe@1.0.0: {} - unset-value@1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - update-browserslist-db@1.1.3(browserslist@4.26.0): dependencies: browserslist: 4.26.0 @@ -27697,16 +22764,6 @@ snapshots: dependencies: punycode: 2.3.1 - urix@0.1.0: {} - - url-parse-lax@3.0.0: - dependencies: - prepend-http: 2.0.0 - optional: true - - url-set-query@1.0.0: - optional: true - url@0.11.4: dependencies: punycode: 1.4.1 @@ -27722,11 +22779,10 @@ snapshots: node-gyp-build: 4.8.4 optional: true - use@3.1.1: {} - utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.4 + optional: true utf-8-validate@5.0.7: dependencies: @@ -27737,26 +22793,8 @@ snapshots: util-deprecate@1.0.2: {} - util.promisify@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - for-each: 0.3.5 - get-intrinsic: 1.3.0 - has-proto: 1.2.0 - has-symbols: 1.1.0 - object.getownpropertydescriptors: 2.1.8 - safe-array-concat: 1.1.3 - utils-merge@1.0.1: {} - uuid@3.3.2: - optional: true - uuid@3.4.0: {} uuid@8.3.2: {} @@ -27776,9 +22814,6 @@ snapshots: value-or-promise@1.0.12: {} - varint@5.0.2: - optional: true - vary@1.1.2: {} verror@1.10.0: @@ -27829,232 +22864,6 @@ snapshots: web-streams-polyfill@3.3.3: {} - web3-bzz@1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@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 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - - web3-core-helpers@1.2.11: - dependencies: - underscore: 1.9.1 - web3-eth-iban: 1.2.11 - web3-utils: 1.2.11 - optional: true - - web3-core-method@1.2.11: - dependencies: - '@ethersproject/transactions': 5.8.0 - underscore: 1.9.1 - web3-core-helpers: 1.2.11 - web3-core-promievent: 1.2.11 - web3-core-subscriptions: 1.2.11 - web3-utils: 1.2.11 - optional: true - - web3-core-promievent@1.2.11: - dependencies: - eventemitter3: 4.0.4 - optional: true - - web3-core-requestmanager@1.2.11: - dependencies: - underscore: 1.9.1 - web3-core-helpers: 1.2.11 - web3-providers-http: 1.2.11 - web3-providers-ipc: 1.2.11 - web3-providers-ws: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - web3-core-subscriptions@1.2.11: - dependencies: - eventemitter3: 4.0.4 - underscore: 1.9.1 - web3-core-helpers: 1.2.11 - optional: true - - web3-core@1.2.11: - dependencies: - '@types/bn.js': 4.11.6 - '@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 - web3-utils: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - web3-eth-abi@1.2.11: - dependencies: - '@ethersproject/abi': 5.0.0-beta.153 - underscore: 1.9.1 - web3-utils: 1.2.11 - optional: true - - web3-eth-accounts@1.2.11: - dependencies: - crypto-browserify: 3.12.0 - eth-lib: 0.2.8 - ethereumjs-common: 1.5.0 - ethereumjs-tx: 2.1.2 - scrypt-js: 3.0.1 - underscore: 1.9.1 - uuid: 3.3.2 - web3-core: 1.2.11 - web3-core-helpers: 1.2.11 - web3-core-method: 1.2.11 - web3-utils: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - web3-eth-contract@1.2.11: - dependencies: - '@types/bn.js': 4.11.6 - underscore: 1.9.1 - web3-core: 1.2.11 - web3-core-helpers: 1.2.11 - web3-core-method: 1.2.11 - web3-core-promievent: 1.2.11 - web3-core-subscriptions: 1.2.11 - web3-eth-abi: 1.2.11 - web3-utils: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - web3-eth-ens@1.2.11: - dependencies: - content-hash: 2.5.2 - eth-ens-namehash: 2.0.8 - underscore: 1.9.1 - web3-core: 1.2.11 - web3-core-helpers: 1.2.11 - web3-core-promievent: 1.2.11 - web3-eth-abi: 1.2.11 - web3-eth-contract: 1.2.11 - web3-utils: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - web3-eth-iban@1.2.11: - dependencies: - bn.js: 4.12.2 - web3-utils: 1.2.11 - optional: true - - web3-eth-personal@1.2.11: - dependencies: - '@types/node': 20.19.14 - web3-core: 1.2.11 - web3-core-helpers: 1.2.11 - web3-core-method: 1.2.11 - web3-net: 1.2.11 - web3-utils: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - web3-eth@1.2.11: - dependencies: - underscore: 1.9.1 - web3-core: 1.2.11 - web3-core-helpers: 1.2.11 - web3-core-method: 1.2.11 - web3-core-subscriptions: 1.2.11 - web3-eth-abi: 1.2.11 - web3-eth-accounts: 1.2.11 - web3-eth-contract: 1.2.11 - web3-eth-ens: 1.2.11 - web3-eth-iban: 1.2.11 - web3-eth-personal: 1.2.11 - web3-net: 1.2.11 - web3-utils: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - web3-net@1.2.11: - dependencies: - web3-core: 1.2.11 - web3-core-method: 1.2.11 - web3-utils: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - - 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 - backoff: 2.5.0 - clone: 2.1.2 - cross-fetch: 2.2.6(encoding@0.1.13) - eth-block-tracker: 3.0.1 - eth-json-rpc-infura: 3.2.1(encoding@0.1.13) - eth-sig-util: 1.4.2 - ethereumjs-block: 1.7.1 - ethereumjs-tx: 1.3.7 - ethereumjs-util: 5.2.1 - ethereumjs-vm: 2.6.0 - json-rpc-error: 2.0.0 - json-stable-stringify: 1.3.0 - promise-to-callback: 1.0.0 - readable-stream: 2.3.8 - request: 2.88.2 - semaphore: 1.1.0 - ws: 5.2.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - xhr: 2.6.0 - xtend: 4.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - web3-providers-http@1.2.11: - dependencies: - web3-core-helpers: 1.2.11 - xhr2-cookies: 1.1.0 - optional: true - - web3-providers-ipc@1.2.11: - dependencies: - oboe: 2.1.4 - underscore: 1.9.1 - web3-core-helpers: 1.2.11 - optional: true - - web3-providers-ws@1.2.11: - dependencies: - eventemitter3: 4.0.4 - underscore: 1.9.1 - web3-core-helpers: 1.2.11 - websocket: 1.0.32 - transitivePeerDependencies: - - supports-color - optional: true - - web3-shh@1.2.11: - dependencies: - web3-core: 1.2.11 - web3-core-method: 1.2.11 - web3-core-subscriptions: 1.2.11 - web3-net: 1.2.11 - transitivePeerDependencies: - - supports-color - optional: true - web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 @@ -28066,33 +22875,6 @@ snapshots: randombytes: 2.1.0 utf8: 3.0.0 - web3-utils@1.2.11: - dependencies: - bn.js: 4.12.2 - eth-lib: 0.2.8 - ethereum-bloom-filters: 1.2.0 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: 2.1.0 - underscore: 1.9.1 - utf8: 3.0.0 - optional: true - - 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) - web3-core: 1.2.11 - web3-eth: 1.2.11 - web3-eth-personal: 1.2.11 - web3-net: 1.2.11 - web3-shh: 1.2.11 - web3-utils: 1.2.11 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - webcrypto-core@1.8.1: dependencies: '@peculiar/asn1-schema': 2.5.0 @@ -28103,19 +22885,6 @@ snapshots: webidl-conversions@3.0.1: {} - websocket@1.0.32: - dependencies: - bufferutil: 4.0.9 - debug: 2.6.9 - es5-ext: 0.10.64 - typedarray-to-buffer: 3.1.5 - utf-8-validate: 5.0.10 - yaeti: 0.0.6 - transitivePeerDependencies: - - supports-color - - whatwg-fetch@2.0.4: {} - whatwg-fetch@3.6.20: {} whatwg-url@5.0.0: @@ -28265,23 +23034,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@3.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - async-limiter: 1.0.1 - safe-buffer: 5.1.2 - ultron: 1.1.1 - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - optional: true - - ws@5.2.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - async-limiter: 1.0.1 - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - ws@6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 @@ -28319,38 +23071,6 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - xhr-request-promise@0.1.3: - dependencies: - xhr-request: 1.1.0 - optional: true - - xhr-request@1.1.0: - dependencies: - buffer-to-arraybuffer: 0.0.5 - object-assign: 4.1.1 - query-string: 5.1.1 - simple-get: 2.8.2 - timed-out: 4.0.1 - url-set-query: 1.0.0 - xhr: 2.6.0 - optional: true - - xhr2-cookies@1.1.0: - dependencies: - cookiejar: 2.1.4 - optional: true - - xhr@2.6.0: - dependencies: - global: 4.4.0 - is-function: 1.0.2 - parse-headers: 2.0.6 - xtend: 4.0.2 - - xtend@2.1.2: - dependencies: - object-keys: 0.4.0 - xtend@4.0.2: {} y18n@3.2.2: {} @@ -28359,10 +23079,6 @@ snapshots: y18n@5.0.8: {} - yaeti@0.0.6: {} - - yallist@2.1.2: {} - yallist@3.1.1: {} yallist@4.0.0: {} @@ -28392,10 +23108,6 @@ snapshots: yargs-parser@21.1.1: {} - yargs-parser@8.1.0: - dependencies: - camelcase: 4.1.0 - yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 @@ -28403,21 +23115,6 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 - yargs@10.1.2: - dependencies: - cliui: 4.1.0 - decamelize: 1.2.0 - find-up: 2.1.0 - get-caller-file: 1.0.3 - os-locale: 2.1.0 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 2.1.1 - which-module: 2.0.1 - y18n: 3.2.2 - yargs-parser: 8.1.0 - yargs@15.4.1: dependencies: cliui: 6.0.0 From 16195999dc21a7428365904b2160ac19e574b24b Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Fri, 10 Apr 2026 11:59:56 +0000 Subject: [PATCH 12/29] docs: REO testing plans and rewards behaviour documentation --- docs/RewardsBehaviourChanges.md | 175 +++ .../docs/testing/reo/BaselineTestPlan.md | 811 ++++++++++++ .../docs/testing/reo/IndexerTestGuide.md | 542 ++++++++ .../docs/testing/reo/MainnetDetails.md | 38 + packages/issuance/docs/testing/reo/README.md | 156 +++ .../issuance/docs/testing/reo/ReoTestPlan.md | 1103 +++++++++++++++++ .../testing/reo/RewardsConditionsTestPlan.md | 781 ++++++++++++ .../testing/reo/SubgraphDenialTestPlan.md | 680 ++++++++++ .../docs/testing/reo/TestnetDetails.md | 65 + .../reo/support/IssuanceAllocatorTestPlan.md | 98 ++ .../docs/testing/reo/support/NotionSetup.md | 70 ++ .../testing/reo/support/NotionTracker.csv | 77 ++ .../testing/reo/support/indexer-status.sh | 75 ++ 13 files changed, 4671 insertions(+) create mode 100644 docs/RewardsBehaviourChanges.md create mode 100644 packages/issuance/docs/testing/reo/BaselineTestPlan.md create mode 100644 packages/issuance/docs/testing/reo/IndexerTestGuide.md create mode 100644 packages/issuance/docs/testing/reo/MainnetDetails.md create mode 100644 packages/issuance/docs/testing/reo/README.md create mode 100644 packages/issuance/docs/testing/reo/ReoTestPlan.md create mode 100644 packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md create mode 100644 packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md create mode 100644 packages/issuance/docs/testing/reo/TestnetDetails.md create mode 100644 packages/issuance/docs/testing/reo/support/IssuanceAllocatorTestPlan.md create mode 100644 packages/issuance/docs/testing/reo/support/NotionSetup.md create mode 100644 packages/issuance/docs/testing/reo/support/NotionTracker.csv create mode 100755 packages/issuance/docs/testing/reo/support/indexer-status.sh diff --git a/docs/RewardsBehaviourChanges.md b/docs/RewardsBehaviourChanges.md new file mode 100644 index 000000000..63c17c4c2 --- /dev/null +++ b/docs/RewardsBehaviourChanges.md @@ -0,0 +1,175 @@ +# Rewards Behaviour Changes + +Functional summary of how reward behaviour changed between the Horizon mainnet baseline and the current issuance upgrade. + +## Activation Overview + +Changes fall into two categories: + +- **Automatic on upgrade:** New logic that activates immediately when the upgraded contracts are deployed behind their proxies. No governance action required. These include: zero-signal detection, zero-allocated-tokens reclaim, POI presentation paths (claim/reclaim/defer), allocation resize staleness check, allocation close reclaim, and the `POIPresented` event. + +- **Governance-gated:** Features that require explicit governance transactions after upgrade. Until configured, the system preserves legacy behaviour (rewards are dropped, not reclaimed). These include: setting the issuance allocator, configuring reclaim addresses (per-condition and default), setting the eligibility oracle, and changing the minimum subgraph signal threshold. + +This two-phase approach allows a safe upgrade with the new infrastructure in place, while governance coordinates separate activation steps for each optional feature. + +## Issuance Rate + +**Before:** A single `issuancePerBlock` storage variable, set by governance via `setIssuancePerBlock()`, determined all reward issuance. + +**After:** An optional `issuanceAllocator` contract can be set by governance. When set, the effective issuance rate comes from the allocator (which can distribute issuance across multiple targets). When unset, the legacy `issuancePerBlock` value is used as a fallback. The allocator calls `beforeIssuanceAllocationChange()` on the RewardsManager before changing rates, ensuring accumulators are snapshotted first. + +**Activates:** Governance-gated — requires `setIssuanceAllocator()`. Until called, the legacy `issuancePerBlock` value continues to apply. + +## Reward Conditions + +A new `RewardsCondition` library defines typed `bytes32` identifiers for every situation where rewards cannot be distributed normally: + +| Condition | Trigger | +| ---------------------- | ---------------------------------------------------- | +| `NO_SIGNAL` | Zero total curation signal globally | +| `SUBGRAPH_DENIED` | Subgraph is on the denylist | +| `BELOW_MINIMUM_SIGNAL` | Subgraph signal below `minimumSubgraphSignal` | +| `NO_ALLOCATED_TOKENS` | Subgraph has signal but zero allocated tokens | +| `INDEXER_INELIGIBLE` | Indexer fails eligibility oracle check at claim time | +| `STALE_POI` | POI presented after staleness deadline | +| `ZERO_POI` | POI is `bytes32(0)` | +| `ALLOCATION_TOO_YOUNG` | Allocation created in the current epoch | +| `CLOSE_ALLOCATION` | Allocation being closed with uncollected rewards | + +**Activates:** Automatic on upgrade — the library and all condition checks are available immediately once the upgraded contracts are deployed. + +## Reclaim System + +**Before:** When rewards could not be distributed (denied subgraph, below-signal subgraph, stale POI, etc.), the tokens were silently lost -- never minted to anyone. + +**After:** Undistributable rewards are _reclaimed_ by minting them to a configurable address. Governance can set a per-condition address via `setReclaimAddress(condition, address)` and a catch-all fallback via `setDefaultReclaimAddress(address)`. If neither is configured for a given condition, rewards are still not minted (preserving the old drop behaviour). Every reclaim emits a `RewardsReclaimed` event with the condition, amount, indexer, allocation, and subgraph. + +**Activates:** Governance-gated — requires `setReclaimAddress()` and/or `setDefaultReclaimAddress()` for each condition. Until configured, rewards are dropped (preserving legacy behaviour). + +## Zero Global Signal + +**Before:** Issuance during periods with zero total curation signal was silently lost. + +**After:** Detected in `updateAccRewardsPerSignal()` and reclaimed as `NO_SIGNAL`. + +**Activates:** Automatic on upgrade — detection is built into the accumulator update. Reclaim requires a configured address for `NO_SIGNAL`. + +## Subgraph-Level Denial + +**Before:** Denial was a binary gate checked only at `takeRewards()` time. When a subgraph was denied, `takeRewards()` returned 0 and emitted `RewardsDenied`. The calling AllocationManager still advanced the allocation's reward snapshot, permanently dropping those rewards. + +**After:** Denial is handled at two levels: + +- **RewardsManager (accumulator level):** When `onSubgraphSignalUpdate` or `onSubgraphAllocationUpdate` is called for a denied subgraph, `accRewardsForSubgraph` and `accRewardsPerAllocatedToken` freeze (stop increasing). New rewards accruing during the denial period are reclaimed immediately rather than accumulated. `setDenied()` now snapshots accumulators before changing denial state so the boundary is clean. + +- **AllocationManager (claim level):** POI presentation for a denied subgraph is _deferred_ -- returns 0 **without advancing the allocation's snapshot**. This preserves uncollected pre-denial rewards. When the subgraph is later un-denied, those preserved rewards become claimable again. + +**Activates:** Automatic on upgrade — the accumulator-level freeze and claim-level deferral apply immediately. Denial state itself is set via `setDenied()` (Governor or SubgraphAvailabilityOracle). + +## Below-Minimum Signal + +**Before:** `getAccRewardsForSubgraph()` silently excluded rewards for subgraphs below `minimumSubgraphSignal`. Those rewards were lost. + +**After:** The same exclusion occurs, but excluded rewards are reclaimed to the `BELOW_MINIMUM_SIGNAL` address instead of being lost. Changes to `minimumSubgraphSignal` apply retroactively to all pending rewards at the next accumulator update, so governance should call `onSubgraphSignalUpdate()` on affected subgraphs before changing the threshold. + +**Activates:** Automatic on upgrade for the reclaim path. Threshold changes via `setMinimumSubgraphSignal()` are retroactive — governance should call `onSubgraphSignalUpdate()` on affected subgraphs before changing the threshold. + +## Zero Allocated Tokens + +**Before:** When a subgraph had signal but no allocations, `getAccRewardsPerAllocatedToken()` returned 0 for per-token rewards. The subgraph-level accumulator still grew, but the rewards were stranded -- distributable to no one. + +**After:** Detected as `NO_ALLOCATED_TOKENS` and reclaimed. When allocations resume, `accRewardsPerAllocatedToken` resumes from its stored value rather than resetting to zero. + +**Activates:** Automatic on upgrade — detection is built into the accumulator update. + +## Indexer Eligibility + +**Before:** No per-indexer eligibility checks existed. + +**After:** An optional `rewardsEligibilityOracle` can be set by governance. When set, `takeRewards()` checks `isEligible(indexer)` at claim time. If the indexer is ineligible, rewards are denied (emitting `RewardsDeniedDueToEligibility`) and reclaimed to the `INDEXER_INELIGIBLE` address. Subgraph denial takes precedence: if a subgraph is denied, eligibility is not checked. + +**Activates:** Governance-gated — requires `setRewardsEligibilityOracle()`. Until called, no eligibility checks are performed. + +## POI Presentation (AllocationManager) + +**Before:** A single conditional expression decided whether `takeRewards()` was called. If any condition failed (stale, zero POI, too young, altruistic), rewards were set to 0. The allocation's reward snapshot always advanced and pending rewards were always cleared, permanently dropping any undistributable rewards. + +**After:** Three distinct paths based on the determined condition: + +1. **Claim** (`NONE`): `takeRewards()` mints tokens, distributed to indexer and delegators. Snapshot advances. +2. **Reclaim** (`STALE_POI`, `ZERO_POI`): `reclaimRewards()` mints tokens to the reclaim address. Snapshot advances and pending rewards are cleared. +3. **Defer** (`ALLOCATION_TOO_YOUNG`, `SUBGRAPH_DENIED`): Returns 0 **without advancing the snapshot or clearing pending rewards**. Rewards are preserved for later collection. Accumulators are still updated via `onSubgraphAllocationUpdate()` to keep reclaim tracking current. + +The POI presentation timestamp is now recorded immediately on entry (before condition evaluation), so the staleness clock resets regardless of reward outcome. Over-delegation force-close is skipped on the deferred path to avoid closing allocations with preserved uncollected rewards. + +**Activates:** Automatic on upgrade — the three-path logic applies to all POI presentations immediately. + +## Allocation Resize + +**Before:** Resizing always accumulated pending rewards for the delta period, regardless of allocation staleness. + +**After:** If the allocation is stale at resize time, pending rewards are reclaimed as `STALE_POI` and cleared. This prevents stale allocations from silently accumulating pending rewards through repeated resizes. + +**Activates:** Automatic on upgrade — applies to all resize operations immediately. + +## Allocation Close + +**Before:** Closing an allocation advanced the snapshot and closed it. Any uncollected rewards were permanently lost. + +**After:** Before closing, `reclaimRewards(CLOSE_ALLOCATION, allocationId)` is called to mint uncollected rewards to the reclaim address. + +**Activates:** Automatic on upgrade — applies to all close operations immediately. + +## Observability + +A new `POIPresented` event is emitted on every POI presentation, including the determined `condition` as a `bytes32` field. This provides off-chain visibility into why a given presentation did or did not result in rewards, which was previously invisible. + +**Activates:** Automatic on upgrade — emitted on every POI presentation immediately. + +## View Functions + +Several view functions were added or changed to expose the new reward state. + +### Accumulator Views Freeze for Non-Claimable Subgraphs + +The existing accumulator view functions now exclude rewards for subgraphs that are not claimable (denied, below minimum signal, or with zero allocated tokens). Previously these accumulators always grew; callers reading them as continuously-increasing counters need to account for the new freeze behaviour. + +**`getAccRewardsForSubgraph()`** — Previously always returned a growing value regardless of subgraph state. Now returns a frozen value when the subgraph is not claimable: the internal helper `_getSubgraphRewardsState()` determines a `RewardsCondition`, and when the condition is anything other than `NONE`, new rewards are excluded from the returned total. The accumulator resumes growing when the subgraph becomes claimable again. + +**`getAccRewardsPerAllocatedToken()`** — Derives from `getAccRewardsForSubgraph()`, so it inherits the freeze. When the subgraph is not claimable, new per-token rewards are zero because the subgraph-level delta is zero. At snapshot points the implementation zeroes `undistributedRewards` and reclaims them instead of adding them to `accRewardsPerAllocatedToken`. + +**`getRewards()`** — Returns the claimable reward estimate for an allocation. Because it reads `getAccRewardsPerAllocatedToken()`, it now returns a frozen value for allocations on non-claimable subgraphs. Pre-existing `accRewardsPending` from prior resizes is still included. Note: indexer eligibility is _not_ checked here (only at `takeRewards()` time), so the view does not reflect eligibility-based denial. + +**`getNewRewardsPerSignal()`** — No visible change in return value. Internally it now separates claimable from unclaimable issuance (zero-signal periods), but the public view still returns only the claimable portion. The unclaimable portion is reclaimed as `NO_SIGNAL` at the next `updateAccRewardsPerSignal()` call. + +### New Getters on IRewardsManager + +| Function | Returns | Purpose | +| ----------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `getIssuanceAllocator()` | `IIssuanceAllocationDistribution` | Current allocator contract (zero if unset) | +| `getReclaimAddress(bytes32 reason)` | `address` | Per-condition reclaim address (zero if unconfigured) | +| `getDefaultReclaimAddress()` | `address` | Fallback reclaim address | +| `getRewardsEligibilityOracle()` | `IRewardsEligibility` | Current eligibility oracle (zero if unset) | +| `getAllocatedIssuancePerBlock()` | `uint256` | Effective issuance rate — returns the allocator rate when set, otherwise falls back to storage. Replaces the legacy `getRewardsIssuancePerBlock()` for callers that need the protocol rate | +| `getRawIssuancePerBlock()` | `uint256` | Raw storage value, ignoring the allocator. Useful for debugging allocator configuration | + +### Changed Return Semantics + +**`getAllocationData()`** (IRewardsIssuer, implemented by SubgraphService) now returns a sixth value, `accRewardsPending`, representing accumulated rewards from allocation resizing that have not yet been claimed. Callers that destructure the return tuple need updating. + +**`IAllocation.State`** struct adds two fields: `accRewardsPending` (pending rewards from resize) and `createdAtEpoch` (epoch when the allocation was created). Both affect the return value of `getAllocation()`. + +## Provenance + +Merge commits into `main` that introduced the changes described above, in chronological order. + +| Date | Merge | PR | Scope | +| ---------- | ----------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2025-12-16 | `ff2f00a62` | #1265 | Eligibility oracle audit doc fixes (TRST-L-1, TRST-L-2) | +| 2025-12-16 | `48be37a20` | #1267 | Issuance allocator audit fix — default allocation, `setReclaimAddress` | +| 2025-12-31 | `89f1321c4` | #1272 | Issuance allocator audit fix v3 — forced reclaim, PPM-to-absolute migration | +| 2026-01-08 | `3d274a4f1` | #1255 | Issuance baseline — RewardsManager extensions, eligibility interface, test suites | +| 2026-01-08 | `363924149` | #1256 | Rewards Eligibility Oracle — full oracle implementation | +| 2026-01-08 | `cdef9b5fd` | #1257 | Issuance Allocator — full allocator, RewardsReclaim library, allocation close reclaim | +| 2026-02-17 | `ada315500` | #1279 | Rewards reclaiming (audited) — RewardsCondition rename, `setDefaultReclaimAddress`, subgraph denial accumulator handling, zero-signal reclaim, POI three-path logic, `POIPresented` event | +| 2026-02-19 | `127b7ef6f` | #1280 | Issuance umbrella merge — all prior work plus stale-allocation-resize reclaim (TRST-R-1) | diff --git a/packages/issuance/docs/testing/reo/BaselineTestPlan.md b/packages/issuance/docs/testing/reo/BaselineTestPlan.md new file mode 100644 index 000000000..7c4377e6a --- /dev/null +++ b/packages/issuance/docs/testing/reo/BaselineTestPlan.md @@ -0,0 +1,811 @@ +# Indexer Baseline Test Plan: Post-Upgrade Verification + +> **Navigation**: [← Back to REO Testing](README.md) + +This test plan validates that indexers can perform standard operational cycles on The Graph Network after a protocol upgrade. It is upgrade-agnostic and covers the core indexer workflows that must function correctly regardless of what changed. + +Each test includes CLI commands, GraphQL verification queries against the network subgraph, and pass/fail criteria. + +> All GraphQL queries run against the network subgraph. All addresses must be **lowercase**. + +--- + +## Prerequisites + +- ETH and GRT on the target network (testnet or mainnet) +- Indexer stack running (graph-node, indexer-agent, indexer-service, tap-agent) +- Minimum indexer stake met (100k GRT on testnet) +- Access to Explorer UI and network subgraph + +### Recommended log verbosity for troubleshooting + +``` +tap-agent: RUST_LOG=info,indexer_tap_agent=trace +indexer-service: RUST_LOG=info,indexer_service_rs=trace +indexer-agent: INDEXER_AGENT_LOG_LEVEL=trace +``` + +--- + +## Test Sequence Overview + +The tests are organized into 7 cycles. Cycles 1-6 cover individual operations; Cycle 7 ties them together in an end-to-end workflow. + +| Cycle | Area | Tests | +| ----- | ------------------------------ | --------- | +| 1 | Indexer Setup and Registration | 1.1 - 1.3 | +| 2 | Stake Management | 2.1 - 2.2 | +| 3 | Provision Management | 3.1 - 3.4 | +| 4 | Allocation Management | 4.1 - 4.5 | +| 5 | Query Serving and Revenue | 5.1 - 5.4 | +| 6 | Network Health | 6.1 - 6.3 | +| 7 | End-to-End Workflow | 7.1 | + +--- + +## Cycle 1: Indexer Setup and Registration + +### 1.1 Setup indexer via Explorer + +**Objective**: Stake GRT and set delegation parameters through Explorer UI. + +**Steps**: + +1. Navigate to Explorer +2. Stake GRT to your indexer address +3. Set delegation parameters (query fee cut, indexing reward cut) +4. Wait for transaction confirmation + +**Verification Query**: + +```graphql +{ + indexers(where: { id: "INDEXER_ADDRESS" }) { + id + createdAt + stakedTokens + queryFeeCut + indexingRewardCut + } +} +``` + +**Pass Criteria**: + +- Indexer entity exists with correct `stakedTokens` +- `queryFeeCut` and `indexingRewardCut` reflect configured values +- Transaction visible in Explorer history + +--- + +### 1.2 Register indexer URL and GEO coordinates + +**Objective**: Verify indexer metadata registration via the indexer agent. + +**Steps**: + +1. Configure `indexer-agent` with URL and GEO coordinates +2. Start or restart the agent +3. Confirm the agent logs show successful registration + +**Verification Query**: + +```graphql +{ + indexers(where: { id: "INDEXER_ADDRESS" }) { + id + url + geoHash + } +} +``` + +**Pass Criteria**: + +- `url` matches configured value +- `geoHash` is populated +- Agent logs show `Successfully registered indexer` + +--- + +### 1.3 Validate Subgraph Service provision and registration + +**Objective**: Confirm the indexer agent automatically creates a provision and registers with SubgraphService. + +**Steps**: + +1. Ensure indexer has sufficient unallocated stake +2. Start indexer agent +3. Monitor logs for provision creation and registration + +**Verification Query**: + +```graphql +{ + provisions(where: { indexer_: { id: "INDEXER_ADDRESS" } }) { + id + indexer { + id + url + geoHash + } + tokensProvisioned + tokensAllocated + tokensThawing + thawingPeriod + maxVerifierCut + dataService { + id + } + } +} +``` + +**Pass Criteria**: + +- Provision exists for SubgraphService +- `url` and `geoHash` populated in indexer registration +- `tokensProvisioned` is non-zero +- Agent logs show `Successfully provisioned to the Subgraph Service` and `Successfully registered indexer` + +--- + +## Cycle 2: Stake Management + +### 2.1 Add stake via Explorer + +**Objective**: Verify indexers can increase their stake. + +**Steps**: + +1. Navigate to Explorer +2. Add stake to your indexer +3. Wait for transaction confirmation + +**Verification Query**: + +```graphql +{ + indexers(where: { id: "INDEXER_ADDRESS" }) { + id + stakedTokens + allocatedTokens + availableStake + } +} +``` + +**Pass Criteria**: + +- `stakedTokens` increases by the added amount +- Transaction visible in Explorer history + +--- + +### 2.2 Unstake tokens and withdraw after thawing + +**Objective**: Verify the unstake and thawing period workflow. + +**Steps**: + +1. Unstake tokens via Explorer +2. Note the thawing period end time +3. Wait for thawing period to complete +4. Withdraw thawed tokens + +**Verification Query**: + +```graphql +{ + indexers(where: { id: "INDEXER_ADDRESS" }) { + id + stakedTokens + availableStake + } + thawRequests(where: { indexer_: { id: "INDEXER_ADDRESS" } }) { + id + tokens + thawingUntil + type + } +} +``` + +**Pass Criteria**: + +- Thaw request appears with correct token amount +- After thawing period, tokens withdraw successfully +- `stakedTokens` decreases by withdrawn amount + +--- + +## Cycle 3: Provision Management + +### 3.1 View current provision + +**Objective**: Check current Subgraph Service provision status. + +**Command**: + +```bash +graph indexer provisions get +``` + +**Verification Query**: + +```graphql +{ + provisions(where: { indexer_: { id: "INDEXER_ADDRESS" } }) { + id + tokensProvisioned + tokensThawing + tokensAllocated + thawingPeriod + maxVerifierCut + } +} +``` + +**Pass Criteria**: + +- CLI output matches subgraph data +- `tokensProvisioned` shows provisioned stake + +--- + +### 3.2 Add stake to provision + +**Objective**: Increase provision without creating a new one. + +**Command**: + +```bash +graph indexer provisions add +``` + +**Verification Query**: + +```graphql +{ + provisions(where: { indexer_: { id: "INDEXER_ADDRESS" } }) { + id + tokensProvisioned + tokensAllocated + indexer { + stakedTokens + availableStake + } + } +} +``` + +**Pass Criteria**: + +- `tokensProvisioned` increases by the added amount +- `availableStake` decreases correspondingly + +--- + +### 3.3 Thaw stake from provision + +**Objective**: Initiate thawing process to remove stake from provision. + +**Command**: + +```bash +graph indexer provisions thaw +``` + +**Verification Query**: + +```graphql +{ + provisions(where: { indexer_: { id: "INDEXER_ADDRESS" } }) { + id + tokensProvisioned + tokensThawing + } + thawRequests(where: { indexer_: { id: "INDEXER_ADDRESS" }, type: Provision }) { + id + tokens + thawingUntil + } +} +``` + +**Pass Criteria**: + +- `tokensThawing` increases by the thawed amount +- Thaw request created with future `thawingUntil` timestamp + +--- + +### 3.4 Remove thawed stake from provision + +**Objective**: Complete the provision reduction after thawing period. + +**Command**: + +```bash +graph indexer provisions remove +``` + +**Verification Query**: + +```graphql +{ + provisions(where: { indexer_: { id: "INDEXER_ADDRESS" } }) { + id + tokensProvisioned + tokensThawing + } + indexers(where: { id: "INDEXER_ADDRESS" }) { + availableStake + } +} +``` + +**Pass Criteria**: + +- `tokensThawing` decreases to 0 +- `tokensProvisioned` decreases by the removed amount +- `availableStake` increases correspondingly + +--- + +## Cycle 4: Allocation Management + +### 4.1 Find subgraph deployments with rewards + +**Objective**: Identify eligible deployments for allocation. + +**Query**: + +```graphql +{ + subgraphDeployments(where: { deniedAt: 0, signalledTokens_not: 0, indexingRewardAmount_not: 0 }) { + ipfsHash + stakedTokens + signalledTokens + indexingRewardAmount + manifest { + network + } + } +} +``` + +**Action**: Filter results by chains your graph-node can index. + +--- + +### 4.2 Create allocation manually + +**Objective**: Open an allocation for a specific deployment. + +**Command**: + +```bash +graph indexer allocations create +``` + +**Verification Query**: + +```graphql +{ + allocations(where: { indexer_: { id: "INDEXER_ADDRESS" }, status: "Active" }) { + id + allocatedTokens + createdAtEpoch + subgraphDeployment { + ipfsHash + } + } +} +``` + +**Pass Criteria**: + +- Allocation appears with status `Active` +- `allocatedTokens` matches specified amount +- `createdAtEpoch` is current epoch + +--- + +### 4.3 Create allocation via actions queue + +**Objective**: Test the actions queue workflow for allocation management. + +**Commands**: + +```bash +graph indexer actions queue allocate +graph indexer actions execute approve +``` + +**Verification**: Same as 4.2. + +**Pass Criteria**: + +- Action queued successfully +- After approval, allocation appears with status `Active` + +--- + +### 4.4 Create allocation via deployment rules + +**Objective**: Test automated allocation management through rules. + +**Command**: + +```bash +graph indexer rules set allocationAmount allocationLifetime +``` + +**Verification**: Same as 4.2. + +**Pass Criteria**: + +- Indexer agent picks up the rule and creates the allocation automatically +- Set `allocationLifetime` to a small value for quicker testing + +--- + +### 4.5 Reallocate a deployment + +**Objective**: Close and recreate allocation in one operation. + +**Command**: + +```bash +graph indexer allocations reallocate +``` + +**Verification Query**: + +```graphql +{ + allocations( + where: { indexer_: { id: "INDEXER_ADDRESS" }, subgraphDeployment_: { ipfsHash: "DEPLOYMENT_IPFS_HASH" } } + ) { + id + status + allocatedTokens + createdAtEpoch + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- Old allocation shows status `Closed` +- New allocation created with status `Active` +- New `allocatedTokens` matches specified amount + +--- + +## Cycle 5: Query Serving and Revenue Collection + +> **Cross-reference**: Allocations opened in Cycles 4-5 may also serve as setup for [ReoTestPlan Cycle 6](./ReoTestPlan.md#cycle-6-integration-with-rewards), which tests reward denial/recovery with mature allocations. If running both plans, keep extra allocations open for the REO reward integration tests. + +### 5.1 Send test queries + +**Objective**: Verify the indexer serves queries through the gateway. + +**Script** (save as `query_test.sh`): + +```bash +#!/bin/bash +subgraph_id=${1} +count=${2:-25} +api_key=${3:-"$GRAPH_API_KEY"} +gateway=${4:-"https://gateway.thegraph.com"} + +for ((i=0; i 50 +``` + +**Verification**: + +1. Queries return valid JSON with block data +2. Check indexer-service logs for query processing +3. Check database for TAP receipts: + +```sql +SELECT COUNT(*) FROM tap_horizon_receipts +WHERE allocation_id = ''; +``` + +**Pass Criteria**: + +- Queries succeed with 200 responses +- TAP receipts generated in database + +--- + +### 5.2 Close allocation and collect indexing rewards + +**Objective**: Verify rewards collection on allocation closure. + +**Prerequisites**: Allocation must be several epochs old. Check first: + +```graphql +{ + graphNetworks { + currentEpoch + } + allocations(where: { indexer_: { id: "INDEXER_ADDRESS" }, status: "Active" }) { + id + allocatedTokens + createdAtEpoch + } +} +``` + +**Command**: + +```bash +graph indexer allocations close +``` + +**Verification Query**: + +```graphql +{ + allocations(where: { id: "ALLOCATION_ID" }) { + id + status + allocatedTokens + indexingRewards + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- Status changes to `Closed` +- `indexingRewards` is non-zero (for deployments with rewards) +- `closedAtEpoch` is current epoch + +--- + +### 5.3 Verify query fee collection + +**Objective**: Confirm query fees collected after allocation closure. + +> Query fee collection happens asynchronously after closure and may take minutes to hours. + +**Verification Query**: + +```graphql +{ + allocations(where: { indexer_: { id: "INDEXER_ADDRESS" }, status: "Closed" }) { + id + queryFeesCollected + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- `queryFeesCollected` is non-zero for allocations that served queries + +--- + +### 5.4 Close allocation with explicit POI + +**Objective**: Test POI override and reward eligibility. + +**Prerequisites**: Allocation is several epochs old. + +**Command**: + +```bash +graph indexer allocations close --poi +``` + +**Verification Query**: + +```graphql +{ + allocations(where: { id: "ALLOCATION_ID" }) { + id + status + indexingRewards + poi + } +} +``` + +**Pass Criteria**: + +- `indexingRewards` is non-zero +- `poi` matches the submitted value + +--- + +## Cycle 6: Network Health + +### 6.1 Monitor indexer health + +**Objective**: Verify indexer appears healthy in the network. + +**Query**: + +```graphql +{ + indexers(where: { id: "INDEXER_ADDRESS" }) { + id + url + geoHash + stakedTokens + allocatedTokens + availableStake + delegatedTokens + queryFeesCollected + rewardsEarned + allocations(where: { status: "Active" }) { + id + subgraphDeployment { + ipfsHash + } + } + } +} +``` + +**Pass Criteria**: + +- All expected fields populated +- Active allocations visible +- Accumulated rewards and fees present + +--- + +### 6.2 Check epoch progression + +**Objective**: Verify the network is progressing normally. + +**Query**: + +```graphql +{ + graphNetworks { + id + currentEpoch + totalTokensStaked + totalTokensAllocated + totalQueryFees + totalIndexingRewards + } +} +``` + +**Pass Criteria**: + +- `currentEpoch` increments at the expected rate +- Network totals accumulate over time + +--- + +### 6.3 Verify no unexpected errors in logs + +**Objective**: Confirm clean operation across all indexer components. + +**Steps**: + +1. Review indexer-agent logs for unexpected errors or reverts +2. Review indexer-service logs for query handling issues +3. Review tap-agent logs for receipt/RAV issues +4. Review graph-node logs for indexing errors + +**Pass Criteria**: + +- No unexpected `ERROR` level log entries +- No transaction reverts +- No stuck or looping operations + +--- + +## Cycle 7: End-to-End Workflow + +### 7.1 Full operational cycle + +Run these operations in sequence to validate a complete indexer lifecycle: + +| Step | Operation | Reference | +| ---- | ---------------------------------- | --------- | +| 1 | Check provision status | 3.1 | +| 2 | Find a rewarded deployment | 4.1 | +| 3 | Create allocation | 4.2 | +| 4 | Send test queries (50-100) | 5.1 | +| 5 | Wait 2-3 epochs | - | +| 6 | Close allocation | 5.2 | +| 7 | Verify indexing rewards (non-zero) | 5.2 | +| 8 | Verify query fees collected | 5.3 | +| 9 | Repeat with a different deployment | 4.2 | + +**Pass Criteria**: All individual pass criteria met across the full sequence. + +--- + +## Post-Upgrade Validation Checklist + +### Core functionality + +- [ ] Indexer stack components compatible with upgraded contracts +- [ ] Existing allocations continue to function +- [ ] New allocations can be created +- [ ] Query serving works through gateway +- [ ] Indexing rewards collected correctly +- [ ] Query fees collected correctly +- [ ] Provision management operations succeed + +### Network health + +- [ ] Network subgraph indexes the upgrade correctly +- [ ] Epoch progression continues normally +- [ ] Explorer displays correct data +- [ ] No unexpected reverts or errors in logs + +### Upgrade-specific (fill in per upgrade) + +- [ ] Contract address changes updated in indexer configuration +- [ ] New protocol parameters match expected values +- [ ] Schema changes (if any) reflected correctly +- [ ] _[Add upgrade-specific items here]_ + +--- + +## Troubleshooting + +**Allocation creation fails**: + +- Check `availableStake` is sufficient +- Verify graph-node is syncing the target deployment +- Ensure provision has enough tokens + +**Query fees not collected**: + +- Wait longer (can take several hours) +- Check TAP receipts in database +- Verify queries actually hit your indexer (check service logs) + +**Zero indexing rewards**: + +- Confirm allocation was open for the required number of epochs +- Verify POI was submitted correctly +- Confirm deployment has rewards enabled (`indexingRewardAmount_not: 0`) + +--- + +## Network Configuration Reference + +- [Arbitrum Sepolia (testnet)](TestnetDetails.md) +- [Arbitrum One (mainnet)](MainnetDetails.md) + +--- + +## Related Documentation + +- [← Back to REO Testing](README.md) + +--- + +_Extracted from Horizon upgrade test plans._ diff --git a/packages/issuance/docs/testing/reo/IndexerTestGuide.md b/packages/issuance/docs/testing/reo/IndexerTestGuide.md new file mode 100644 index 000000000..6b1423a36 --- /dev/null +++ b/packages/issuance/docs/testing/reo/IndexerTestGuide.md @@ -0,0 +1,542 @@ +# Indexer Eligibility Test Plan + +> **Navigation**: [← Back to REO Testing](README.md) | [BaselineTestPlan](BaselineTestPlan.md) | [ReoTestPlan](ReoTestPlan.md) + +Tests for indexers to verify correct eligibility handling on Arbitrum Sepolia. This is a focused subset of [ReoTestPlan.md](ReoTestPlan.md), covering per-indexer eligibility flows (renew, expire, recover). The full ReoTestPlan covers additional areas: deployment verification, oracle operations, timeout fail-open, emergency operations, and UI verification. + +Each indexer controls their own eligibility via the ORACLE_ROLE granted to their address. + +Each test includes CLI commands, verification queries against the network subgraph, and pass/fail criteria. + +> All GraphQL queries run against the network subgraph. All addresses must be **lowercase**. + +--- + +## Prerequisites + +- Completed [BaselineTestPlan](BaselineTestPlan.md) Cycles 1-4 (indexer staked, provisioned, can allocate) +- `cast` (Foundry) installed for contract interaction +- Indexer private key available for signing transactions + +### Environment Configuration (set by coordinator) + +- **Eligibility validation**: enabled +- **Eligibility period**: short (e.g. 10-15 minutes) +- **Oracle timeout**: very high (no fail-open during testing) +- **ORACLE_ROLE**: granted to each participating indexer + +### Environment Variables + +```bash +export RPC="https://sepolia-rollup.arbitrum.io/rpc" +export INDEXER= # lowercase +export INDEXER_KEY= + +# Contract addresses (Arbitrum Sepolia) +export REO=0x62c2305739cc75f19a3a6d52387ceb3690d99a99 +export MOCK_REO=0x5FB23365F8cf643D5f1459E9793EfF7254522400 +export REWARDS_MANAGER=0x1f49cae7669086c8ba53cc35d1e9f80176d67e79 +``` + +### Mock REO Option + +A `MockRewardsEligibilityOracle` is deployed at `0x5FB23365F8cf643D5f1459E9793EfF7254522400`. When RewardsManager is pointed at the mock (by the coordinator), you can directly toggle your eligibility without oracle roles, renewal periods, or timeout logic: + +```bash +# Check your eligibility +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC + +# Toggle ineligible (signed by your indexer key) +cast send $MOCK_REO "setEligible(bool)" false --rpc-url $RPC --private-key $INDEXER_KEY + +# Toggle eligible again +cast send $MOCK_REO "setEligible(bool)" true --rpc-url $RPC --private-key $INDEXER_KEY +``` + +If the coordinator has pointed RewardsManager at the mock, you can use Sets 2m-4m below instead of Sets 2-4 for faster testing. Ask the coordinator which REO is active: + +```bash +cast call $REWARDS_MANAGER "getRewardsEligibilityOracle()(address)" --rpc-url $RPC +``` + +### Verify Environment + +```bash +# Validation must be enabled +cast call $REO "getEligibilityValidation()(bool)" --rpc-url $RPC +# Expected: true + +# Confirm you have ORACLE_ROLE +ORACLE_ROLE=$(cast keccak "ORACLE_ROLE") +cast call $REO "hasRole(bytes32,address)(bool)" $ORACLE_ROLE $INDEXER --rpc-url $RPC +# Expected: true + +# Note the eligibility period (seconds) +cast call $REO "getEligibilityPeriod()(uint256)" --rpc-url $RPC +``` + +--- + +## Test Sequence Overview + +| Set | Area | Tests | +| --- | ------------------------------ | --------- | +| 1 | Prepare Allocations | 1.1 | +| 2 | Eligible — Receive Rewards | 2.1 - 2.2 | +| 3 | Ineligible — Verify Denial | 3.1 - 3.2 | +| 4 | Optimistic Recovery | 4.1 - 4.2 | +| 5 | Validation Disabled | 5.1 | +| 2m | Eligible — Mock REO | 2m.1 | +| 3m | Ineligible — Mock REO | 3m.1 | +| 4m | Optimistic Recovery — Mock REO | 4m.1 | + +**Timing**: Set 1 opens allocations that need epoch maturity. Sets 2-4 use the production REO (sequential: renew → eligible close → wait for expiry → ineligible close → re-renew → recovery close). Sets 2m-4m use the mock REO for instant eligibility control -- no waiting for expiry. Set 5 requires coordinator to toggle validation. + +--- + +## Set 1: Prepare Allocations + +### 1.1 Open allocations for eligibility tests + +**Objective**: Open 3+ allocations on different deployments. These need to mature across epochs before they can be closed in Sets 2-4. + +**Prerequisites**: Indexer is staked, provisioned, and registered (BaselineTestPlan Cycles 1-3). Subgraph deployments with signal exist. + +**Steps**: + +1. Find subgraph deployments with signal +2. Open allocations on 3+ different deployments +3. Record allocation IDs and current epoch + +**Command**: + +```bash +graph indexer actions queue allocate +graph indexer actions queue allocate +graph indexer actions queue allocate +graph indexer actions approve +``` + +**Verification Query**: + +```graphql +{ + indexer(id: "INDEXER_ADDRESS") { + allocations(where: { status: "Active" }) { + id + subgraphDeployment { + ipfsHash + } + allocatedTokens + createdAtEpoch + } + } + graphNetwork(id: "1") { + currentEpoch + } +} +``` + +**Pass Criteria**: + +- 3+ active allocations visible in subgraph +- `createdAtEpoch` recorded (need at least 1 epoch to pass before closing) + +> While waiting for epoch maturity, proceed to Set 2 to renew eligibility. + +--- + +## Set 2: Eligible — Receive Rewards + +### 2.1 Renew eligibility + +**Objective**: Renew your own eligibility and confirm the REO reflects it. + +**Prerequisites**: ORACLE_ROLE confirmed in environment check. + +**Command**: + +```bash +cast send $REO "renewIndexerEligibility(address[],bytes)" "[$INDEXER]" "0x" \ + --rpc-url $RPC --private-key $INDEXER_KEY +``` + +**Verification**: + +```bash +cast call $REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: true + +cast call $REO "getEligibilityRenewalTime(address)(uint256)" $INDEXER --rpc-url $RPC +# Record this timestamp — eligibility expires at: renewal_time + eligibility_period +``` + +**Pass Criteria**: + +- `isEligible` returns `true` +- `getEligibilityRenewalTime` returns a recent timestamp + +--- + +### 2.2 Close allocation while eligible + +**Objective**: Verify that an eligible indexer receives indexing rewards when closing an allocation. + +**Prerequisites**: `isEligible` returns `true`. Allocation from Set 1 is at least 1 epoch old. + +**Command**: + +```bash +graph indexer actions queue close +graph indexer actions approve +``` + +**Verification Query**: + +```graphql +{ + allocations(where: { id: "ALLOCATION_ID" }) { + id + status + indexingRewards + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- Status changes to `Closed` +- `indexingRewards` is non-zero +- `closedAtEpoch` is current epoch + +--- + +## Set 3: Ineligible — Verify Denial + +### 3.1 Wait for eligibility expiry + +**Objective**: Confirm that eligibility expires after the configured period. + +**Prerequisites**: Renewal timestamp and eligibility period recorded from Set 2.1. + +**Steps**: + +1. Calculate expiry time: `renewal_timestamp + eligibility_period` +2. Wait until current block time exceeds expiry +3. Verify eligibility has expired + +**Verification**: + +```bash +cast call $REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: false + +# Confirm by comparing timestamps: +cast call $REO "getEligibilityRenewalTime(address)(uint256)" $INDEXER --rpc-url $RPC +cast call $REO "getEligibilityPeriod()(uint256)" --rpc-url $RPC +cast block latest --field timestamp --rpc-url $RPC +# block_timestamp > renewal_time + period +``` + +**Pass Criteria**: + +- `isEligible` returns `false` +- Block timestamp exceeds renewal time + eligibility period + +--- + +### 3.2 Close allocation while ineligible + +**Objective**: Verify that an ineligible indexer receives zero indexing rewards when closing an allocation. Denied rewards are routed to the reclaim contract. + +**Prerequisites**: `isEligible` returns `false`. Allocation from Set 1 is at least 1 epoch old. + +**Steps**: + +1. Confirm ineligibility +2. Close an allocation +3. Verify zero rewards + +**Command**: + +```bash +# Confirm ineligible +cast call $REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: false + +# Close allocation +graph indexer actions queue close +graph indexer actions approve +``` + +**Verification Query**: + +```graphql +{ + allocations(where: { id: "ALLOCATION_ID" }) { + id + status + indexingRewards + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- Status changes to `Closed` +- `indexingRewards` is `0` +- Contrast with Set 2.2 where `indexingRewards` was non-zero + +--- + +## Set 4: Optimistic Recovery + +Eligibility denial is **optimistic**: rewards accrue to allocations during ineligible periods and are paid in full when the indexer closes while eligible. This is the key behavioral difference from subgraph denial. + +### 4.1 Re-renew eligibility + +**Objective**: Restore eligibility after expiry and confirm the REO reflects it. + +**Prerequisites**: Eligibility expired (Set 3.1). Do this promptly after Set 3. + +**Command**: + +```bash +cast send $REO "renewIndexerEligibility(address[],bytes)" "[$INDEXER]" "0x" \ + --rpc-url $RPC --private-key $INDEXER_KEY +``` + +**Verification**: + +```bash +cast call $REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: true +``` + +**Pass Criteria**: + +- `isEligible` returns `true` after re-renewal + +--- + +### 4.2 Close allocation — full rewards after re-renewal + +**Objective**: Verify that an allocation closed after re-renewal receives full rewards for its entire duration, including the ineligible period. + +**Prerequisites**: `isEligible` returns `true`. Active allocation from Set 1 has been open across multiple epochs including the ineligible period. + +**Command**: + +```bash +graph indexer actions queue close +graph indexer actions approve +``` + +**Verification Query**: + +```graphql +{ + allocations(where: { id: "ALLOCATION_ID" }) { + id + status + indexingRewards + createdAtEpoch + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- Status changes to `Closed` +- `indexingRewards` is non-zero +- Rewards reflect the full allocation duration (`closedAtEpoch - createdAtEpoch`), not reduced by the ineligible period +- Compare with Set 2.2: this allocation was open longer and should have proportionally more rewards + +--- + +## Set 5: Validation Disabled + +### 5.1 Verify eligibility when validation is off + +**Objective**: Confirm that all indexers are eligible when validation is disabled, regardless of renewal status. This is the default state and the emergency fallback. + +**Prerequisites**: Coordinator has disabled validation (`setEligibilityValidation(false)`). + +**Verification**: + +```bash +cast call $REO "getEligibilityValidation()(bool)" --rpc-url $RPC +# Expected: false + +cast call $REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: true +``` + +**Pass Criteria**: + +- `getEligibilityValidation` returns `false` +- `isEligible` returns `true` even without a recent renewal + +--- + +## Mock REO Test Sets (2m - 4m) + +These sets use the `MockRewardsEligibilityOracle` for direct eligibility control. The coordinator must have pointed RewardsManager at the mock. These replace Sets 2-4 when the mock is active. + +### 2m.1 Close allocation while eligible (mock) + +**Objective**: Verify rewards when eligible (the default mock state). + +**Prerequisites**: Allocation from Set 1 is at least 1 epoch old. + +```bash +# Confirm eligible (default) +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: true + +# Close allocation +graph indexer actions queue close +graph indexer actions approve +``` + +**Pass Criteria**: `indexingRewards` is non-zero. + +--- + +### 3m.1 Toggle ineligible and close allocation (mock) + +**Objective**: Verify reward denial after toggling ineligible. + +```bash +# Toggle ineligible +cast send $MOCK_REO "setEligible(bool)" false --rpc-url $RPC --private-key $INDEXER_KEY + +# Confirm +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: false + +# Close allocation +graph indexer actions queue close +graph indexer actions approve +``` + +**Pass Criteria**: `indexingRewards` = `0`. Allocation still transitions to `Closed`. + +--- + +### 4m.1 Re-enable and close allocation -- full rewards (mock) + +**Objective**: Verify optimistic recovery: toggle eligible again and receive full rewards. + +**Prerequisites**: Active allocation open across multiple epochs, including time while ineligible. + +```bash +# Toggle eligible +cast send $MOCK_REO "setEligible(bool)" true --rpc-url $RPC --private-key $INDEXER_KEY + +# Confirm +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: true + +# Close allocation +graph indexer actions queue close +graph indexer actions approve +``` + +**Pass Criteria**: + +- `indexingRewards` is non-zero +- Rewards reflect the full allocation duration (not reduced by the ineligible period) +- Compare with 2m.1: longer-open allocation should have proportionally more rewards + +--- + +## Indexer Awareness: Denial and Reward Conditions + +These situations are managed by the coordinator, not the indexer. No indexer action is needed — but indexers should understand the expected behaviour. + +### During subgraph denial + +If a coordinator denies a subgraph you have allocations on: + +- **Continue presenting POIs** — deferred presentations reset the staleness clock, preventing STALE_POI reclaim when the subgraph is later undenied +- `getRewards()` returns a frozen value (pre-denial uncollected rewards are preserved) +- Closing an allocation on a denied subgraph returns 0 rewards but preserves the pre-denial amount + +**Verification during denial:** + +```bash +cast call $REWARDS_MANAGER "isDenied(bytes32)(bool)" --rpc-url $RPC +# Expected: true (if coordinator denied it) + +cast call $REWARDS_MANAGER "getRewards(address,address)(uint256)" --rpc-url $RPC +# Returns frozen pre-denial rewards (non-zero if you had uncollected rewards) +``` + +### After subgraph undeny + +After a coordinator undenies a subgraph: + +- Accumulators resume growing +- Close allocation normally — rewards include pre-denial + post-undeny amounts +- Denial-period rewards were reclaimed to the protocol (not included in your claim) + +**Verification after undeny:** + +```bash +cast call $REWARDS_MANAGER "isDenied(bytes32)(bool)" --rpc-url $RPC +# Expected: false + +cast call $REWARDS_MANAGER "getRewards(address,address)(uint256)" --rpc-url $RPC +# Should be growing again (pre-denial + post-undeny rewards) +``` + +### POI staleness + +If an allocation goes without POI presentation for longer than `maxPOIStaleness`, rewards are reclaimed as STALE_POI instead of being paid to the indexer. + +```bash +cast call "maxPOIStaleness()(uint256)" --rpc-url $RPC +# Note this value — present POIs more frequently than this +``` + +**Action**: Ensure your indexer agent is healthy and presenting POIs regularly. + +### Signal-related conditions + +Rewards require curation signal above the minimum threshold. If signal drops below `minimumSubgraphSignal`, rewards freeze and are reclaimed. This is not actionable by indexers — it depends on curators. + +```bash +cast call $REWARDS_MANAGER "minimumSubgraphSignal()(uint256)" --rpc-url $RPC +``` + +**Related**: [RewardsConditionsTestPlan.md](RewardsConditionsTestPlan.md) | [SubgraphDenialTestPlan.md](SubgraphDenialTestPlan.md) + +--- + +## Troubleshooting + +**`isEligible` returns `false` unexpectedly:** + +- Check if validation is enabled: `getEligibilityValidation()` +- Check your renewal time: `getEligibilityRenewalTime(address)` +- Check the eligibility period: `getEligibilityPeriod()` +- Your renewal may have expired: compare `renewal_time + period` with current block time + +**Renewal transaction reverts:** + +- Confirm you have ORACLE_ROLE: `hasRole(ORACLE_ROLE, address)` +- Confirm the REO is not paused: `paused()` + +**Zero rewards on close despite being eligible:** + +- Check allocation maturity: must have been open for at least 1 full epoch +- Check if subgraph deployment has signal (no signal = no rewards) +- Verify RewardsManager points to the REO: `getRewardsEligibilityOracle()` + +--- + +**Related**: [BaselineTestPlan.md](BaselineTestPlan.md) | [ReoTestPlan.md](ReoTestPlan.md) diff --git a/packages/issuance/docs/testing/reo/MainnetDetails.md b/packages/issuance/docs/testing/reo/MainnetDetails.md new file mode 100644 index 000000000..590c3b134 --- /dev/null +++ b/packages/issuance/docs/testing/reo/MainnetDetails.md @@ -0,0 +1,38 @@ +# Arbitrum One — Mainnet Details + +## Network Parameters + +| Parameter | Value | +| ----------------- | ---------------------------------------------- | +| Explorer | | +| Gateway | | +| Network subgraph | `DZz4kDTdmzWLWsV373w2bSmoar3umKKH9y82SUKr5qmp` | +| Epoch length | ~6,646 blocks (~24 hours) | +| Min indexer stake | 100k GRT | + +## Network Subgraph + +**Query via Graph Explorer**: [Graph Network Arbitrum](https://thegraph.com/explorer/subgraphs/DZz4kDTdmzWLWsV373w2bSmoar3umKKH9y82SUKr5qmp?view=Query&chain=arbitrum-one) + +Or query directly: + +```bash +export GRAPH_API_KEY= +curl "https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/DZz4kDTdmzWLWsV373w2bSmoar3umKKH9y82SUKr5qmp" \ + -H 'content-type: application/json' \ + -d '{"query": "{ _meta { block { number } } }"}' +``` + +## Contract Addresses + +| Contract | Address | +| ------------------------ | -------------------------------------------- | +| RewardsEligibilityOracle | TBD | +| RewardsManager | `0x971b9d3d0ae3eca029cab5ea1fb0f72c85e6a525` | +| SubgraphService | `0xb2bb92d0de618878e438b55d5846cfecd9301105` | +| GraphToken (L2) | `0x9623063377ad1b27544c965ccd7342f7ea7e88c7` | +| Controller | `0x0a8491544221dd212964fbb96487467291b2c97e` | + +--- + +- [← Back to REO Testing](README.md) diff --git a/packages/issuance/docs/testing/reo/README.md b/packages/issuance/docs/testing/reo/README.md new file mode 100644 index 000000000..666885c68 --- /dev/null +++ b/packages/issuance/docs/testing/reo/README.md @@ -0,0 +1,156 @@ +# Issuance Upgrade Testing Documentation + +Comprehensive test plans for validating The Graph Network after an upgrade. Three-layer approach: baseline indexer operations (upgrade-agnostic), REO-specific eligibility and oracle tests, and reward condition tests covering denial, reclaim, signal, POI paths, and allocation lifecycle changes. + +## Quick Start + +1. **Indexers start here** → Follow [IndexerTestGuide.md](IndexerTestGuide.md) +2. **Detailed baseline reference** → [BaselineTestPlan.md](BaselineTestPlan.md) +3. **REO eligibility tests** → [ReoTestPlan.md](ReoTestPlan.md) +4. **Subgraph denial tests** → [SubgraphDenialTestPlan.md](SubgraphDenialTestPlan.md) +5. **Reward conditions tests** → [RewardsConditionsTestPlan.md](RewardsConditionsTestPlan.md) + +**Mock REO available**: A `MockRewardsEligibilityOracle` at `0x5FB23365F8cf643D5f1459E9793EfF7254522400` (Arbitrum Sepolia) provides instant eligibility control for integration testing. See the mock-based test paths in [ReoTestPlan](ReoTestPlan.md#mock-reo-quick-test-path) and [IndexerTestGuide](IndexerTestGuide.md#mock-reo-option). + +## Reading Order + +1. **[BaselineTestPlan.md](BaselineTestPlan.md)** -- Upgrade-agnostic indexer operations (run first) +2. **[ReoTestPlan.md](ReoTestPlan.md)** -- REO-specific eligibility, oracle, and rewards tests (run after baseline passes) +3. **[RewardsConditionsTestPlan.md](RewardsConditionsTestPlan.md)** -- Reclaim system, signal conditions, POI paths, allocation lifecycle (run after baseline passes; Cycle 1 configures reclaim addresses needed by other plans) +4. **[SubgraphDenialTestPlan.md](SubgraphDenialTestPlan.md)** -- Subgraph denial two-level handling, accumulator freeze, deferral, deny/undeny lifecycle (run after reclaim setup) +5. **[IndexerTestGuide.md](IndexerTestGuide.md)** -- Condensed guide for indexers running eligibility tests (subset of ReoTestPlan) + +``` +BaselineTestPlan (7 cycles, 22 tests) + │ Covers: setup, staking, provisions, allocations, queries, health + │ + ├──▶ ReoTestPlan (8 cycles + mock path, 36 tests) + │ Covers: deployment, eligibility, oracle, rewards, emergency, UI + │ Depends on: Baseline Cycles 1-7 pass first + │ Cycle 2.3 opens allocations reused in Cycle 6 + │ Cycle 6m: mock REO path for fast integration testing + │ + ├──▶ RewardsConditionsTestPlan (7 cycles, 26 tests) + │ Covers: reclaim config, below-minimum signal, zero allocated tokens, + │ POI paths (stale/zero/too-young), allocation resize/close, observability + │ Depends on: Baseline Cycles 1-7 pass first + │ Cycle 1 configures reclaim addresses used by all reclaim tests + │ + ├──▶ SubgraphDenialTestPlan (6 cycles, 18 tests) + │ Covers: deny/undeny state, accumulator freeze, allocation deferral, + │ pre-denial reward recovery, edge cases + │ Depends on: Baseline + RewardsConditionsTestPlan Cycle 1 (reclaim setup) + │ + └──▶ IndexerTestGuide (5 sets + 3 mock sets, 11 tests) + Covers: eligible/ineligible/recovery flows + Depends on: Baseline Cycles 1-4 (staked, provisioned, can allocate) + Subset of ReoTestPlan focused on per-indexer eligibility + Sets 2m-4m: mock REO alternative for instant eligibility control +``` + +## Documentation + +### Test Plans + +| Document | Purpose | +| ------------------------------------------------------------ | --------------------------------------------------------------------------------------- | +| [BaselineTestPlan.md](BaselineTestPlan.md) | Detailed baseline indexer operational tests (7 cycles, 22 tests) | +| [ReoTestPlan.md](ReoTestPlan.md) | REO eligibility, oracle, and rewards integration (8 cycles + mock path, 36 tests) | +| [RewardsConditionsTestPlan.md](RewardsConditionsTestPlan.md) | Reclaim system, signal conditions, POI paths, allocation lifecycle (7 cycles, 26 tests) | +| [SubgraphDenialTestPlan.md](SubgraphDenialTestPlan.md) | Subgraph denial: accumulator freeze, deferral, recovery (6 cycles, 18 tests) | +| [IndexerTestGuide.md](IndexerTestGuide.md) | Condensed indexer eligibility tests (5 sets + 3 mock sets, 11 tests) | + +## Test Coverage + +### Baseline Tests (7 Cycles) + +1. **Cycle 1: Indexer Setup and Registration** (3 tests) + - Setup via Explorer, register URL/GEO, validate SubgraphService provision + +2. **Cycle 2: Stake Management** (2 tests) + - Add stake, unstake and withdraw after thawing + +3. **Cycle 3: Provision Management** (4 tests) + - View provision, add stake, thaw stake, remove thawed stake + +4. **Cycle 4: Allocation Management** (5 tests) + - Find rewarded deployments, create allocations (manual/queue/rules), reallocate + +5. **Cycle 5: Query Serving and Revenue** (4 tests) + - Send test queries, close allocations, verify rewards and fees + +6. **Cycle 6: Network Health** (3 tests) + - Monitor indexer health, check epoch progression, verify logs + +7. **Cycle 7: End-to-End Workflow** (1 test) + - Complete operational cycle from allocation to revenue collection + +### REO-Specific Tests (ReoTestPlan) + +1. **Eligibility State Transitions** + - Validation toggle, renewals, expiry, oracle timeout fail-open + +2. **Role-Based Operations** + - Governor, Operator, Oracle, Pause role actions and access control + +3. **Integration with RewardsManager** + - Eligible indexer rewards, ineligible indexer denial, reclaim flows + +4. **Edge Cases** + - Large eligibility period, same-block re-renewal, configuration races + +5. **Deployment Verification** + - Post-deploy role checks, parameter validation, proxy consistency + +### Reward Conditions Tests (RewardsConditionsTestPlan) + +1. **Reclaim System Configuration** + - Per-condition addresses, default fallback, routing verification, access control + +2. **Below-Minimum Signal** + - Threshold changes, accumulator freeze, reclaim, restoration + +3. **Zero Allocated Tokens** + - Detection, reclaim, allocation resumption from stored baseline + +4. **POI Presentation Paths** + - Normal claim (NONE), stale POI reclaim, zero POI reclaim, too-young deferral + +5. **Allocation Lifecycle** + - Stale resize reclaim, non-stale resize pass-through, close allocation reclaim + +6. **Observability** + - POIPresented event on every presentation, RewardsReclaimed event context, view function freeze + +### Subgraph Denial Tests (SubgraphDenialTestPlan) + +1. **Denial State Management** + - setDenied, isDenied, idempotent deny, access control + +2. **Accumulator Freeze** + - accRewardsForSubgraph freeze, getRewards freeze, reclaim during denial + +3. **Allocation-Level Deferral** + - POI defers (preserves rewards), multiple defers safe, continued POI presentation + +4. **Undeny and Recovery** + - Accumulator resumption, pre-denial rewards claimable, denial-period exclusion + +5. **Edge Cases** + - New allocation while denied, all-close-while-denied, rapid deny/undeny, denial vs eligibility precedence + +See also: [IssuanceAllocatorTestPlan](support/IssuanceAllocatorTestPlan.md) (independent of REO, pending deployment) + +## Network Configuration + +- [Arbitrum Sepolia (testnet)](TestnetDetails.md) — Explorer, Gateway, network subgraph, RPC, contract addresses +- [Arbitrum One (mainnet)](MainnetDetails.md) — Explorer, Gateway, network subgraph, contract addresses + +> **GraphQL note**: All addresses in queries must be lowercase. Invisible Unicode characters are sometimes introduced when copying queries from GitHub or chat tools and will inexplicably cause empty results. + +## Testing Approach + +1. **Testnet first** - All tests validated on Arbitrum Sepolia before mainnet +2. **Reusable baseline** - Upgrade-agnostic tests reused across protocol upgrades +3. **Incremental** - Baseline confidence first, then upgrade-specific scenarios +4. **Three-layer validation** - Standard operations + REO eligibility + reward conditions/denial diff --git a/packages/issuance/docs/testing/reo/ReoTestPlan.md b/packages/issuance/docs/testing/reo/ReoTestPlan.md new file mode 100644 index 000000000..d2ecf28a0 --- /dev/null +++ b/packages/issuance/docs/testing/reo/ReoTestPlan.md @@ -0,0 +1,1103 @@ +# REO Test Plan: Rewards Eligibility Oracle + +> **Navigation**: [← Back to REO Testing](README.md) | [BaselineTestPlan](BaselineTestPlan.md) + +Tests specific to the Rewards Eligibility Oracle upgrade. Run these **after** the [baseline tests](./BaselineTestPlan.md) pass to confirm standard indexer operations are unaffected. + +> All contract reads use `cast call`. All addresses must be **lowercase**. Replace placeholder addresses with actual deployed addresses for your network. + +## Contract Addresses + +| Contract | Arbitrum Sepolia | Arbitrum One | +| -------------------------------- | -------------------------------------------- | ------------ | +| RewardsEligibilityOracle (proxy) | `0x62c2305739cc75f19a3a6d52387ceb3690d99a99` | TBD | +| MockRewardsEligibilityOracle | `0x5FB23365F8cf643D5f1459E9793EfF7254522400` | N/A | +| RewardsManager (proxy) | `0x1f49cae7669086c8ba53cc35d1e9f80176d67e79` | TBD | +| GraphToken (L2) | `0xf8c05dcf59e8b28bfd5eed176c562bebcfc7ac04` | TBD | + +**Address sources**: `packages/issuance/addresses.json` (REO), `packages/horizon/addresses.json` (RewardsManager, GraphToken) in the `post-audit` worktree. + +### RPC + +| Network | RPC URL | +| ---------------- | ---------------------------------------- | +| Arbitrum Sepolia | `https://sepolia-rollup.arbitrum.io/rpc` | + +### Hardhat Tasks + +The deployment package provides Hardhat tasks that read from the address books and handle governance workflow automatically. Run from `packages/deployment` in the `post-audit` worktree: + +```bash +npx hardhat reo:status --network arbitrumSepolia # Full status: config, oracle activity, role holders +npx hardhat reo:enable --network arbitrumSepolia # Enable eligibility validation (requires OPERATOR_ROLE) +npx hardhat reo:disable --network arbitrumSepolia # Disable eligibility validation (requires OPERATOR_ROLE) +``` + +These are alternatives to the raw `cast` commands used below. `reo:status` in particular is useful as a quick check at any point during testing. + +--- + +## Testing Approach + +**Multi-indexer cycling**: Three indexers cycle through eligibility states individually (not simultaneously). Each indexer transitions through eligible/ineligible states in sequence, allowing controlled observation of each transition. + +| Phase | Indexer A | Indexer B | Indexer C | +| ----- | -------------------- | -------------------- | -------------------- | +| 1 | Eligible | -- | -- | +| 2 | Ineligible (expired) | Eligible | -- | +| 3 | Re-renewed | Ineligible (expired) | Eligible | +| 4 | Eligible | Re-renewed | Ineligible (expired) | + +**Oracle control**: Use a dedicated test oracle account (fake oracle) to manually control eligibility state transitions rather than relying on the actual reporting software. Grant ORACLE_ROLE to this account in Cycle 3. + +**Testnet parameter acceleration**: Reduce time-dependent parameters for practical testing: + +| Parameter | Default | Test Value | Purpose | +| --------------------- | -------------------- | ----------------------- | ------------------------------------------ | +| Eligibility period | 14 days (1,209,600s) | 5-10 minutes (300-600s) | Allow expiration within a test session | +| Oracle update timeout | 7 days (604,800s) | 5-10 minutes (300-600s) | Allow fail-open testing without long waits | + +> Testnet epochs are ~554 blocks (~110 minutes) vs ~6,646 blocks (~24h) on mainnet. Issuance rates are adjusted proportionally. + +**Stakeholder coordination**: Discord channel for testing. UI/Explorer team and network subgraph team monitor throughout for display accuracy during denial scenarios. + +--- + +## Execution Phases + +| Phase | Cycles | Activity | +| ----------- | ------ | -------------------------------------------------------------------------------------------------------- | +| Setup | — | Run [BaselineTestPlan](BaselineTestPlan.md) Cycles 1-7, confirm testnet environment | +| REO Phase 1 | 1-3 | Deployment verification, default state, oracle setup | +| REO Phase 2 | 4-5 | Validation enabled, timeout fail-open, begin indexer cycling | +| REO Phase 3 | 6/6m | Integration with rewards -- use mock REO (6m) for fast iteration, production REO (6) for full validation | +| REO Phase 4 | 7-8 | Emergency ops, UI/subgraph verification | +| Wrap-up | — | Results review, cleanup checklist, mainnet readiness assessment | + +--- + +## Execution Notes + +### Roles needed + +Testing requires access to three roles on the REO contract. On Arbitrum Sepolia: + +| Role | Needed for | Current holder | +| ------------- | --------------------------------------------------------- | ------------------------------------------------------------- | +| OPERATOR_ROLE | Enable/disable validation, set periods, grant ORACLE_ROLE | NetworkOperator: `0xade6b8eb69a49b56929c1d4f4b428d791861db6f` | +| ORACLE_ROLE | Renew indexer eligibility | Not yet assigned -- must be granted in Cycle 3 | +| PAUSE_ROLE | Pause/unpause (Cycle 8) | Check with `reo:status` | + +The tester needs the NetworkOperator key (or governance access) to execute Cycles 3-5 and 8. If the tester doesn't hold OPERATOR_ROLE directly, the Hardhat tasks generate governance TX files for Safe multisig execution. + +### Advance planning for Cycle 6 + +Cycle 6 tests reward integration with live indexers. These tests take multiple epochs (~110 minutes each on Sepolia) and require allocations that were opened **before** validation was enabled. Plan ahead: + +1. During **Cycle 2** (validation still disabled): open allocations for at least two indexers on rewarded deployments -- one that will be renewed (for test 6.1) and one that will NOT be renewed (for test 6.2) +2. These allocations need to mature for 2-3 epochs before they can be closed in Cycle 6 +3. When you enable validation in **Cycle 4**, the non-renewed indexer becomes ineligible while their allocation is still open -- this is the setup for test 6.2 + +### Parameter changes during testing + +Tests 4.4, 5.1, and 8.1 temporarily modify live parameters (eligibility period, oracle timeout, pause state). Each test includes a restore step. If a session is interrupted: + +```bash +# Verify and restore defaults +npx hardhat reo:status --network arbitrumSepolia + +# If needed, restore manually (as operator): +cast send "setEligibilityPeriod(uint256)" 1209600 --rpc-url --private-key +cast send "setOracleUpdateTimeout(uint256)" 604800 --rpc-url --private-key +cast send "unpause()" --rpc-url --private-key +``` + +--- + +## Test Sequence Overview + +| Cycle | Area | Tests | Notes | +| ----- | ------------------------------------------------ | ----------- | -------------------------------------------- | +| 1 | Deployment Verification | 1.1 - 1.5 | Read-only, no role access needed | +| 2 | Eligibility: Default State (Validation Disabled) | 2.1 - 2.3 | Open allocations here for Cycle 6 | +| 3 | Oracle Operations | 3.1 - 3.5 | Requires OPERATOR_ROLE + ORACLE_ROLE | +| 4 | Eligibility: Validation Enabled | 4.1 - 4.4 | Requires OPERATOR_ROLE; 4.4 changes params | +| 5 | Eligibility: Timeout Fail-Open | 5.1 - 5.2 | Requires OPERATOR_ROLE; 5.1 changes params | +| 6 | Integration with Rewards | 6.1 - 6.6 | Requires mature allocations from Cycle 2 | +| 6m | Integration with Rewards (Mock REO) | 6.1m - 6.5m | Uses mock REO for direct eligibility control | +| 7 | Emergency Operations | 7.1 - 7.3 | Requires PAUSE_ROLE; changes live state | +| 8 | UI and Subgraph Verification | 8.1 - 8.3 | Coordinate with Explorer and subgraph teams | + +--- + +## Cycle 1: Deployment Verification + +> Tests 1.2, 1.3, and 1.5 can be checked in one step with `npx hardhat reo:status --network arbitrumSepolia`, which displays role holders, configuration, and contract state. The individual `cast` commands below are useful for scripted or more granular verification. + +### 1.1 Verify proxy and implementation + +**Objective**: Confirm the REO proxy points to the correct implementation and bytecode matches expectations. + +**Steps**: + +1. Query the proxy's implementation address +2. Compare deployed bytecode hash against expected artifact + +```bash +# Get implementation address from proxy admin +cast call "getProxyImplementation(address)" --rpc-url + +# Get deployed bytecode hash +cast keccak $(cast code --rpc-url ) +``` + +**Pass Criteria**: + +- Implementation address matches address book (`0x4eb1de98440a39339817bdeeb3b3fff410b0b924` on Sepolia) +- Bytecode hash matches expected artifact hash + +--- + +### 1.2 Verify role assignments + +**Objective**: Confirm the correct accounts hold each role and the deployer has been removed. + +**Steps**: + +```bash +# Role constants +GOVERNOR_ROLE=0x0000... # DEFAULT_ADMIN_ROLE = 0x00 +OPERATOR_ROLE=$(cast keccak "OPERATOR_ROLE") +ORACLE_ROLE=$(cast keccak "ORACLE_ROLE") +PAUSE_ROLE=$(cast keccak "PAUSE_ROLE") + +# Check role assignments +cast call "hasRole(bytes32,address)(bool)" $GOVERNOR_ROLE --rpc-url +cast call "hasRole(bytes32,address)(bool)" $OPERATOR_ROLE --rpc-url +cast call "hasRole(bytes32,address)(bool)" $PAUSE_ROLE --rpc-url + +# Verify deployer does NOT have governor role +cast call "hasRole(bytes32,address)(bool)" $GOVERNOR_ROLE --rpc-url +``` + +**Pass Criteria**: + +- Governor address has GOVERNOR_ROLE: `true` +- Operator address has OPERATOR_ROLE: `true` +- Pause guardian has PAUSE_ROLE: `true` +- Deployer does NOT have GOVERNOR_ROLE: `false` + +--- + +### 1.3 Verify default parameters + +**Objective**: Confirm the REO is deployed with expected default configuration. + +**Steps**: + +```bash +cast call "getEligibilityPeriod()(uint256)" --rpc-url +cast call "getOracleUpdateTimeout()(uint256)" --rpc-url +cast call "getEligibilityValidation()(bool)" --rpc-url +cast call "getLastOracleUpdateTime()(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- `eligibilityPeriod` = `1209600` (14 days in seconds) +- `oracleUpdateTimeout` = `604800` (7 days in seconds) +- `eligibilityValidation` = `false` (disabled by default) +- `lastOracleUpdateTime` = `0` (no oracle updates yet) or reflects actual oracle activity + +--- + +### 1.4 Verify RewardsManager integration + +**Objective**: Confirm the RewardsManager is configured to use the REO for eligibility checks. + +**Steps**: + +```bash +cast call "getRewardsEligibilityOracle()(address)" --rpc-url +``` + +**Pass Criteria**: + +- Returns the REO proxy address + +--- + +### 1.5 Verify contract is not paused + +**Objective**: Confirm the REO is operational. + +**Steps**: + +```bash +cast call "paused()(bool)" --rpc-url +``` + +**Pass Criteria**: + +- Returns `false` + +--- + +## Cycle 2: Eligibility -- Default State (Validation Disabled) + +### 2.1 All indexers eligible when validation disabled + +**Objective**: With validation disabled (default), every indexer should be eligible regardless of renewal status. + +**Steps**: + +1. Confirm validation is disabled +2. Check eligibility for a known indexer +3. Check eligibility for a random address that has never been renewed + +```bash +# Confirm validation disabled +cast call "getEligibilityValidation()(bool)" --rpc-url + +# Known indexer +cast call "isEligible(address)(bool)" --rpc-url + +# Random/never-renewed address +cast call "isEligible(address)(bool)" 0x0000000000000000000000000000000000000001 --rpc-url +``` + +**Pass Criteria**: + +- `getEligibilityValidation()` = `false` +- Both addresses return `isEligible` = `true` + +--- + +### 2.2 Indexer with no renewal history is eligible + +**Objective**: Confirm that an indexer with zero renewal timestamp is still eligible when validation is disabled. + +**Steps**: + +```bash +cast call "getEligibilityRenewalTime(address)(uint256)" --rpc-url +cast call "isEligible(address)(bool)" --rpc-url +``` + +**Pass Criteria**: + +- `getEligibilityRenewalTime` = `0` +- `isEligible` = `true` + +--- + +### 2.3 Rewards still flow with validation disabled + +**Objective**: Confirm the baseline rewards flow is unaffected by the REO when validation is off. + +**Prerequisites**: Indexer has an active allocation on a rewarded deployment, open for at least 2 epochs. This should already exist from running [Baseline Cycle 4](./BaselineTestPlan.md#cycle-4-allocation-management). + +> **Cross-reference**: The allocations opened here (and in [Baseline Cycles 4-5](./BaselineTestPlan.md#cycle-4-allocation-management)) serve as setup for [Cycle 6](#cycle-6-integration-with-rewards) reward integration tests. Open extra allocations now for the indexers you plan to cycle through eligibility states. + +**Steps**: Close the allocation per [Baseline 5.2](./BaselineTestPlan.md#52-close-allocation-and-collect-indexing-rewards) and verify rewards. + +> **Advance setup for Cycle 6**: Before moving to Cycle 3, open allocations for the indexers you plan to use in Cycle 6. You need at least: +> +> - One allocation for a **renewed** indexer (test 6.1 -- will receive rewards) +> - One allocation for a **non-renewed** indexer (test 6.2 -- will be denied rewards) +> +> These allocations must mature for 2-3 epochs before Cycle 6. Since validation is still disabled, both will accrue potential rewards. Use [Baseline 4.2](./BaselineTestPlan.md#42-create-allocation-manually) to create them. + +**Pass Criteria**: + +- Indexing rewards are non-zero on allocation closure +- No change in behavior from baseline + +--- + +## Cycle 3: Oracle Operations + +### 3.1 Grant oracle role + +**Objective**: Verify an operator can grant ORACLE_ROLE to an oracle address. + +**Prerequisites**: Transaction signed by OPERATOR_ROLE holder. + +**Steps**: + +```bash +# Grant oracle role (as operator) +cast send "grantRole(bytes32,address)" $ORACLE_ROLE --rpc-url --private-key + +# Verify +cast call "hasRole(bytes32,address)(bool)" $ORACLE_ROLE --rpc-url +``` + +**Pass Criteria**: + +- Transaction succeeds +- `hasRole` returns `true` for the oracle address + +--- + +### 3.2 Renew single indexer eligibility + +**Objective**: Verify an oracle can renew eligibility for a single indexer. + +**Prerequisites**: Caller has ORACLE_ROLE. + +**Steps**: + +```bash +# Renew eligibility for one indexer +cast send "renewIndexerEligibility(address[],bytes)" "[]" "0x" --rpc-url --private-key + +# Check renewal timestamp +cast call "getEligibilityRenewalTime(address)(uint256)" --rpc-url + +# Check last oracle update time +cast call "getLastOracleUpdateTime()(uint256)" --rpc-url +``` + +**Verification**: Check for emitted events: + +- `IndexerEligibilityRenewed(indexer, oracle)` +- `IndexerEligibilityData(oracle, data)` + +**Pass Criteria**: + +- Transaction succeeds, returns count `1` +- `getEligibilityRenewalTime` is approximately `block.timestamp` of the renewal tx +- `lastOracleUpdateTime` updated to the same timestamp +- Events emitted correctly + +--- + +### 3.3 Renew multiple indexers in batch + +**Objective**: Verify batch renewal works correctly. + +**Steps**: + +```bash +cast send "renewIndexerEligibility(address[],bytes)" "[,,]" "0x" --rpc-url --private-key +``` + +**Verification**: Check renewal timestamps for all three indexers. + +**Pass Criteria**: + +- Transaction succeeds, returns count `3` +- All three indexers have updated renewal timestamps +- One `IndexerEligibilityRenewed` event per indexer + +--- + +### 3.4 Zero addresses skipped in renewal + +**Objective**: Verify zero addresses in the renewal array are silently skipped. + +**Steps**: + +```bash +cast send "renewIndexerEligibility(address[],bytes)" "[0x0000000000000000000000000000000000000000,]" "0x" --rpc-url --private-key +``` + +**Pass Criteria**: + +- Transaction succeeds, returns count `1` (not 2) +- Only the non-zero indexer has a `IndexerEligibilityRenewed` event + +--- + +### 3.5 Unauthorized renewal reverts + +**Objective**: Verify that accounts without ORACLE_ROLE cannot renew eligibility. + +**Steps**: + +```bash +# Attempt renewal from a non-oracle account +cast send "renewIndexerEligibility(address[],bytes)" "[]" "0x" --rpc-url --private-key +``` + +**Pass Criteria**: + +- Transaction reverts with AccessControl error + +--- + +## Cycle 4: Eligibility -- Validation Enabled + +### 4.1 Enable eligibility validation + +**Objective**: Verify an operator can enable validation, switching from "all eligible" to oracle-based eligibility. + +**Prerequisites**: OPERATOR_ROLE holder. Some indexers should have been renewed (Cycle 3), others not. + +> **Before enabling**: Confirm the allocations you opened during Cycle 2 for Cycle 6 testing are still active. Once validation is enabled, any non-renewed indexer with an open allocation becomes ineligible for rewards -- this is the intended setup for test 6.2. + +**Steps**: + +```bash +# Enable validation (alternative: npx hardhat reo:enable --network arbitrumSepolia) +cast send "setEligibilityValidation(bool)" true --rpc-url --private-key + +# Verify +cast call "getEligibilityValidation()(bool)" --rpc-url +``` + +**Verification**: Check for `EligibilityValidationUpdated(true)` event. + +**Pass Criteria**: + +- Transaction succeeds +- `getEligibilityValidation()` = `true` + +--- + +### 4.2 Renewed indexer is eligible + +**Objective**: After enabling validation, a recently renewed indexer should still be eligible. + +**Prerequisites**: Indexer was renewed in Cycle 3. Validation is enabled (4.1). + +**Steps**: + +```bash +cast call "isEligible(address)(bool)" --rpc-url +cast call "getEligibilityRenewalTime(address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- `isEligible` = `true` +- `getEligibilityRenewalTime` is within the last `eligibilityPeriod` (14 days) + +--- + +### 4.3 Non-renewed indexer is NOT eligible + +**Objective**: An indexer that was never renewed should be ineligible when validation is enabled. + +**Steps**: + +```bash +cast call "isEligible(address)(bool)" --rpc-url +cast call "getEligibilityRenewalTime(address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- `isEligible` = `false` +- `getEligibilityRenewalTime` = `0` + +--- + +### 4.4 Eligibility expires after period + +**Objective**: Verify that an indexer's eligibility expires when the eligibility period has passed since their last renewal. + +**Approach**: This is easiest to test by temporarily reducing the eligibility period to a short duration. + +**Steps**: + +1. Renew an indexer's eligibility +2. Reduce eligibility period to a short value (e.g., 60 seconds) +3. Wait for the period to elapse +4. Check eligibility + +```bash +# Renew indexer +cast send "renewIndexerEligibility(address[],bytes)" "[]" "0x" --rpc-url --private-key + +# Reduce period to 60 seconds (as operator) +cast send "setEligibilityPeriod(uint256)" 60 --rpc-url --private-key + +# Immediately check -- should still be eligible +cast call "isEligible(address)(bool)" --rpc-url + +# Wait 60+ seconds, then check again +sleep 65 +cast call "isEligible(address)(bool)" --rpc-url + +# IMPORTANT: Restore eligibility period to default +cast send "setEligibilityPeriod(uint256)" 1209600 --rpc-url --private-key +``` + +**Pass Criteria**: + +- First check (immediately after renewal): `isEligible` = `true` +- Second check (after period elapsed): `isEligible` = `false` +- Eligibility period restored to default + +--- + +## Cycle 5: Eligibility -- Timeout Fail-Open + +### 5.1 Oracle timeout makes all indexers eligible + +**Objective**: Verify the fail-open mechanism: if no oracle updates occur for longer than `oracleUpdateTimeout`, all indexers become eligible. + +**Approach**: Reduce the oracle timeout to a short duration and wait. + +**Prerequisites**: Validation enabled (4.1). At least one indexer is NOT renewed (should be ineligible). + +**Steps**: + +```bash +# Confirm non-renewed indexer is currently ineligible +cast call "isEligible(address)(bool)" --rpc-url +# Expected: false + +# Reduce oracle timeout to 60 seconds (as operator) +cast send "setOracleUpdateTimeout(uint256)" 60 --rpc-url --private-key + +# Wait for timeout to elapse +sleep 65 + +# Check -- should now be eligible due to fail-open +cast call "isEligible(address)(bool)" --rpc-url + +# IMPORTANT: Restore oracle timeout to default +cast send "setOracleUpdateTimeout(uint256)" 604800 --rpc-url --private-key +``` + +**Pass Criteria**: + +- Before timeout: `isEligible` = `false` +- After timeout: `isEligible` = `true` +- Timeout restored to default + +--- + +### 5.2 Oracle renewal resets timeout + +**Objective**: Verify that an oracle renewal resets the `lastOracleUpdateTime`, closing the fail-open window. + +**Steps**: + +```bash +# Record current lastOracleUpdateTime +cast call "getLastOracleUpdateTime()(uint256)" --rpc-url + +# Renew any indexer +cast send "renewIndexerEligibility(address[],bytes)" "[]" "0x" --rpc-url --private-key + +# Check lastOracleUpdateTime again +cast call "getLastOracleUpdateTime()(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- `lastOracleUpdateTime` updated to the block timestamp of the renewal transaction + +--- + +## Cycle 6: Integration with Rewards + +These tests verify the end-to-end interaction between the REO and the rewards system using live indexers. + +> **Timing**: These tests require allocations that have been open for 2-3 epochs (~3.5-5.5 hours on Sepolia). The allocations should have been opened during Cycle 2, before validation was enabled. If they weren't, you'll need to open them now and wait before proceeding. Cycles 7 and 8 can be run while waiting. + +### Mock REO Quick-Test Path + +A `MockRewardsEligibilityOracle` is deployed at `0x5FB23365F8cf643D5f1459E9793EfF7254522400` on Arbitrum Sepolia. This provides direct, instant control over eligibility without oracle roles, renewal periods, or timeout logic. Use it for faster iteration on the Cycle 6 integration tests. + +**How the mock works**: Everyone starts eligible. Indexers call `setEligible(false)` from their own address to become ineligible, and `setEligible(true)` to restore eligibility. No roles or expiry -- just a toggle. + +**Setup**: Point RewardsManager at the mock (requires Governor): + +```bash +MOCK_REO=0x5FB23365F8cf643D5f1459E9793EfF7254522400 + +# Point RewardsManager to mock REO +cast send $REWARDS_MANAGER "setRewardsEligibilityOracle(address)" $MOCK_REO \ + --rpc-url $RPC --private-key $GOVERNOR_KEY + +# Verify +cast call $REWARDS_MANAGER "getRewardsEligibilityOracle()(address)" --rpc-url $RPC +# Expected: 0x5FB23365F8cf643D5f1459E9793EfF7254522400 +``` + +**Control eligibility**: + +```bash +# Query eligibility for any address +cast call $MOCK_REO "isEligible(address)(bool)" --rpc-url $RPC + +# Make yourself ineligible (signed by the indexer) +cast send $MOCK_REO "setEligible(bool)" false --rpc-url $RPC --private-key $INDEXER_KEY + +# Restore eligibility +cast send $MOCK_REO "setEligible(bool)" true --rpc-url $RPC --private-key $INDEXER_KEY +``` + +**After testing**: Restore the production REO on RewardsManager: + +```bash +cast send $REWARDS_MANAGER "setRewardsEligibilityOracle(address)" 0x62c2305739cc75f19a3a6d52387ceb3690d99a99 \ + --rpc-url $RPC --private-key $GOVERNOR_KEY +``` + +> The mock-based tests below (6.1m-6.5m) are equivalents of tests 6.1-6.5 using the mock for eligibility control. They can be run instead of or in addition to the production REO tests. The mock path eliminates time-dependent waits and simplifies the setup, making it the recommended approach for initial integration validation. + +### 6.1 Eligible indexer receives indexing rewards + +**Objective**: Confirm that a renewed (eligible) indexer receives rewards when closing an allocation. + +**Prerequisites**: Validation enabled (Cycle 4). Indexer renewed by oracle (Cycle 3). Indexer has an active allocation open for several epochs on a rewarded deployment (opened during Cycle 2). + +**Steps**: + +1. Confirm eligibility: `isEligible(indexer)` = `true` +2. Close allocation per [Baseline 5.2](./BaselineTestPlan.md#52-close-allocation-and-collect-indexing-rewards) +3. Check rewards + +**Verification Query**: + +```graphql +{ + allocations(where: { id: "ALLOCATION_ID" }) { + id + status + indexingRewards + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- `indexingRewards` is non-zero +- Rewards amount is consistent with allocation size and epoch duration + +--- + +### 6.2 Ineligible indexer denied rewards + +**Objective**: Confirm that a non-renewed (ineligible) indexer receives zero rewards when closing an allocation. + +**Prerequisites**: Validation enabled (Cycle 4). Indexer has NOT been renewed by the oracle. Indexer has an active allocation on a rewarded deployment that was opened during Cycle 2 (before validation was enabled). + +**Steps**: + +1. Confirm ineligibility: `isEligible(indexer)` = `false` +2. Close allocation +3. Check rewards + +**Pass Criteria**: + +- `indexingRewards` = `0` +- Allocation still transitions to `Closed` status (closure succeeds, just no rewards) + +--- + +### 6.3 Reclaimed rewards flow to reclaim contract + +**Objective**: When an ineligible indexer is denied rewards, verify the denied rewards are routed to the `ReclaimedRewards` contract (default reclaim address). + +**Prerequisites**: Same as 6.2. + +**Steps**: + +1. Close allocation for ineligible indexer +2. Check the reclaim contract balance or events + +```bash +# Check for RewardsDeniedDueToEligibility event on RewardsManager +# (implementation detail -- exact event name may vary) +cast logs --from-block --to-block --address --rpc-url +``` + +**Pass Criteria**: + +- Denied rewards event emitted +- Reclaim contract receives the tokens that would have been the indexer's rewards + +--- + +### 6.4 Re-renewal restores reward eligibility + +**Objective**: After an indexer's eligibility expires and they are denied rewards, verify that a new oracle renewal restores their ability to earn rewards. + +> **Timing**: This test requires opening a new allocation and waiting 2-3 epochs (~3.5-5.5 hours). It can be run as the final validation step, or skipped on testnet if time is constrained and covered by the combination of 6.2 + Cycle 3 (which together demonstrate the renewal mechanism works). + +**Steps**: + +1. Confirm indexer is currently ineligible (the indexer from test 6.2) +2. Renew the indexer via oracle (as in test 3.2) +3. Confirm eligibility restored: `isEligible` = `true` +4. Open new allocation, wait 2-3 epochs, close, check rewards + +**Pass Criteria**: + +- After renewal: `isEligible` = `true` +- New allocation closure yields non-zero `indexingRewards` + +--- + +### 6.5 View functions reflect zero for ineligible indexer + +**Objective**: Verify that RewardsManager view functions do not over-report claimable rewards for an ineligible indexer. Previously, view functions could show unclaimable balances, misleading indexers into thinking they had earned rewards. + +**Prerequisites**: Validation enabled. Indexer is ineligible. Indexer has an active allocation that has been open several epochs. + +**Steps**: + +1. Confirm ineligibility: `isEligible(indexer)` = `false` +2. Query the view function for pending rewards on the allocation + +```bash +# Check pending rewards for an active allocation +cast call "getRewards(bytes32)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Returns `0` (or near-zero), not the full accumulated amount +- This prevents the UI from displaying rewards the indexer cannot actually claim + +--- + +### 6.6 Eligibility denial is optimistic -- full rewards after re-renewal + +**Objective**: Verify that rewards continue accumulating during an ineligible period (optimistic model). After re-renewal, closing the allocation yields the full accumulated amount including epochs where the indexer was ineligible. This differs from subgraph denial, which permanently stops accumulation. + +**Prerequisites**: Indexer has an active allocation open for several epochs. Indexer was eligible when allocation was opened. + +**Steps**: + +1. Confirm indexer is currently eligible with an active allocation +2. Let eligibility expire (or reduce eligibility period as in test 4.4) +3. Confirm `isEligible(indexer)` = `false` +4. Wait 1-2 additional epochs while ineligible +5. Re-renew the indexer via oracle +6. Confirm `isEligible(indexer)` = `true` +7. Close allocation and check rewards + +**Pass Criteria**: + +- `indexingRewards` reflects the full allocation lifetime (eligible + ineligible epochs) +- Amount is comparable to what a continuously-eligible indexer would earn for the same period +- Temporary ineligibility does not cause permanent reward loss + +--- + +### Mock-Based Integration Tests (6.1m - 6.5m) + +These tests use the `MockRewardsEligibilityOracle` at `0x5FB23365F8cf643D5f1459E9793EfF7254522400` for direct eligibility control. See [Mock REO Quick-Test Path](#mock-reo-quick-test-path) above for setup. + +**Prerequisites**: RewardsManager pointed at the mock REO. Indexer has active allocations open for at least 1 epoch. + +#### 6.1m Eligible indexer receives rewards (mock) + +**Objective**: Confirm that an eligible indexer receives rewards when closing an allocation. + +**Steps**: + +```bash +MOCK_REO=0x5FB23365F8cf643D5f1459E9793EfF7254522400 + +# Confirm eligible (default state) +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: true + +# Close allocation +graph indexer actions queue close +graph indexer actions approve +``` + +**Pass Criteria**: + +- `indexingRewards` is non-zero + +--- + +#### 6.2m Ineligible indexer denied rewards (mock) + +**Objective**: Confirm that toggling eligibility off causes reward denial. + +**Steps**: + +```bash +# Make indexer ineligible +cast send $MOCK_REO "setEligible(bool)" false --rpc-url $RPC --private-key $INDEXER_KEY + +# Confirm +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: false + +# Close allocation +graph indexer actions queue close +graph indexer actions approve +``` + +**Pass Criteria**: + +- `indexingRewards` = `0` +- Allocation still transitions to `Closed` status + +--- + +#### 6.3m Reclaimed rewards flow to reclaim contract (mock) + +**Objective**: When the mock makes an indexer ineligible, denied rewards are routed to the reclaim contract. + +**Prerequisites**: Indexer set to ineligible via mock (6.2m). + +**Steps**: + +```bash +# Check for denial event on the close transaction from 6.2m +cast logs --from-block --to-block --address $REWARDS_MANAGER --rpc-url $RPC +``` + +**Pass Criteria**: + +- Denied rewards event emitted +- Reclaim contract receives the denied tokens + +--- + +#### 6.4m View functions reflect zero for ineligible indexer (mock) + +**Objective**: Verify pending rewards show zero while ineligible. + +**Prerequisites**: Indexer ineligible via mock. Active allocation open for several epochs. + +**Steps**: + +```bash +# Confirm ineligible +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: false + +# Check pending rewards +cast call $REWARDS_MANAGER "getRewards(bytes32)(uint256)" --rpc-url $RPC +``` + +**Pass Criteria**: + +- Returns `0` (or near-zero), not the full accumulated amount + +--- + +#### 6.5m Optimistic recovery -- full rewards after re-enabling (mock) + +**Objective**: Verify the optimistic model: toggle ineligible, wait, toggle back, and confirm full rewards on close. + +**Steps**: + +```bash +# Ensure indexer has an active allocation open across multiple epochs + +# 1. Toggle ineligible +cast send $MOCK_REO "setEligible(bool)" false --rpc-url $RPC --private-key $INDEXER_KEY +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: false + +# 2. Wait 1-2 epochs while ineligible (~110-220 min on Sepolia) + +# 3. Toggle eligible again +cast send $MOCK_REO "setEligible(bool)" true --rpc-url $RPC --private-key $INDEXER_KEY +cast call $MOCK_REO "isEligible(address)(bool)" $INDEXER --rpc-url $RPC +# Expected: true + +# 4. Close allocation +graph indexer actions queue close +graph indexer actions approve +``` + +**Pass Criteria**: + +- `indexingRewards` reflects the full allocation lifetime (eligible + ineligible epochs) +- Temporary ineligibility does not cause permanent reward loss +- Compare with 6.1m: this allocation was open longer and should have proportionally more rewards + +--- + +## Cycle 7: Emergency Operations + +### 7.1 Pause REO + +**Objective**: Verify the pause guardian can pause the REO. + +**Prerequisites**: Caller has PAUSE_ROLE. + +**Steps**: + +```bash +# Pause +cast send "pause()" --rpc-url --private-key + +# Verify paused +cast call "paused()(bool)" --rpc-url + +# View functions should still work +cast call "isEligible(address)(bool)" --rpc-url + +# IMPORTANT: Unpause when done +cast send "unpause()" --rpc-url --private-key +``` + +**Pass Criteria**: + +- Pause succeeds, `paused()` = `true` +- View functions (`isEligible`) still return results +- Oracle write operations (`renewIndexerEligibility`) revert while paused +- Unpause succeeds, `paused()` = `false` + +--- + +### 7.2 Disable eligibility validation (emergency override) + +**Objective**: Verify an operator can disable validation to immediately make all indexers eligible. + +**Steps**: + +```bash +# Disable validation (alternative: npx hardhat reo:disable --network arbitrumSepolia) +cast send "setEligibilityValidation(bool)" false --rpc-url --private-key + +# Previously ineligible indexer should now be eligible +cast call "isEligible(address)(bool)" --rpc-url +``` + +**Pass Criteria**: + +- Transaction succeeds +- All indexers return `isEligible` = `true` + +--- + +### 7.3 Access control prevents unauthorized configuration + +**Objective**: Verify that only authorized roles can perform privileged operations. + +**Steps** (all should revert): + +```bash +# Non-operator tries to set eligibility period +cast send "setEligibilityPeriod(uint256)" 100 --rpc-url --private-key + +# Non-operator tries to enable validation +cast send "setEligibilityValidation(bool)" true --rpc-url --private-key + +# Non-pause-role tries to pause +cast send "pause()" --rpc-url --private-key +``` + +**Pass Criteria**: + +- All three transactions revert with AccessControl errors + +--- + +## Cycle 8: UI and Subgraph Verification + +These tests verify that the Graph Explorer and network subgraph correctly reflect eligibility states and denial scenarios. Run these in coordination with the Explorer and subgraph teams. + +### 8.1 Explorer displays correct rewards during denial + +**Objective**: Verify that the Graph Explorer does not show incorrect indexing reward amounts when an indexer is ineligible and claims are denied. + +**Prerequisites**: At least one indexer is ineligible with an active allocation. Explorer team monitoring. + +**Steps**: + +1. Open Explorer to the ineligible indexer's profile +2. Check displayed pending rewards for active allocations +3. Close allocation (will be denied rewards) +4. Verify Explorer updates to reflect the actual outcome (zero rewards) + +**Pass Criteria**: + +- Explorer does not display inflated or false pending rewards for ineligible indexers +- After allocation closure with denial, Explorer shows `0` indexing rewards for that allocation +- No discrepancy between on-chain state and Explorer display + +--- + +### 8.2 Network subgraph reflects eligibility transitions + +**Objective**: Verify the network subgraph correctly indexes eligibility renewal events and displays accurate stake/delegation amounts through state transitions. + +**Steps**: + +1. Renew indexer eligibility via oracle +2. Query network subgraph for the indexer +3. Let eligibility expire +4. Query again and compare + +```graphql +{ + indexers(where: { id: "INDEXER_ADDRESS" }) { + id + stakedTokens + delegatedTokens + allocatedTokens + rewardsEarned + } +} +``` + +**Pass Criteria**: + +- `stakedTokens` and `delegatedTokens` remain accurate regardless of eligibility state +- Subgraph does not show incorrect amounts during eligibility transitions +- No indexing errors in the subgraph during REO-related transactions + +--- + +### 8.3 Denied transaction appears correct in Explorer history + +**Objective**: When an ineligible indexer closes an allocation and rewards are denied, the transaction should not appear "successful" in a way that misleads the indexer. + +**Steps**: + +1. Close allocation for an ineligible indexer +2. Check the transaction in Explorer's history view +3. Verify the displayed outcome matches reality (0 rewards) + +**Pass Criteria**: + +- Transaction status is clear (not misleadingly shown as a successful reward claim) +- Reward amount displayed is `0` or clearly indicates denial +- Explorer team confirms no confusing UX for the indexer + +--- + +## Post-Testing Cleanup Checklist + +Run `npx hardhat reo:status --network arbitrumSepolia` to verify. Ensure the REO is left in the expected state: + +- [ ] `eligibilityValidation` set to intended value (disabled or enabled per rollout plan) +- [ ] `eligibilityPeriod` = `1209600` (14 days) +- [ ] `oracleUpdateTimeout` = `604800` (7 days) +- [ ] Contract is NOT paused +- [ ] Oracle roles assigned to intended oracle addresses only +- [ ] No test accounts retain elevated roles +- [ ] If mock REO was used: RewardsManager points back to the production REO (`0x62c2305739cc75f19a3a6d52387ceb3690d99a99`) + +--- + +## Monitoring Checklist + +After the upgrade is live, continuously monitor: + +- [ ] `IndexerEligibilityRenewed` events flowing regularly from oracles +- [ ] `lastOracleUpdateTime` advancing (oracles are active) +- [ ] No `RewardsDeniedDueToEligibility` events for indexers that should be eligible +- [ ] Epoch progression and total rewards issuance unchanged from pre-upgrade baseline + +--- + +## Related Documentation + +- [← Back to REO Testing](README.md) +- [BaselineTestPlan.md](BaselineTestPlan.md) - Baseline operational tests (run first) + +--- + +_Derived from REO contract specification and audit reports. Source contracts: `/packages/issuance/contracts/eligibility/`_ diff --git a/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md b/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md new file mode 100644 index 000000000..b665e0b58 --- /dev/null +++ b/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md @@ -0,0 +1,781 @@ +# Rewards Conditions Test Plan + +> **Status: Complete** — Local network automation validates Cycles 1-4 and 6. Cycles 5 (resize) and 7 (zero signal) need testnet or special setup. +> +> **Navigation**: [← Back to REO Testing](README.md) | [BaselineTestPlan](BaselineTestPlan.md) | [SubgraphDenialTestPlan](SubgraphDenialTestPlan.md) + +Tests for the reclaim system, signal-related conditions, POI presentation paths, allocation lifecycle changes, and observability improvements introduced in the issuance upgrade. + +These tests cover all reward conditions **except** `INDEXER_INELIGIBLE` (covered by [ReoTestPlan](ReoTestPlan.md)) and `SUBGRAPH_DENIED` (covered by [SubgraphDenialTestPlan](SubgraphDenialTestPlan.md)). + +> All contract reads use `cast call`. All addresses must be **lowercase**. Replace placeholder addresses with actual deployed addresses for your network. + +## Contract Addresses + +| Contract | Arbitrum Sepolia | Arbitrum One | +| ----------------------- | -------------------------------------------- | -------------------------------------------- | +| RewardsManager (proxy) | `0x1f49cae7669086c8ba53cc35d1e9f80176d67e79` | `0x971b9d3d0ae3eca029cab5ea1fb0f72c85e6a525` | +| SubgraphService (proxy) | `0xc24a3dac5d06d771f657a48b20ce1a671b78f26b` | `0xb2bb92d0de618878e438b55d5846cfecd9301105` | +| GraphToken (L2) | `0xf8c05dcf59e8b28bfd5eed176c562bebcfc7ac04` | `0x9623063377ad1b27544c965ccd7342f7ea7e88c7` | +| Controller | `0x9db3ee191681f092607035d9bda6e59fbeaca695` | `0x0a8491544221dd212964fbb96487467291b2c97e` | + +### RPC + +| Network | RPC URL | +| ---------------- | ---------------------------------------- | +| Arbitrum Sepolia | `https://sepolia-rollup.arbitrum.io/rpc` | + +--- + +## Background + +The issuance upgrade introduces a `RewardsCondition` system that classifies every situation where rewards cannot be distributed normally. Instead of silently dropping undistributable rewards, each condition has a defined handling path: + +- **Reclaim**: Mint to a configured address (per-condition or default fallback) +- **Defer**: Preserve for later collection (snapshot not advanced) + +This test plan validates the reclaim infrastructure, each condition's handling, and the new observability features. + +--- + +## Prerequisites + +- [Baseline tests](BaselineTestPlan.md) Cycles 1-7 pass +- Governor access for reclaim address configuration +- SAO or Governor access for `setMinimumSubgraphSignal()` +- At least two indexers with active allocations +- Access to subgraph deployments with varying signal levels + +--- + +## Test Sequence Overview + +| Cycle | Area | Tests | Notes | +| ----- | ---------------------------- | --------- | -------------------------------------------------- | +| 1 | Reclaim System Configuration | 1.1 - 1.5 | Governor access needed | +| 2 | Below-Minimum Signal | 2.1 - 2.4 | Governor/SAO access; signal threshold changes | +| 3 | Zero Allocated Tokens | 3.1 - 3.3 | Requires subgraph with signal but no allocations | +| 4 | POI Presentation Paths | 4.1 - 4.5 | Requires mature and young allocations | +| 5 | Allocation Lifecycle | 5.1 - 5.3 | Resize and close operations | +| 6 | Observability | 6.1 - 6.3 | Event and view function verification | +| 7 | Zero Global Signal | 7.1 - 7.2 | Difficult on shared testnet; may be unit-test only | + +--- + +## Cycle 1: Reclaim System Configuration + +### 1.1 Configure per-condition reclaim addresses + +**Objective**: Set reclaim addresses for each condition and verify the routing. + +**Steps**: + +```bash +# Compute condition identifiers +NO_SIGNAL=$(cast keccak "NO_SIGNAL") +SUBGRAPH_DENIED=$(cast keccak "SUBGRAPH_DENIED") +BELOW_MINIMUM_SIGNAL=$(cast keccak "BELOW_MINIMUM_SIGNAL") +NO_ALLOCATED_TOKENS=$(cast keccak "NO_ALLOCATED_TOKENS") +STALE_POI=$(cast keccak "STALE_POI") +ZERO_POI=$(cast keccak "ZERO_POI") +CLOSE_ALLOCATION=$(cast keccak "CLOSE_ALLOCATION") +INDEXER_INELIGIBLE=$(cast keccak "INDEXER_INELIGIBLE") + +# Set per-condition reclaim addresses (as Governor) +# Using a single address for simplicity; in production these may differ +cast send "setReclaimAddress(bytes32,address)" $NO_SIGNAL --rpc-url --private-key + +cast send "setReclaimAddress(bytes32,address)" $BELOW_MINIMUM_SIGNAL --rpc-url --private-key + +cast send "setReclaimAddress(bytes32,address)" $NO_ALLOCATED_TOKENS --rpc-url --private-key + +cast send "setReclaimAddress(bytes32,address)" $STALE_POI --rpc-url --private-key + +cast send "setReclaimAddress(bytes32,address)" $ZERO_POI --rpc-url --private-key + +cast send "setReclaimAddress(bytes32,address)" $CLOSE_ALLOCATION --rpc-url --private-key + +# Verify each +cast call "getReclaimAddress(bytes32)(address)" $STALE_POI --rpc-url +cast call "getReclaimAddress(bytes32)(address)" $ZERO_POI --rpc-url +cast call "getReclaimAddress(bytes32)(address)" $CLOSE_ALLOCATION --rpc-url +``` + +**Pass Criteria**: + +- Each `setReclaimAddress` transaction succeeds +- `ReclaimAddressSet` event emitted for each +- `getReclaimAddress()` returns the correct address for each condition + +--- + +### 1.2 Configure default reclaim address + +**Objective**: Set the fallback reclaim address used when no per-condition address is configured. + +**Steps**: + +```bash +# Set default reclaim address (as Governor) +cast send "setDefaultReclaimAddress(address)" --rpc-url --private-key + +# Verify +cast call "getDefaultReclaimAddress()(address)" --rpc-url +``` + +**Pass Criteria**: + +- Transaction succeeds +- `DefaultReclaimAddressSet` event emitted +- `getDefaultReclaimAddress()` returns the configured address + +--- + +### 1.3 Verify fallback routing: unconfigured condition uses default + +**Objective**: A condition with no per-condition address should route to the default address. + +**Steps**: + +```bash +# Use a condition that does NOT have a per-condition address set +# (e.g., skip setting ALTRUISTIC_ALLOCATION in test 1.1) +ALTRUISTIC=$(cast keccak "ALTRUISTIC_ALLOCATION") + +# Verify no per-condition address +cast call "getReclaimAddress(bytes32)(address)" $ALTRUISTIC --rpc-url +# Expected: 0x0000... + +# The default address should catch this (verified by observing reclaim events when triggered) +cast call "getDefaultReclaimAddress()(address)" --rpc-url +``` + +**Pass Criteria**: + +- Per-condition address = `0x0` (not set) +- Default address is configured (non-zero) +- When this condition is triggered, `RewardsReclaimed` event shows tokens going to default address + +--- + +### 1.4 Unauthorized reclaim address change reverts + +**Objective**: Only the Governor can set reclaim addresses. + +**Steps**: + +```bash +# Non-governor attempts to set reclaim address +cast send "setReclaimAddress(bytes32,address)" $STALE_POI --rpc-url --private-key + +# Non-governor attempts to set default reclaim address +cast send "setDefaultReclaimAddress(address)" --rpc-url --private-key +``` + +**Pass Criteria**: + +- Both transactions revert + +--- + +### 1.5 Record baseline balances + +**Objective**: Record GRT balances of all reclaim addresses for comparison during later tests. + +**Steps**: + +```bash +cast call "balanceOf(address)(uint256)" --rpc-url +cast call "balanceOf(address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Balances recorded for comparison + +--- + +## Cycle 2: Below-Minimum Signal + +### 2.1 Verify current minimum signal threshold + +**Objective**: Check the current `minimumSubgraphSignal` value and identify subgraphs near the threshold. + +**Steps**: + +```bash +# Check current threshold +cast call "minimumSubgraphSignal()(uint256)" --rpc-url +``` + +**Verification Query** (find subgraphs near the threshold): + +```graphql +{ + subgraphDeployments(orderBy: signalledTokens, orderDirection: asc, where: { signalledTokens_gt: 0 }) { + ipfsHash + signalledTokens + stakedTokens + indexingRewardAmount + } +} +``` + +**Pass Criteria**: + +- Threshold value known +- At least one subgraph identified that is close to (or can be made to fall below) the threshold + +--- + +### 2.2 Raise threshold to trigger BELOW_MINIMUM_SIGNAL + +**Objective**: Increase `minimumSubgraphSignal` so that a target subgraph falls below the threshold, then verify rewards are reclaimed. + +> **Important**: Before changing the threshold, call `onSubgraphSignalUpdate()` on affected subgraphs to snapshot accumulators under the current rules. This prevents retroactive application over a long period. + +**Steps**: + +```bash +# Record accumulator for target subgraph +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +# Snapshot accumulators before threshold change +cast send "onSubgraphSignalUpdate(bytes32)" --rpc-url --private-key + +# Raise threshold (as Governor or SAO) +cast send "setMinimumSubgraphSignal(uint256)" --rpc-url --private-key + +# Verify threshold changed +cast call "minimumSubgraphSignal()(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Threshold changed successfully +- Target subgraph signal is now below the new threshold + +--- + +### 2.3 Accumulator freezes for below-threshold subgraph + +**Objective**: After the threshold increase, the below-threshold subgraph's accumulators should freeze and new rewards should be reclaimed. + +**Steps**: + +```bash +# Wait some time, then check accumulators +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +# Trigger accumulator update to process reclaim +cast send "onSubgraphSignalUpdate(bytes32)" --rpc-url --private-key + +# Check for RewardsReclaimed events +RECLAIM_EVENT_SIG=$(cast sig-event "RewardsReclaimed(bytes32,uint256,address,address,bytes32)") +cast logs --from-block --to-block latest --address --topic0 $RECLAIM_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- `accRewardsForSubgraph` frozen (not increasing) +- `RewardsReclaimed` event with reason = `BELOW_MINIMUM_SIGNAL` +- Reclaim address balance increased + +--- + +### 2.4 Restore threshold and verify resumption + +**Objective**: Lower the threshold back so the subgraph is above minimum. Accumulators should resume. + +**Steps**: + +```bash +# Snapshot before change +cast send "onSubgraphSignalUpdate(bytes32)" --rpc-url --private-key + +# Restore threshold +cast send "setMinimumSubgraphSignal(uint256)" --rpc-url --private-key + +# Wait, then check accumulators +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Threshold restored to original value +- `accRewardsForSubgraph` resumes increasing +- Allocations on this subgraph can claim rewards again + +--- + +## Cycle 3: Zero Allocated Tokens + +### 3.1 Identify subgraph with signal but no allocations + +**Objective**: Find or create a subgraph deployment that has curation signal but zero allocated tokens. + +**Verification Query**: + +```graphql +{ + subgraphDeployments(where: { signalledTokens_gt: 0, stakedTokens: 0 }) { + ipfsHash + signalledTokens + stakedTokens + } +} +``` + +Alternatively, close all allocations on a test subgraph while leaving signal intact. + +**Pass Criteria**: + +- Subgraph deployment identified with `signalledTokens > 0` and `stakedTokens = 0` + +--- + +### 3.2 Verify NO_ALLOCATED_TOKENS reclaim + +**Objective**: When a subgraph has signal but no allocations, rewards for that signal share are reclaimed as `NO_ALLOCATED_TOKENS`. + +**Steps**: + +```bash +# Trigger accumulator update for the zero-allocation subgraph +cast send "onSubgraphAllocationUpdate(bytes32)" --rpc-url --private-key + +# Check for RewardsReclaimed events +NO_ALLOCATED_TOKENS=$(cast keccak "NO_ALLOCATED_TOKENS") +RECLAIM_EVENT_SIG=$(cast sig-event "RewardsReclaimed(bytes32,uint256,address,address,bytes32)") +cast logs --from-block --to-block --address --topic0 $RECLAIM_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- `RewardsReclaimed` event with reason = `NO_ALLOCATED_TOKENS` +- Reclaim address received tokens + +--- + +### 3.3 Allocations resume from stored baseline + +**Objective**: When a new allocation is created on a subgraph that previously had zero allocations, `accRewardsPerAllocatedToken` resumes from its stored value rather than resetting to zero. + +**Steps**: + +```bash +# Record current accRewardsPerAllocatedToken +cast call "getAccRewardsPerAllocatedToken(bytes32)(uint256,uint256)" --rpc-url + +# Create allocation +graph indexer allocations create + +# Check accRewardsPerAllocatedToken after creation +cast call "getAccRewardsPerAllocatedToken(bytes32)(uint256,uint256)" --rpc-url +``` + +**Pass Criteria**: + +- New allocation created successfully +- `accRewardsPerAllocatedToken` not reset to zero (maintains stored value) +- New allocation starts accruing from current accumulator value + +--- + +## Cycle 4: POI Presentation Paths + +The issuance upgrade introduces three distinct POI presentation outcomes: **claim**, **reclaim**, and **defer**. Each condition routes to one of these paths. + +### 4.1 Normal claim path (NONE condition) + +**Objective**: Verify that a valid POI on a non-denied, signal-above-threshold, non-stale allocation claims rewards normally. The `POIPresented` event should show `condition = bytes32(0)`. + +**Prerequisites**: Active allocation, open 2+ epochs, not stale, on a non-denied subgraph with signal above threshold. + +**Steps**: + +```bash +# Confirm allocation is healthy +cast call "getRewards(address,address)(uint256)" --rpc-url +# Expected: non-zero + +# Close allocation (presents POI and claims) +graph indexer allocations close +``` + +**Verification**: Check transaction for `POIPresented` event: + +```bash +POI_EVENT_SIG=$(cast sig-event "POIPresented(address,address,bytes32,bytes32,bytes,bytes32)") +cast logs --from-block --to-block --address --topic0 $POI_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- `POIPresented` event emitted with `condition = 0x00...00` (NONE) +- `indexingRewards` non-zero +- Normal `HorizonRewardsAssigned` event emitted + +--- + +### 4.2 Reclaim path: STALE_POI + +**Objective**: When an allocation is stale (no POI presented within `maxPOIStaleness`), presenting a POI reclaims rewards instead of claiming them. + +**Prerequisites**: An allocation that has not had a POI presented for longer than `maxPOIStaleness`. + +**Steps**: + +```bash +# Check maxPOIStaleness +cast call "maxPOIStaleness()(uint256)" --rpc-url + +# Find or wait for a stale allocation +# (Let an allocation go without POI presentation for maxPOIStaleness seconds) + +# Close the stale allocation +graph indexer allocations close +``` + +**Pass Criteria**: + +- `POIPresented` event emitted with `condition = keccak256("STALE_POI")` +- `indexingRewards` = 0 (rewards not claimed by indexer) +- `RewardsReclaimed` event with reason = `STALE_POI` +- Reclaim address received the tokens +- Allocation snapshot advanced (pending rewards cleared) + +--- + +### 4.3 Reclaim path: ZERO_POI + +**Objective**: Submitting a zero POI (`bytes32(0)`) reclaims rewards. + +**Prerequisites**: Active allocation, mature (2+ epochs). + +**Steps**: + +```bash +# Close allocation with explicit zero POI +graph indexer allocations close --poi 0x0000000000000000000000000000000000000000000000000000000000000000 +``` + +**Pass Criteria**: + +- `POIPresented` event emitted with `condition = keccak256("ZERO_POI")` +- `indexingRewards` = 0 +- `RewardsReclaimed` event with reason = `ZERO_POI` +- Reclaim address received the tokens +- Allocation snapshot advanced (pending rewards cleared) + +--- + +### 4.4 Defer path: ALLOCATION_TOO_YOUNG + +**Objective**: Presenting a POI for an allocation created in the current epoch defers — returns 0 without advancing the snapshot, preserving rewards for later. + +**Prerequisites**: Create a new allocation and attempt POI presentation in the same epoch. + +**Steps**: + +```bash +# Create allocation +graph indexer allocations create + +# Immediately attempt POI presentation (same epoch) +# (via manual cast send or indexer agent action) +``` + +**Pass Criteria**: + +- `POIPresented` event emitted with `condition = keccak256("ALLOCATION_TOO_YOUNG")` +- Returns 0 rewards +- **Critical**: Allocation snapshot NOT advanced (rewards preserved for later) +- Allocation remains open and healthy +- After waiting for epoch boundary: normal claim succeeds + +--- + +### 4.5 POI presentation always updates timestamp + +**Objective**: Verify that the POI presentation timestamp is recorded regardless of the condition outcome. This means even reclaimed or deferred presentations reset the staleness clock. + +**Steps**: + +1. Present a POI that results in a defer (e.g., too young) +2. Check that the staleness timer reset +3. Present a POI that results in a reclaim (e.g., zero POI) +4. Check that the staleness timer reset + +**Pass Criteria**: + +- Staleness timer resets on every POI presentation, regardless of outcome +- An allocation that regularly presents POIs (even deferred ones) does not become stale + +--- + +## Cycle 5: Allocation Lifecycle + +### 5.1 Allocation resize reclaims stale rewards + +**Objective**: Resizing a stale allocation reclaims pending rewards as `STALE_POI` and clears them. This prevents stale allocations from silently accumulating rewards through repeated resizes. + +**Prerequisites**: An allocation that is stale (no POI for `maxPOIStaleness`). The allocation has pending rewards from before it went stale. + +**Steps**: + +```bash +# Confirm allocation is stale +# (Check last POI timestamp vs maxPOIStaleness) + +# Check pending rewards before resize +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Resize the allocation +graph indexer allocations reallocate +``` + +**Pass Criteria**: + +- `RewardsReclaimed` event with reason = `STALE_POI` +- Pending rewards cleared (not carried forward through resize) +- Reclaim address received the stale rewards +- New allocation starts fresh (no carried-over stale rewards) + +--- + +### 5.2 Allocation resize does NOT reclaim for non-stale allocation + +**Objective**: Resizing a healthy (non-stale) allocation should accumulate pending rewards normally, not reclaim them. + +**Prerequisites**: Active, non-stale allocation with pending rewards. + +**Steps**: + +```bash +# Check pending rewards +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Resize +graph indexer allocations reallocate + +# Check that no STALE_POI reclaim event occurred +``` + +**Pass Criteria**: + +- No `RewardsReclaimed` event with reason = `STALE_POI` +- Pending rewards accumulated into `accRewardsPending` (carried through resize) +- New allocation can claim accumulated rewards on next close + +--- + +### 5.3 Allocation close reclaims uncollected rewards + +**Objective**: When an allocation is closed, any uncollected rewards are reclaimed as `CLOSE_ALLOCATION` before the allocation is finalized. This prevents rewards from being permanently lost on close. + +**Prerequisites**: An allocation with uncollected rewards (e.g., the indexer has not presented a POI recently, or rewards accumulated since last POI). + +**Steps**: + +```bash +# Record reclaim address balance +cast call "balanceOf(address)(uint256)" --rpc-url + +# Close allocation +graph indexer allocations close + +# Check for CLOSE_ALLOCATION reclaim +CLOSE_ALLOC=$(cast keccak "CLOSE_ALLOCATION") +RECLAIM_EVENT_SIG=$(cast sig-event "RewardsReclaimed(bytes32,uint256,address,address,bytes32)") +cast logs --from-block --to-block --address --topic0 $RECLAIM_EVENT_SIG --rpc-url + +# Check reclaim address balance increased +cast call "balanceOf(address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- `RewardsReclaimed` event with reason = `CLOSE_ALLOCATION` +- Reclaim address balance increased +- Rewards not permanently lost (either claimed by indexer via POI or reclaimed to protocol) + +--- + +## Cycle 6: Observability + +### 6.1 POIPresented event emitted on every presentation + +**Objective**: Verify that every POI presentation emits a `POIPresented` event with the determined condition, regardless of outcome. + +**Steps**: + +Collect events across multiple scenarios from previous cycles: + +```bash +POI_EVENT_SIG=$(cast sig-event "POIPresented(address,address,bytes32,bytes32,bytes,bytes32)") + +# Query all POIPresented events from the test session +cast logs --from-block --to-block latest --address --topic0 $POI_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- Every POI presentation (from Cycles 4-5) has a corresponding `POIPresented` event +- Each event contains: + - `indexer`: correct indexer address + - `allocationId`: correct allocation + - `subgraphDeploymentId`: correct deployment + - `poi`: the submitted POI value + - `condition`: matches the expected outcome (NONE, STALE_POI, ZERO_POI, ALLOCATION_TOO_YOUNG, SUBGRAPH_DENIED) + +--- + +### 6.2 RewardsReclaimed events include full context + +**Objective**: Verify that `RewardsReclaimed` events contain all necessary context for off-chain accounting. + +**Steps**: + +```bash +RECLAIM_EVENT_SIG=$(cast sig-event "RewardsReclaimed(bytes32,uint256,address,address,bytes32)") + +# Query all RewardsReclaimed events from the test session +cast logs --from-block --to-block latest --address --topic0 $RECLAIM_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- Each `RewardsReclaimed` event contains: + - `reason`: valid `RewardsCondition` identifier (not zero) + - `amount`: non-zero GRT amount + - `indexer`: address of the affected indexer (or zero for subgraph-level reclaims) + - `allocationID`: address of the affected allocation (or zero for subgraph-level reclaims) + - `subgraphDeploymentID`: deployment hash + +--- + +### 6.3 View functions reflect frozen state accurately + +**Objective**: Verify that `getAccRewardsForSubgraph()`, `getAccRewardsPerAllocatedToken()`, and `getRewards()` correctly return frozen values for non-claimable subgraphs and growing values for claimable ones. + +**Steps**: + +```bash +# For a denied subgraph (if one is still denied from SubgraphDenialTestPlan) +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url +# Wait, read again — should be unchanged + +# For a below-threshold subgraph (if one is still below from Cycle 2) +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url +# Wait, read again — should be unchanged + +# For a healthy subgraph (control) +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url +# Wait, read again — should have increased + +# getRewards for allocation on non-claimable subgraph +cast call "getRewards(address,address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Non-claimable subgraphs: view functions return frozen (non-increasing) values +- Claimable subgraphs: view functions return growing values +- `getRewards()` for allocations on non-claimable subgraphs returns a frozen value +- Pre-existing `accRewardsPending` from prior resizes is still included in `getRewards()` even for non-claimable subgraphs + +--- + +## Cycle 7: Zero Global Signal + +> **Note**: These tests require zero total curation signal across the entire network, which is impractical on a shared testnet. They are documented here for completeness and should be validated via Foundry unit tests or on a dedicated test network. + +### 7.1 NO_SIGNAL detection + +**Objective**: When total curation signal across all subgraphs is zero, issuance during that period should be reclaimed as `NO_SIGNAL`. + +**Steps** (dedicated testnet only): + +```bash +# Remove all curation signal from all subgraphs +# (Only feasible on a private testnet) + +# Wait for blocks to pass (issuance accrues to nobody) + +# Trigger accumulator update +cast send "updateAccRewardsPerSignal()" --rpc-url --private-key + +# Check for RewardsReclaimed with NO_SIGNAL +NO_SIGNAL=$(cast keccak "NO_SIGNAL") +RECLAIM_EVENT_SIG=$(cast sig-event "RewardsReclaimed(bytes32,uint256,address,address,bytes32)") +cast logs --from-block --to-block --address --topic0 $RECLAIM_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- `RewardsReclaimed` event with reason = `NO_SIGNAL` +- Reclaimed amount corresponds to issuance during zero-signal period +- `getNewRewardsPerSignal()` still returns claimable portion only (unchanged from legacy behavior) + +--- + +### 7.2 Signal restoration resumes normal distribution + +**Objective**: After signal is restored, rewards distribution resumes normally. + +**Steps** (dedicated testnet only): + +1. Add curation signal to a subgraph +2. Verify `getNewRewardsPerSignal()` returns non-zero +3. Verify accumulators resume growing + +**Pass Criteria**: + +- Rewards flow normally after signal restoration +- No rewards from the zero-signal period leak into the normal distribution + +--- + +## Post-Testing Checklist + +- [ ] Reclaim addresses verified for all conditions +- [ ] `minimumSubgraphSignal` restored to original value +- [ ] No subgraphs left in unintended denied state +- [ ] Reclaim address balances reconciled with expected amounts +- [ ] All `POIPresented` events collected and categorized +- [ ] Results documented in test tracker + +--- + +## Test Summary + +| Condition | Test(s) | Cycle | Testnet Feasibility | +| ------------------------ | --------- | ----- | ---------------------- | +| Reclaim infrastructure | 1.1 - 1.5 | 1 | Full | +| `BELOW_MINIMUM_SIGNAL` | 2.1 - 2.4 | 2 | Full | +| `NO_ALLOCATED_TOKENS` | 3.1 - 3.3 | 3 | Full | +| `NONE` (normal claim) | 4.1 | 4 | Full | +| `STALE_POI` | 4.2 | 4 | Full (wait needed) | +| `ZERO_POI` | 4.3 | 4 | Full | +| `ALLOCATION_TOO_YOUNG` | 4.4 | 4 | Full | +| POI timestamp behavior | 4.5 | 4 | Full | +| Stale resize reclaim | 5.1 - 5.2 | 5 | Full (wait needed) | +| `CLOSE_ALLOCATION` | 5.3 | 5 | Full | +| `POIPresented` event | 6.1 | 6 | Full | +| `RewardsReclaimed` event | 6.2 | 6 | Full | +| View function freeze | 6.3 | 6 | Full | +| `NO_SIGNAL` | 7.1 - 7.2 | 7 | Dedicated testnet only | + +--- + +## Related Documentation + +- [← Back to REO Testing](README.md) +- [SubgraphDenialTestPlan.md](SubgraphDenialTestPlan.md) — Subgraph denial behavior tests +- [BaselineTestPlan.md](BaselineTestPlan.md) — Baseline operational tests (run first) +- [ReoTestPlan.md](ReoTestPlan.md) — REO eligibility tests + +--- + +_Derived from issuance upgrade behavior changes. Source: [RewardsBehaviourChanges.md](/docs/RewardsBehaviourChanges.md), [RewardConditions.md](/docs/RewardConditions.md). Contracts: `packages/contracts/contracts/rewards/RewardsManager.sol`, `packages/subgraph-service/contracts/utilities/AllocationManager.sol`._ diff --git a/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md b/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md new file mode 100644 index 000000000..cc03a7d7d --- /dev/null +++ b/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md @@ -0,0 +1,680 @@ +# Subgraph Denial Test Plan + +> **Status: Complete** — Local network automation validates Cycles 2, 3, 5, and 6 (edge cases). Cycle 4 (allocation-level deferral) needs direct POI presentation. +> +> **Navigation**: [← Back to REO Testing](README.md) | [BaselineTestPlan](BaselineTestPlan.md) | [RewardsConditionsTestPlan](RewardsConditionsTestPlan.md) + +Tests for the subgraph denial behavior changes introduced in the issuance upgrade. Denial handling changed significantly: accumulators now freeze during denial (reclaiming new rewards), while uncollected pre-denial rewards are preserved and become claimable after undeny. + +> All contract reads use `cast call`. All addresses must be **lowercase**. Replace placeholder addresses with actual deployed addresses for your network. + +## Contract Addresses + +| Contract | Arbitrum Sepolia | Arbitrum One | +| ----------------------- | -------------------------------------------- | -------------------------------------------- | +| RewardsManager (proxy) | `0x1f49cae7669086c8ba53cc35d1e9f80176d67e79` | `0x971b9d3d0ae3eca029cab5ea1fb0f72c85e6a525` | +| SubgraphService (proxy) | `0xc24a3dac5d06d771f657a48b20ce1a671b78f26b` | `0xb2bb92d0de618878e438b55d5846cfecd9301105` | +| GraphToken (L2) | `0xf8c05dcf59e8b28bfd5eed176c562bebcfc7ac04` | `0x9623063377ad1b27544c965ccd7342f7ea7e88c7` | +| Controller | `0x9db3ee191681f092607035d9bda6e59fbeaca695` | `0x0a8491544221dd212964fbb96487467291b2c97e` | + +**Address sources**: `packages/horizon/addresses.json` (RewardsManager, GraphToken, Controller), `packages/subgraph-service/addresses.json` (SubgraphService). + +### RPC + +| Network | RPC URL | +| ---------------- | ---------------------------------------- | +| Arbitrum Sepolia | `https://sepolia-rollup.arbitrum.io/rpc` | + +--- + +## Background + +### What Changed + +**Before (Horizon baseline):** Denial was a binary gate at `takeRewards()` time. When a subgraph was denied, rewards were returned as 0 and the allocation snapshot advanced, permanently dropping those rewards. + +**After (issuance upgrade):** Denial is handled at two levels: + +1. **RewardsManager (accumulator level):** When accumulator updates encounter a denied subgraph, `accRewardsForSubgraph` and `accRewardsPerAllocatedToken` freeze. New rewards during denial are reclaimed instead of accumulated. `setDenied()` snapshots accumulators before changing state so the boundary is clean. + +2. **AllocationManager (claim level):** POI presentation for a denied subgraph is _deferred_ — returns 0 **without advancing the allocation snapshot**. Uncollected pre-denial rewards are preserved and become claimable after undeny. + +### Key Invariants + +- Accumulators never decrease (they freeze during denial, not decrease) +- Pre-denial uncollected rewards are preserved through the deny/undeny cycle +- Denial-period rewards are reclaimed (or dropped if no reclaim address) +- `setDenied()` snapshots accumulators before state change (clean boundary) +- Redundant deny/undeny calls are idempotent (no state change) + +--- + +## Prerequisites + +- [Baseline tests](BaselineTestPlan.md) Cycles 1-7 pass +- [Reclaim system configured](RewardsConditionsTestPlan.md#cycle-1-reclaim-system-configuration) (Cycle 1 of RewardsConditionsTestPlan) — or configure inline during Cycle 1 below +- At least two indexers with active allocations on rewarded subgraph deployments +- Access to the Governor or SubgraphAvailabilityOracle (SAO) account that can call `setDenied()` +- Allocations must be mature (open for 2+ epochs) before denial tests + +### Roles Needed + +| Role | Needed For | Holder | +| --------------- | --------------------------------------------- | -------------------------------- | +| Governor or SAO | `setDenied()` calls | Check Controller configuration | +| Governor | `setReclaimAddress()` (if not yet configured) | Council/NetworkOperator multisig | + +### Identifying the SAO + +```bash +# The SAO is stored in the Controller as the subgraphAvailabilityOracle +# Alternatively, check who can call setDenied on RewardsManager +cast call "getContractProxy(bytes32)(address)" $(cast keccak "SubgraphAvailabilityOracle") --rpc-url +``` + +--- + +## Testing Approach + +**Dedicated test subgraph**: Use a subgraph deployment that is not critical to other testing. The deployment should have: + +- Non-zero curation signal +- At least two active allocations from different indexers +- Signal above `minimumSubgraphSignal` (to isolate denial behavior from signal threshold behavior) + +**Epoch timing**: Many tests require waiting for epoch boundaries. On Sepolia, epochs are ~554 blocks (~110 minutes). Plan sessions accordingly. + +**Reclaim address monitoring**: Before starting, configure a reclaim address for `SUBGRAPH_DENIED` so reclaimed tokens are observable. If no reclaim address is set, denial-period rewards are silently dropped. + +--- + +## Test Sequence Overview + +| Cycle | Area | Tests | Notes | +| ----- | ------------------------------- | --------- | -------------------------------------------------- | +| 1 | Reclaim Setup for Denial | 1.1 - 1.2 | Governor access needed; skip if already configured | +| 2 | Denial State Management | 2.1 - 2.4 | SAO or Governor access needed | +| 3 | Accumulator Freeze Verification | 3.1 - 3.4 | Read-only after denial; wait for epochs | +| 4 | Allocation-Level Deferral | 4.1 - 4.3 | Requires active allocations on denied subgraph | +| 5 | Undeny and Reward Recovery | 5.1 - 5.4 | Full deny→undeny→claim lifecycle | +| 6 | Edge Cases | 6.1 - 6.4 | Advanced scenarios | + +--- + +## Cycle 1: Reclaim Setup for Denial + +> Skip this cycle if reclaim addresses are already configured (verify with tests 1.1 reads). + +### 1.1 Configure SUBGRAPH_DENIED reclaim address + +**Objective**: Set a reclaim address for `SUBGRAPH_DENIED` so that denial-period rewards are minted to a trackable address instead of being silently dropped. + +**Steps**: + +```bash +# Compute the SUBGRAPH_DENIED condition identifier +SUBGRAPH_DENIED=$(cast keccak "SUBGRAPH_DENIED") + +# Check current reclaim address (expect zero if unconfigured) +cast call "getReclaimAddress(bytes32)(address)" $SUBGRAPH_DENIED --rpc-url + +# Set reclaim address (as Governor) +cast send "setReclaimAddress(bytes32,address)" $SUBGRAPH_DENIED --rpc-url --private-key + +# Verify +cast call "getReclaimAddress(bytes32)(address)" $SUBGRAPH_DENIED --rpc-url +``` + +**Pass Criteria**: + +- `ReclaimAddressSet` event emitted with correct reason and address +- `getReclaimAddress(SUBGRAPH_DENIED)` returns the configured address + +--- + +### 1.2 Record reclaim address GRT balance + +**Objective**: Record the starting GRT balance of the reclaim address so we can measure tokens reclaimed during denial. + +**Steps**: + +```bash +cast call "balanceOf(address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Balance recorded for later comparison + +--- + +## Cycle 2: Denial State Management + +### 2.1 Verify subgraph is not denied (pre-test) + +**Objective**: Confirm the test subgraph deployment is currently not denied and accumulators are growing. + +**Steps**: + +```bash +# Check denial status +cast call "isDenied(bytes32)(bool)" --rpc-url + +# Record current accumulator values +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +cast call "getAccRewardsPerAllocatedToken(bytes32)(uint256,uint256)" --rpc-url +``` + +**Pass Criteria**: + +- `isDenied` = `false` +- Accumulator values recorded as baseline + +--- + +### 2.2 Deny subgraph deployment + +**Objective**: Deny a subgraph and verify the state transition. Confirm `setDenied()` snapshots accumulators before applying denial. + +**Steps**: + +```bash +# Deny the subgraph (as SAO or Governor) +cast send "setDenied(bytes32,bool)" true --rpc-url --private-key + +# Verify denial +cast call "isDenied(bytes32)(bool)" --rpc-url +``` + +**Verification**: Check for `RewardsDenylistUpdated` event: + +```bash +# Check the transaction receipt for RewardsDenylistUpdated event +cast receipt --rpc-url +``` + +**Pass Criteria**: + +- Transaction succeeds +- `isDenied` = `true` +- `RewardsDenylistUpdated(subgraphDeploymentID, sinceBlock)` event emitted with `sinceBlock` = block number of the transaction + +--- + +### 2.3 Redundant deny is idempotent + +**Objective**: Calling `setDenied(true)` on an already-denied subgraph should not change state or emit new events. + +**Steps**: + +```bash +# Deny again (already denied) +cast send "setDenied(bytes32,bool)" true --rpc-url --private-key + +# Verify still denied +cast call "isDenied(bytes32)(bool)" --rpc-url +``` + +**Pass Criteria**: + +- Transaction succeeds (does not revert) +- `isDenied` still = `true` +- No additional `RewardsDenylistUpdated` event (or event has unchanged `sinceBlock`) + +--- + +### 2.4 Unauthorized deny reverts + +**Objective**: Only the SAO or Governor can deny subgraphs. + +**Steps**: + +```bash +# Attempt deny from unauthorized account +cast send "setDenied(bytes32,bool)" true --rpc-url --private-key +``` + +**Pass Criteria**: + +- Transaction reverts + +--- + +## Cycle 3: Accumulator Freeze Verification + +> **Timing**: These tests require waiting for time to pass after denial. At minimum, wait for part of an epoch (~30-60 minutes on Sepolia) between reads to observe that accumulators have stopped growing. + +### 3.1 Accumulators freeze after denial + +**Objective**: Verify that `accRewardsForSubgraph` and `accRewardsPerAllocatedToken` stop growing for a denied subgraph. + +**Prerequisites**: Subgraph denied in test 2.2. Wait at least 30 minutes. + +**Steps**: + +```bash +# Read accumulators (should match or be very close to values recorded at denial time) +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +cast call "getAccRewardsPerAllocatedToken(bytes32)(uint256,uint256)" --rpc-url + +# Compare with a non-denied subgraph (should be growing) +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Denied subgraph: `accRewardsForSubgraph` has NOT increased since denial +- Denied subgraph: `accRewardsPerAllocatedToken` has NOT increased since denial +- Non-denied subgraph: accumulators continue to increase normally (control) + +--- + +### 3.2 getRewards returns frozen value for allocations on denied subgraph + +**Objective**: Verify that `getRewards()` for an allocation on a denied subgraph returns a frozen value (no new rewards accumulate). + +**Steps**: + +```bash +# Check pending rewards for allocation on denied subgraph +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Wait some time, check again +# (wait 30+ minutes) +cast call "getRewards(address,address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Both reads return the same value (frozen — no new rewards accruing) +- The value represents pre-denial uncollected rewards (may be non-zero) + +--- + +### 3.3 Denial-period rewards reclaimed + +**Objective**: Verify that rewards that would have gone to the denied subgraph are being reclaimed to the configured address. + +**Prerequisites**: Reclaim address configured in Cycle 1. Some time has passed since denial. + +**Steps**: + +```bash +# Trigger an accumulator update that processes the denied subgraph +# This happens automatically on signal/allocation changes, but can be forced: +cast send "onSubgraphSignalUpdate(bytes32)" --rpc-url --private-key + +# Check reclaim address balance +cast call "balanceOf(address)(uint256)" --rpc-url +``` + +**Verification**: Check for `RewardsReclaimed` events: + +```bash +RECLAIM_EVENT_SIG=$(cast sig-event "RewardsReclaimed(bytes32,uint256,address,address,bytes32)") +cast logs --from-block --to-block latest --address --topic0 $RECLAIM_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- `RewardsReclaimed` event(s) emitted with reason = `SUBGRAPH_DENIED` +- Reclaim address GRT balance has increased from the Cycle 1 baseline +- Reclaimed amount is proportional to the denied subgraph's signal share and denial duration + +--- + +### 3.4 Non-denied subgraphs unaffected + +**Objective**: Confirm that denying one subgraph does not affect reward accumulation for other subgraphs. + +**Steps**: + +```bash +# Check a non-denied subgraph's accumulator +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +# Check allocation rewards on non-denied subgraph +cast call "getRewards(address,address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Non-denied subgraph accumulators continue increasing +- Allocation rewards on non-denied subgraph continue accruing + +--- + +## Cycle 4: Allocation-Level Deferral + +### 4.1 POI presentation on denied subgraph defers (returns 0, preserves state) + +**Objective**: When an indexer presents a POI for a denied subgraph, the allocation should return 0 rewards WITHOUT advancing the snapshot. The `POIPresented` event should show `condition = SUBGRAPH_DENIED`. + +**Prerequisites**: Indexer has an active allocation on the denied subgraph. Allocation is mature (open 2+ epochs). + +**Steps**: + +1. Record the allocation's current reward snapshot (via view functions) +2. Close or present POI for the allocation on the denied subgraph + +```bash +# Check pending rewards before POI presentation +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Present POI (via indexer agent or manual close attempt) +# The exact mechanism depends on your indexer setup +graph indexer allocations close +``` + +**Verification**: Check transaction logs for `POIPresented` event: + +```bash +POI_EVENT_SIG=$(cast sig-event "POIPresented(address,address,bytes32,bytes32,bytes,bytes32)") +cast logs --from-block --to-block --address --topic0 $POI_EVENT_SIG --rpc-url +``` + +**Pass Criteria**: + +- `POIPresented` event emitted with `condition` = `keccak256("SUBGRAPH_DENIED")` +- Rewards returned = 0 +- **Critical**: Allocation snapshot NOT advanced (pre-denial rewards preserved) +- Allocation remains open if this was a POI presentation (not a force-close) + +--- + +### 4.2 Multiple POI presentations while denied do not lose rewards + +**Objective**: An indexer can present POIs multiple times while a subgraph is denied without losing any pre-denial rewards. Each presentation should defer without advancing the snapshot. + +**Steps**: + +```bash +# First POI presentation (while denied) +# Record getRewards value +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Present POI +# (use indexer agent or cast send to SubgraphService) + +# Second POI presentation (still denied, next epoch) +# Wait one epoch +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Present POI again +``` + +**Pass Criteria**: + +- `getRewards()` returns the same frozen value across all presentations +- No `RewardsReclaimed` events for the allocation's pre-denial rewards +- Pre-denial rewards remain preserved through multiple POI cycles + +--- + +### 4.3 Indexers should continue presenting POIs during denial + +**Objective**: Document that continuing POI presentation during denial prevents staleness. The POI timestamp is updated even on deferred presentations. + +**Steps**: + +1. Confirm the denied subgraph has active allocations +2. Present POI normally (via indexer agent) +3. Verify the allocation's last POI timestamp is updated + +**Pass Criteria**: + +- POI presentation succeeds (transaction does not revert) +- Allocation does not become stale during denial period +- When subgraph is later undenied, the allocation is still healthy (not stale) + +--- + +## Cycle 5: Undeny and Reward Recovery + +### 5.1 Undeny subgraph deployment + +**Objective**: Remove denial and verify accumulators resume growing. + +**Steps**: + +```bash +# Record accumulators just before undeny +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +# Undeny +cast send "setDenied(bytes32,bool)" false --rpc-url --private-key + +# Verify +cast call "isDenied(bytes32)(bool)" --rpc-url +``` + +**Verification**: Check for `RewardsDenylistUpdated` event with `sinceBlock = 0`. + +**Pass Criteria**: + +- `isDenied` = `false` +- `RewardsDenylistUpdated(subgraphDeploymentID, 0)` event emitted + +--- + +### 5.2 Accumulators resume after undeny + +**Objective**: Verify that accumulators start growing again after undeny. + +**Prerequisites**: Subgraph undenied in test 5.1. Wait at least 30 minutes. + +**Steps**: + +```bash +# Read accumulators (should now be growing again) +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +cast call "getAccRewardsPerAllocatedToken(bytes32)(uint256,uint256)" --rpc-url +``` + +**Pass Criteria**: + +- `accRewardsForSubgraph` has increased since undeny +- `accRewardsPerAllocatedToken` has increased since undeny +- Growth rate is consistent with the subgraph's signal proportion + +--- + +### 5.3 Pre-denial rewards claimable after undeny + +**Objective**: Verify that uncollected rewards from before the denial period are now claimable. This is the critical test: the new behavior preserves these rewards rather than dropping them. + +**Prerequisites**: Indexer has allocation that was open before denial and still active. Subgraph is now undenied. Wait 1-2 epochs after undeny. + +**Steps**: + +```bash +# Check pending rewards (should include pre-denial uncollected + post-undeny new rewards) +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Close allocation to claim +graph indexer allocations close +``` + +**Verification Query**: + +```graphql +{ + allocations(where: { id: "ALLOCATION_ID" }) { + id + status + indexingRewards + closedAtEpoch + } +} +``` + +**Pass Criteria**: + +- `indexingRewards` is non-zero +- Reward amount includes: + - Pre-denial uncollected rewards (accumulated before deny) + - Post-undeny rewards (accumulated after undeny) +- Reward amount does NOT include denial-period rewards (those were reclaimed in Cycle 3) +- `POIPresented` event shows `condition = NONE` (normal claim) + +--- + +### 5.4 Denial-period rewards are NOT included in claim + +**Objective**: Verify that the claimed rewards exclude the denial period. Compare the claimed amount against what a continuously-active allocation would have earned. + +**Steps**: + +1. Calculate expected rewards: + - Pre-denial period: from allocation creation to deny block + - Post-undeny period: from undeny block to close block + - Denial period: from deny block to undeny block (should be excluded) +2. Compare actual `indexingRewards` from test 5.3 + +**Pass Criteria**: + +- Claimed rewards approximate (pre-denial + post-undeny) only +- Denial-period rewards were reclaimed (verified in Cycle 3) +- Total of (claimed + reclaimed) approximately equals what would have been earned with no denial + +--- + +## Cycle 6: Edge Cases + +### 6.1 New allocation created while subgraph is denied + +**Objective**: An allocation opened on a denied subgraph starts with a frozen baseline. It should only earn rewards after undeny. + +**Prerequisites**: Subgraph currently denied. + +**Steps**: + +```bash +# Create allocation on denied subgraph +graph indexer allocations create + +# Check rewards immediately +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Wait some time (still denied) +# Check rewards again +cast call "getRewards(address,address)(uint256)" --rpc-url + +# Undeny +cast send "setDenied(bytes32,bool)" false --rpc-url --private-key + +# Wait 1-2 epochs after undeny +# Check rewards again +cast call "getRewards(address,address)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- While denied: `getRewards()` returns 0 (no rewards accumulate) +- After undeny: `getRewards()` starts increasing (rewards resume from undeny point) +- Allocation only earns post-undeny rewards + +--- + +### 6.2 All allocations close while denied, then new allocation after undeny + +**Objective**: When all allocations close during denial, the frozen accumulator state is preserved. A new allocation after undeny should use that preserved baseline. + +**Steps**: + +1. Deny subgraph (if not already denied) +2. Close all allocations on the denied subgraph +3. Undeny subgraph +4. Create new allocation +5. Wait 1-2 epochs, close, check rewards + +**Pass Criteria**: + +- New allocation earns rewards only for the post-undeny period +- Frozen state was correctly preserved through the "no allocations" period +- No rewards are double-counted or lost at the transition + +--- + +### 6.3 Deny and undeny in rapid succession + +**Objective**: A quick deny→undeny cycle correctly handles the boundary. Accumulators are snapshotted on each transition. + +**Steps**: + +```bash +# Record accumulators +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url + +# Deny +cast send "setDenied(bytes32,bool)" true --rpc-url --private-key + +# Undeny (in next block or shortly after) +cast send "setDenied(bytes32,bool)" false --rpc-url --private-key + +# Check accumulators +cast call "getAccRewardsForSubgraph(bytes32)(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Both transactions succeed +- Accumulators resume growing after undeny +- Minimal reward loss (only the few blocks between deny and undeny) +- No contract reverts or unexpected state + +--- + +### 6.4 Denial interaction with indexer eligibility + +**Objective**: Subgraph denial takes precedence over indexer eligibility. When a subgraph is denied, POI presentation defers regardless of eligibility status — ensuring pre-denial rewards are preserved even for ineligible indexers. + +**Prerequisites**: REO validation enabled, one indexer ineligible, subgraph denied. + +**Steps**: + +```bash +# Confirm indexer is ineligible +cast call "isEligible(address)(bool)" --rpc-url +# Expected: false + +# Confirm subgraph is denied +cast call "isDenied(bytes32)(bool)" --rpc-url +# Expected: true + +# Present POI for ineligible indexer on denied subgraph +# (via indexer agent or manual) +``` + +**Pass Criteria**: + +- POI presentation defers (not reclaimed as INDEXER_INELIGIBLE) +- `POIPresented` event shows `condition = SUBGRAPH_DENIED` (denial takes precedence) +- Pre-denial rewards preserved (not reclaimed due to ineligibility) +- After undeny + re-renewal: rewards become claimable + +--- + +## Post-Testing Checklist + +- [ ] All denied subgraphs undenied (or left in intended state) +- [ ] Reclaim addresses verified +- [ ] No allocations stuck in unexpected state +- [ ] Reclaim address balance increase accounted for +- [ ] Results documented in test tracker + +--- + +## Related Documentation + +- [← Back to REO Testing](README.md) +- [RewardsConditionsTestPlan.md](RewardsConditionsTestPlan.md) — Signal, POI, and allocation lifecycle conditions +- [BaselineTestPlan.md](BaselineTestPlan.md) — Baseline operational tests (run first) +- [ReoTestPlan.md](ReoTestPlan.md) — REO eligibility tests + +--- + +_Derived from issuance upgrade behavior changes. Source: [RewardsBehaviourChanges.md](/docs/RewardsBehaviourChanges.md), [RewardConditions.md](/docs/RewardConditions.md). Contract: `packages/contracts/contracts/rewards/RewardsManager.sol`, `packages/subgraph-service/contracts/utilities/AllocationManager.sol`._ diff --git a/packages/issuance/docs/testing/reo/TestnetDetails.md b/packages/issuance/docs/testing/reo/TestnetDetails.md new file mode 100644 index 000000000..88ceffd34 --- /dev/null +++ b/packages/issuance/docs/testing/reo/TestnetDetails.md @@ -0,0 +1,65 @@ +# Arbitrum Sepolia — Testnet Details + +## Network Parameters + +| Parameter | Value | +| ----------------------- | ---------------------------------------------- | +| Explorer | | +| Gateway | | +| Network subgraph | `3xQHhMudr1oh69ut36G2mbzpYmYxwqCeU6wwqyCDCnqV` | +| RPC | | +| Epoch length | ~554 blocks (~110 minutes) | +| Max allocation lifetime | 8 epochs (~15 hours) | +| Min indexer stake | 100k GRT | +| Thawing period | Shortened for faster testing | + +## Network Subgraph + +**Query via Graph Explorer**: [Graph Network Arbitrum Sepolia](https://thegraph.com/explorer/subgraphs/3xQHhMudr1oh69ut36G2mbzpYmYxwqCeU6wwqyCDCnqV?view=Query&chain=arbitrum-one) + +Or query directly: + +```bash +export GRAPH_API_KEY= +curl "https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/3xQHhMudr1oh69ut36G2mbzpYmYxwqCeU6wwqyCDCnqV" \ + -H 'content-type: application/json' \ + -d '{"query": "{ _meta { block { number } } }"}' +``` + +## Contract Addresses + +| Contract | Address | +| ---------------------------- | -------------------------------------------- | +| RewardsEligibilityOracle | `0x62c2305739cc75f19a3a6d52387ceb3690d99a99` | +| MockRewardsEligibilityOracle | `0x5FB23365F8cf643D5f1459E9793EfF7254522400` | +| RewardsManager | `0x1f49cae7669086c8ba53cc35d1e9f80176d67e79` | +| SubgraphService | `0xc24a3dac5d06d771f657a48b20ce1a671b78f26b` | +| GraphToken (L2) | `0xf8c05dcf59e8b28bfd5eed176c562bebcfc7ac04` | +| Controller | `0x9db3ee191681f092607035d9bda6e59fbeaca695` | + +## Mock REO (Testnet) + +The testnet RewardsManager is configured to use the `MockRewardsEligibilityOracle` rather than the real REO, to allow indexers to control their own eligibility during testing. + +The mock uses `msg.sender` as the indexer address, so each indexer controls their own eligibility by sending transactions from their own key. + +Check what the mock reports to RewardsManager for an address: + +```bash +cast call --rpc-url https://sepolia-rollup.arbitrum.io/rpc \ + 0x5FB23365F8cf643D5f1459E9793EfF7254522400 \ + "isEligible(address)(bool)"
+``` + +Set your own eligibility (send from the indexer key): + +```bash +cast send --rpc-url https://sepolia-rollup.arbitrum.io/rpc \ + --private-key $PRIVATE_KEY \ + 0x5FB23365F8cf643D5f1459E9793EfF7254522400 \ + "setEligible(bool)" +``` + +--- + +- [← Back to REO Testing](README.md) diff --git a/packages/issuance/docs/testing/reo/support/IssuanceAllocatorTestPlan.md b/packages/issuance/docs/testing/reo/support/IssuanceAllocatorTestPlan.md new file mode 100644 index 000000000..d8ab63f85 --- /dev/null +++ b/packages/issuance/docs/testing/reo/support/IssuanceAllocatorTestPlan.md @@ -0,0 +1,98 @@ +# IssuanceAllocator Test Plan + +> **Navigation**: [← Back to REO Testing](../README.md) + +Separated from the REO test plan — IssuanceAllocator is independent of the Rewards Eligibility Oracle. Test when deployed. + +## Contract Addresses + +| Contract | Arbitrum Sepolia | Arbitrum One | +| ------------------------- | -------------------------------------------- | ------------ | +| IssuanceAllocator (proxy) | Not yet deployed | TBD | +| RewardsManager (proxy) | `0x1f49cae7669086c8ba53cc35d1e9f80176d67e79` | TBD | +| GraphToken (L2) | `0xf8c05dcf59e8b28bfd5eed176c562bebcfc7ac04` | TBD | + +--- + +## Tests + +### 1. Verify IssuanceAllocator configuration + +**Objective**: Confirm the IssuanceAllocator is correctly configured with RewardsManager as a self-minting target. + +**Steps**: + +```bash +# Check issuance rate +cast call "getIssuancePerBlock()(uint256)" --rpc-url + +# Check RewardsManager target allocation +cast call "getTargetIssuancePerBlock(address)(uint256,uint256)" --rpc-url + +# Check if IssuanceAllocator is minter +cast call "isMinter(address)(bool)" --rpc-url + +# Check RewardsManager knows about IssuanceAllocator +cast call "getIssuanceAllocator()(address)" --rpc-url +``` + +**Pass Criteria**: + +- `getIssuancePerBlock` returns the expected issuance rate +- RewardsManager has self-minting allocation = 100% of issuance +- IssuanceAllocator is a minter on GraphToken +- RewardsManager points to IssuanceAllocator + +--- + +### 2. Distribute issuance + +**Objective**: Verify `distributeIssuance()` executes correctly. + +**Steps**: + +```bash +# Anyone can call this +cast send "distributeIssuance()" --rpc-url --private-key +``` + +**Pass Criteria**: + +- Transaction succeeds +- No unexpected reverts + +--- + +### 3. Verify issuance rate matches RewardsManager + +**Objective**: Confirm the issuance rate in IssuanceAllocator matches what RewardsManager expects. + +**Steps**: + +```bash +# IssuanceAllocator rate +cast call "getIssuancePerBlock()(uint256)" --rpc-url + +# RewardsManager effective rate +cast call "issuancePerBlock()(uint256)" --rpc-url +``` + +**Pass Criteria**: + +- Both values are identical + +--- + +### 4. IssuanceAllocator not paused + +**Objective**: Confirm the IssuanceAllocator is operational. + +**Steps**: + +```bash +cast call "paused()(bool)" --rpc-url +``` + +**Pass Criteria**: + +- Returns `false` diff --git a/packages/issuance/docs/testing/reo/support/NotionSetup.md b/packages/issuance/docs/testing/reo/support/NotionSetup.md new file mode 100644 index 000000000..2ebcc8e6c --- /dev/null +++ b/packages/issuance/docs/testing/reo/support/NotionSetup.md @@ -0,0 +1,70 @@ +# Notion Tracker Setup + +> **Navigation**: [← Back to REO Testing](../README.md) + +Instructions for setting up the Notion-based test tracker from [NotionTracker.csv](NotionTracker.csv). + +## Import into Notion + +1. Open Notion, navigate to the workspace where you want the tracker +2. Click **Import** (sidebar → Import, or `...` menu → Import) +3. Select **CSV** and upload `NotionTracker.csv` +4. Notion creates a database from the CSV + +## Configure Column Types + +After import, change these column types in the database: + +| Column | Change to | Notes | +| --------- | ------------ | --------------------------------------------------------------- | +| Indexer A | **Checkbox** | Indexer marks when they've completed the test | +| Indexer B | **Checkbox** | Same | +| Indexer C | **Checkbox** | Same | +| Status | **Select** | Options: Not Started, In Progress, Pass, Fail, Blocked, Skipped | +| Link | **URL** | Links are already full GitHub URLs | +| Plan | **Select** | Enables grouping by test plan (Baseline / Eligibility) | + +### Add Indexer Columns + +If you have more than 3 indexers, add additional checkbox columns. Rename the generic "Indexer A/B/C" columns to the actual indexer names or addresses. + +## Recommended Views + +### 1. Main Tracker (Table) + +Default view — all tests in sequence. Sort by **Test ID**. + +### 2. By Plan (Board) + +Board view grouped by **Plan**. Shows progress through Baseline vs Eligibility at a glance. + +### 3. Per-Indexer (Filtered Tables) + +Create a filtered table for each indexer showing their checkbox and status columns. + +### 4. Blocked / Failed + +Filter: Status = Fail or Blocked. Use during testing to track issues. + +## Workflow + +1. **Before testing**: Share the Notion page with participating indexers (edit access) +2. **During testing**: Indexers check their checkbox when they complete a test. Update Status column. +3. **Coordinator**: Updates Status and Notes columns as tests progress +4. **After each session**: Review blocked/failed tests, update Notes with details + +## Column Reference + +| Column | Purpose | +| ----------- | -------------------------------------------------- | +| Test ID | Unique identifier (e.g. B-3.2 = Baseline test 3.2) | +| Plan | Test plan: Baseline or Eligibility | +| Test Name | Short test title | +| Link | Link to detailed test steps in IndexerTestGuide.md | +| Indexer A-C | Checkboxes for each indexer to confirm completion | +| Status | Current test status | +| Notes | Free text for issues, observations, tx hashes | + +--- + +**Related**: [NotionTracker.csv](NotionTracker.csv) | [IndexerTestGuide.md](../IndexerTestGuide.md) diff --git a/packages/issuance/docs/testing/reo/support/NotionTracker.csv b/packages/issuance/docs/testing/reo/support/NotionTracker.csv new file mode 100644 index 000000000..c8ad3a5be --- /dev/null +++ b/packages/issuance/docs/testing/reo/support/NotionTracker.csv @@ -0,0 +1,77 @@ +Test ID,Plan,Test Name,Link,Indexer A,Indexer B,Indexer C,Status,Notes +B-1.1,Baseline,Setup indexer via Explorer,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#11-setup-indexer-via-explorer,,,,Not Started, +B-1.2,Baseline,Register indexer URL and GEO coordinates,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#12-register-indexer-url-and-geo-coordinates,,,,Not Started, +B-1.3,Baseline,Validate Subgraph Service provision and registration,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#13-validate-subgraph-service-provision-and-registration,,,,Not Started, +B-2.1,Baseline,Add stake via Explorer,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#21-add-stake-via-explorer,,,,Not Started, +B-2.2,Baseline,Unstake tokens and withdraw after thawing,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#22-unstake-tokens-and-withdraw-after-thawing,,,,Not Started, +B-3.1,Baseline,View current provision,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#31-view-current-provision,,,,Not Started, +B-3.2,Baseline,Add stake to provision,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#32-add-stake-to-provision,,,,Not Started, +B-3.3,Baseline,Thaw stake from provision,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#33-thaw-stake-from-provision,,,,Not Started, +B-3.4,Baseline,Remove thawed stake from provision,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#34-remove-thawed-stake-from-provision,,,,Not Started, +B-4.1,Baseline,Find subgraph deployments with rewards,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#41-find-subgraph-deployments-with-rewards,,,,Not Started, +B-4.2,Baseline,Create allocation manually,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#42-create-allocation-manually,,,,Not Started, +B-4.3,Baseline,Create allocation via actions queue,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#43-create-allocation-via-actions-queue,,,,Not Started, +B-4.4,Baseline,Create allocation via deployment rules,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#44-create-allocation-via-deployment-rules,,,,Not Started, +B-4.5,Baseline,Reallocate a deployment,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#45-reallocate-a-deployment,,,,Not Started, +B-5.1,Baseline,Send test queries,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#51-send-test-queries,,,,Not Started, +B-5.2,Baseline,Close allocation and collect indexing rewards,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#52-close-allocation-and-collect-indexing-rewards,,,,Not Started, +B-5.3,Baseline,Verify query fee collection,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#53-verify-query-fee-collection,,,,Not Started, +B-5.4,Baseline,Close allocation with explicit POI,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#54-close-allocation-with-explicit-poi,,,,Not Started, +B-6.1,Baseline,Monitor indexer health,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#61-monitor-indexer-health,,,,Not Started, +B-6.2,Baseline,Check epoch progression,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#62-check-epoch-progression,,,,Not Started, +B-6.3,Baseline,Verify no unexpected errors in logs,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#63-verify-no-unexpected-errors-in-logs,,,,Not Started, +B-7.1,Baseline,Full operational cycle,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/BaselineTestPlan.md#71-full-operational-cycle,,,,Not Started, +E-1.1,Eligibility,Open 3+ allocations for eligibility tests,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#11-open-allocations-for-eligibility-tests,,,,Not Started,Need epoch maturity before Set 2 +E-2.1,Eligibility,Renew eligibility,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#21-renew-eligibility,,,,Not Started, +E-2.2,Eligibility,Close allocation while eligible,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#22-close-allocation-while-eligible,,,,Not Started,Requires epoch maturity from Set 1 +E-3.1,Eligibility,Wait for eligibility expiry,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#31-wait-for-eligibility-expiry,,,,Not Started, +E-3.2,Eligibility,Close allocation while ineligible,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#32-close-allocation-while-ineligible,,,,Not Started,Confirm indexingRewards is 0 +E-4.1,Eligibility,Re-renew eligibility,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#41-re-renew-eligibility,,,,Not Started,Do promptly after Set 3 +E-4.2,Eligibility,Close allocation — full rewards after re-renewal,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#42-close-allocation--full-rewards-after-re-renewal,,,,Not Started,Key test: rewards include ineligible period +E-5.1,Eligibility,Verify eligibility when validation is off,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/IndexerTestGuide.md#51-verify-eligibility-when-validation-is-off,,,,Not Started,Coordinator toggles validation +D-1.1,Denial,Configure SUBGRAPH_DENIED reclaim address,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#11-configure-subgraph_denied-reclaim-address,,,,Not Started,Governor access needed +D-1.2,Denial,Record reclaim address GRT balance,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#12-record-reclaim-address-grt-balance,,,,Not Started, +D-2.1,Denial,Verify subgraph is not denied (pre-test),https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#21-verify-subgraph-is-not-denied-pre-test,,,,Not Started,Record accumulator baseline +D-2.2,Denial,Deny subgraph deployment,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#22-deny-subgraph-deployment,,,,Not Started,SAO or Governor access needed +D-2.3,Denial,Redundant deny is idempotent,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#23-redundant-deny-is-idempotent,,,,Not Started, +D-2.4,Denial,Unauthorized deny reverts,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#24-unauthorized-deny-reverts,,,,Not Started, +D-3.1,Denial,Accumulators freeze after denial,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#31-accumulators-freeze-after-denial,,,,Not Started,Wait 30+ min after denial +D-3.2,Denial,getRewards returns frozen value for denied subgraph,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#32-getrewards-returns-frozen-value-for-allocations-on-denied-subgraph,,,,Not Started, +D-3.3,Denial,Denial-period rewards reclaimed,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#33-denial-period-rewards-reclaimed,,,,Not Started,Check RewardsReclaimed events +D-3.4,Denial,Non-denied subgraphs unaffected,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#34-non-denied-subgraphs-unaffected,,,,Not Started,Control test +D-4.1,Denial,POI on denied subgraph defers,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#41-poi-presentation-on-denied-subgraph-defers-returns-0-preserves-state,,,,Not Started,Critical: snapshot NOT advanced +D-4.2,Denial,Multiple POI presentations while denied safe,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#42-multiple-poi-presentations-while-denied-do-not-lose-rewards,,,,Not Started, +D-4.3,Denial,Continue presenting POIs during denial,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#43-indexers-should-continue-presenting-pois-during-denial,,,,Not Started,Prevents staleness +D-5.1,Denial,Undeny subgraph deployment,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#51-undeny-subgraph-deployment,,,,Not Started, +D-5.2,Denial,Accumulators resume after undeny,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#52-accumulators-resume-after-undeny,,,,Not Started,Wait 30+ min after undeny +D-5.3,Denial,Pre-denial rewards claimable after undeny,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#53-pre-denial-rewards-claimable-after-undeny,,,,Not Started,Critical: preserved rewards claimable +D-5.4,Denial,Denial-period rewards excluded from claim,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#54-denial-period-rewards-are-not-included-in-claim,,,,Not Started, +D-6.1,Denial,New allocation while denied,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#61-new-allocation-created-while-subgraph-is-denied,,,,Not Started,Only earns post-undeny rewards +D-6.2,Denial,All allocations close while denied then resume,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#62-all-allocations-close-while-denied-then-new-allocation-after-undeny,,,,Not Started, +D-6.3,Denial,Rapid deny/undeny cycle,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#63-deny-and-undeny-in-rapid-succession,,,,Not Started, +D-6.4,Denial,Denial vs eligibility precedence,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/SubgraphDenialTestPlan.md#64-denial-interaction-with-indexer-eligibility,,,,Not Started,Denial takes precedence over REO +RC-1.1,Conditions,Configure per-condition reclaim addresses,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#11-configure-per-condition-reclaim-addresses,,,,Not Started,Governor access needed +RC-1.2,Conditions,Configure default reclaim address,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#12-configure-default-reclaim-address,,,,Not Started, +RC-1.3,Conditions,Verify fallback routing,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#13-verify-fallback-routing-unconfigured-condition-uses-default,,,,Not Started, +RC-1.4,Conditions,Unauthorized reclaim address change reverts,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#14-unauthorized-reclaim-address-change-reverts,,,,Not Started, +RC-1.5,Conditions,Record baseline balances,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#15-record-baseline-balances,,,,Not Started, +RC-2.1,Conditions,Verify current minimum signal threshold,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#21-verify-current-minimum-signal-threshold,,,,Not Started, +RC-2.2,Conditions,Raise threshold to trigger BELOW_MINIMUM_SIGNAL,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#22-raise-threshold-to-trigger-below_minimum_signal,,,,Not Started,Snapshot accumulators first +RC-2.3,Conditions,Accumulator freezes for below-threshold subgraph,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#23-accumulator-freezes-for-below-threshold-subgraph,,,,Not Started, +RC-2.4,Conditions,Restore threshold and verify resumption,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#24-restore-threshold-and-verify-resumption,,,,Not Started, +RC-3.1,Conditions,Identify subgraph with signal but no allocations,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#31-identify-subgraph-with-signal-but-no-allocations,,,,Not Started, +RC-3.2,Conditions,Verify NO_ALLOCATED_TOKENS reclaim,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#32-verify-no_allocated_tokens-reclaim,,,,Not Started, +RC-3.3,Conditions,Allocations resume from stored baseline,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#33-allocations-resume-from-stored-baseline,,,,Not Started, +RC-4.1,Conditions,Normal claim path (NONE condition),https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#41-normal-claim-path-none-condition,,,,Not Started, +RC-4.2,Conditions,Reclaim path: STALE_POI,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#42-reclaim-path-stale_poi,,,,Not Started,Wait for maxPOIStaleness +RC-4.3,Conditions,Reclaim path: ZERO_POI,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#43-reclaim-path-zero_poi,,,,Not Started, +RC-4.4,Conditions,Defer path: ALLOCATION_TOO_YOUNG,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#44-defer-path-allocation_too_young,,,,Not Started,Same-epoch POI attempt +RC-4.5,Conditions,POI presentation always updates timestamp,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#45-poi-presentation-always-updates-timestamp,,,,Not Started, +RC-5.1,Conditions,Allocation resize reclaims stale rewards,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#51-allocation-resize-reclaims-stale-rewards,,,,Not Started,Wait for staleness +RC-5.2,Conditions,Non-stale resize does not reclaim,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#52-allocation-resize-does-not-reclaim-for-non-stale-allocation,,,,Not Started, +RC-5.3,Conditions,Allocation close reclaims uncollected rewards,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#53-allocation-close-reclaims-uncollected-rewards,,,,Not Started, +RC-6.1,Conditions,POIPresented event on every presentation,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#61-poipresented-event-emitted-on-every-presentation,,,,Not Started,Cross-check all Cycle 4-5 events +RC-6.2,Conditions,RewardsReclaimed events include full context,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#62-rewardsreclaimed-events-include-full-context,,,,Not Started, +RC-6.3,Conditions,View functions reflect frozen state accurately,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#63-view-functions-reflect-frozen-state-accurately,,,,Not Started, +RC-7.1,Conditions,NO_SIGNAL detection,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#71-no_signal-detection,,,,Not Started,Dedicated testnet only +RC-7.2,Conditions,Signal restoration resumes normal distribution,https://github.com/graphprotocol/contracts/blob/reo-testing/packages/issuance/docs/testing/reo/RewardsConditionsTestPlan.md#72-signal-restoration-resumes-normal-distribution,,,,Not Started,Dedicated testnet only diff --git a/packages/issuance/docs/testing/reo/support/indexer-status.sh b/packages/issuance/docs/testing/reo/support/indexer-status.sh new file mode 100755 index 000000000..c914580be --- /dev/null +++ b/packages/issuance/docs/testing/reo/support/indexer-status.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Query basic indexer status from the network subgraph. +# +# Usage: +# ./indexer-status.sh [mainnet] +# +# Environment: +# GRAPH_API_KEY Required. Your Graph API key. +# +# Examples: +# GRAPH_API_KEY=abc123 ./indexer-status.sh 0xdeadbeef... +# GRAPH_API_KEY=abc123 ./indexer-status.sh 0xdeadbeef... mainnet + +set -euo pipefail + +INDEXER=${1:-} +NETWORK=${2:-testnet} + +if [[ -z "$INDEXER" ]]; then + echo "Usage: $0 [mainnet]" >&2 + exit 1 +fi + +if [[ -z "${GRAPH_API_KEY:-}" ]]; then + echo "Error: GRAPH_API_KEY is not set" >&2 + exit 1 +fi + +# Addresses must be lowercase for the subgraph +INDEXER=$(echo "$INDEXER" | tr '[:upper:]' '[:lower:]') + +if [[ "$NETWORK" == "mainnet" ]]; then + SUBGRAPH_URL="https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/DZz4kDTdmzWLWsV373w2bSmoar3umKKH9y82SUKr5qmp" +else + SUBGRAPH_URL="https://gateway.thegraph.com/api/$GRAPH_API_KEY/subgraphs/id/3xQHhMudr1oh69ut36G2mbzpYmYxwqCeU6wwqyCDCnqV" +fi + +QUERY=$(cat < Date: Mon, 11 May 2026 12:34:56 +0000 Subject: [PATCH 13/29] docs(contracts): capture pending updates as sidecar .todo.md files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces a `*.todo.md` sidecar convention for capturing pending edits next to the contract source they target. Tracks deferred items so anyone working on the contract sees the pending list without having to touch the contract just to record an intent. Initial entries cover four files: - IHorizonStakingTypes.sol — LegacyAllocationState.Active NatSpec drift from PR #1331 nits. - BaseUpgradeable.sol — unused MILLION public constant; ABI-impact note on removal. - AllocationHandler.sol — legacy-allo migration block (~L170) confirmed unused; deferred to a post-horizon cleanup pass. - RecurringCollector.sol — EIP-170 bytecode-headroom refactor candidates, max-next-claim consolidation, the two remaining unreachable defensive branches (with disposition direction), the offer-keyed-terms storage restructure sketch, and pointers to the three preserved L-7 alternative tags (audit-l7-alt-{cascade-delete,independent-cancel,document-only}). --- .../collectors/RecurringCollector.todo.md | 23 +++++++++++++++++++ .../internal/IHorizonStakingTypes.todo.md | 21 +++++++++++++++++ .../contracts/common/BaseUpgradeable.todo.md | 11 +++++++++ .../libraries/AllocationHandler.todo.md | 14 +++++++++++ 4 files changed, 69 insertions(+) create mode 100644 packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md create mode 100644 packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.todo.md create mode 100644 packages/issuance/contracts/common/BaseUpgradeable.todo.md create mode 100644 packages/subgraph-service/contracts/libraries/AllocationHandler.todo.md diff --git a/packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md b/packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md new file mode 100644 index 000000000..4b05a6737 --- /dev/null +++ b/packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md @@ -0,0 +1,23 @@ +# RecurringCollector.sol — pending updates + +Tracking pending edits noted but deferred to avoid touching contract source until the next maintenance window. When picking up, drop the corresponding entry below as part of the same commit. Line numbers reflect the file at time of writing and will drift. + +## Refactor candidates + +Code-clarity / micro-bytecode wins. Deployed bytecode is **22,558 / 24,576 bytes** (~2 KB free) after `7c12e2f80` made module-level constants `internal`, so none of these are urgent. Pick up opportunistically — e.g. when the adjacent code is already being touched, or in a focused cleanup pass before a future audit round. + +- **Drop `try/catch` around `decodeCollectData`** (`collect()` L213–217). The external-self call + try/catch only converts an ABI-decode panic into `RecurringCollectorInvalidCollectData`. Replace with direct `abi.decode`. Code clarity win + ~150–300 bytes. +- **Hoist callback gas-precheck threshold to a constant.** Three uses at L835, L855, L884 of `(MAX_PAYER_CALLBACK_GAS * 64) / 63 + CALLBACK_GAS_OVERHEAD`. Promote to `private constant MIN_GASLEFT_FOR_CALLBACK`. ~30–60 bytes, plus the threshold becomes inspectable. +- **Extract `_invokePayerCallback` helper.** Three near-identical assembly blocks: eligibility staticcall (L834–851, reads return value), `beforeCollection` call (L854–864), `afterCollection` call (L882–897). Probably two helpers (return-value vs. fire-and-forget). Auditor needs to verify assembly preserved + return-value semantics — defer unless the assembly is being touched anyway. ~200–500 bytes. +- **Inline `_getMaxNextClaim(AgreementData storage)` into `_getMaxNextClaimScoped`.** Single call site (L1321, the Accepted branch). Optimizer at `runs: 100` almost certainly already inlines; explicit removal removes a hop for readers. ~50–150 bytes if not already inlined. + +## Offer-keyed terms storage + +Architectural restructure considered — defer to next storage-level pass. Split `AgreementData` so identity + terms live in `offers[hash]` (per-version, immutable) and lifecycle lives in `agreements[id]` (per-agreement, mutates). Decode once at store time; all internal reads go through `offers[hash]`. Collapses the three-way dispatch in `_getMaxNextClaimScoped`, folds `_getMaxNextClaim(_a)` into it, removes the double-write in `_validateAndStoreAgreement` / `_offerNew` (agreement-storage terms + `rcaOffers` blob), simplifies `_validateAndStoreUpdate`. Preserves `offers[hash].data` / `offerType` for API compat. See `/sync/notes/tasks/20260421_OfferKeyedTermsStorage.md` for the full sketch and the synthesizing-getter path for keeping `getAgreement(id)`'s return shape stable. Prototype preserved at `archive/indexing-payments-management-unified-terms-storage` (`a9c2737038`) — see "Related archived branches" below. + +## Related archived branches + +Broader RecurringCollector / RAM refactors explored on parallel branches and preserved as tags rather than merged. Useful context when revisiting the architecture: + +- `archive/indexing-payments-management-unified-terms-storage` (`a9c2737038`) — full TRST-L-11 storage refactor: single `terms[hash]` mapping replaces `rcaOffers`/`rcauOffers`, `AgreementData` slimmed from 7 to 5 slots with `pendingTermsHash` pointer, `_storeTerms` as the only validated write gate; the 3-way state dispatch in max-claim collapses into `_activeClaimWindow`/`_maxClaimForTerms`, NEW path shared between `offer(NEW)` and `accept()`. This is the prototype of the "Offer-keyed terms storage" sketch above. Superseded by `-2-light`, which kept the existing storage and addressed TRST-L-11 minimally via per-version semantics in `getAgreementDetails`. +- `archive/indexing-payments-management-collector-led-lifecycle` — full RAM/Collector boundary inversion (audit-fix PR1301 round): payer interacts with the Collector first via a two-phase offer/accept flow, Collector then notifies the data service via `acceptAgreement` / `afterAgreementStateChange` callbacks (with `MAX_CALLBACK_GAS` cap and `PayerCallbackFailed` events); ECDSA signing and `Authorizable` dropped from the Collector. Generic agreement methods moved from `IRecurringCollector` to `IAgreementCollector`; `OfferResult`/`AgreementVersion` unified into a single `AgreementDetails`; `Pair` dropped from RAM's public API. Superseded by `-reduced`, which preserved the data-service-as-orchestrator pattern and instead tightened internals (collector→provider storage hierarchy, stored-hash auth, scoped claims, pausable/upgradeable Collector). diff --git a/packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.todo.md b/packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.todo.md new file mode 100644 index 000000000..ab7a2caf1 --- /dev/null +++ b/packages/interfaces/contracts/horizon/internal/IHorizonStakingTypes.todo.md @@ -0,0 +1,21 @@ +# IHorizonStakingTypes.sol — pending updates + +Tracking pending edits noted but deferred to avoid touching contract source until the next maintenance window. When picking up, drop the corresponding entry below as part of the same commit. + +## `LegacyAllocationState.Active` NatSpec drift + +The enum docstring at L233 describes the `Active` state as `not Null && tokens > 0`, but the implementation in `_getLegacyAllocationState` (`packages/horizon/contracts/staking/HorizonStaking.sol:1190`) gates on `createdAtEpoch != 0 && closedAtEpoch == 0` — no `tokens > 0` check. + +`createdAtEpoch` is set together with `indexer` at allocation creation, so `createdAtEpoch != 0` is equivalent to `not NULL`. The docstring's `tokens > 0` clause has no implementation counterpart. + +Suggested replacement: + +```solidity + * - Null = indexer == address(0) + * - Active = not Null && closedAtEpoch == 0 + * - Closed = not Null && closedAtEpoch != 0 +``` + +Also tightens `Closed` away from the recursive `Active && closedAtEpoch != 0` framing, which becomes circular once `Active` is restated. + +**Origin:** Inline review nits from Maikol on PR #1331 (2026-05-07, L233 & L234); PR was approved with these threads left open as non-blocking. diff --git a/packages/issuance/contracts/common/BaseUpgradeable.todo.md b/packages/issuance/contracts/common/BaseUpgradeable.todo.md new file mode 100644 index 000000000..6cbfa38b4 --- /dev/null +++ b/packages/issuance/contracts/common/BaseUpgradeable.todo.md @@ -0,0 +1,11 @@ +# BaseUpgradeable.sol — pending updates + +Tracking pending edits noted but deferred to avoid touching contract source until the next maintenance window. When picking up, drop the corresponding entry below as part of the same commit. + +## Unused `MILLION` constant + +`uint256 public constant MILLION = 1_000_000;` (around L37) has no in-repo references. The only mentions of `MILLION` anywhere under `packages/` are this declaration and its own docstring example. + +It's `public`, so removing it is technically an ABI change on every `BaseUpgradeable` descendant (each currently exposes a `MILLION()` getter). + +- **Delete.** Drop the constant and its docstring. Confirm no external caller depends on the getter — a quick GitHub code search across consumers (indexer-rs, eligibility-oracle-node, etc.) should be enough; ABI hash will change on any contract inheriting BaseUpgradeable. diff --git a/packages/subgraph-service/contracts/libraries/AllocationHandler.todo.md b/packages/subgraph-service/contracts/libraries/AllocationHandler.todo.md new file mode 100644 index 000000000..e1ecc103b --- /dev/null +++ b/packages/subgraph-service/contracts/libraries/AllocationHandler.todo.md @@ -0,0 +1,14 @@ +# AllocationHandler.sol — pending updates + +Tracking pending edits noted but deferred to avoid touching contract source until the next maintenance window. When picking up, drop the corresponding entry below as part of the same commit. + +## Legacy-allo migration cleanup + +The legacy-allocation-id migration block around L170 is unused. It was added during horizon work to migrate legacy allocation IDs from `HorizonStaking` to `SubgraphService`, never executed, and intentionally deferred. + +**Confirmation:** + +- Maikol on PR #1331 (2026-05-06, `AllocationHandler.sol:170`): "I believe this is no longer being used so we could delete. Maybe leave for a post-post-horizon cleanup 😅" +- tmigone on PR #1331 (2026-05-08): "this was never used indeed. added with horizon to migrate legacy allo ids from staking to subgraph service but we never executed on it and have since decided to remove with clean up. its likely it got re-added with matias' commit but we don't need it." + +**Trigger:** Post-horizon cleanup pass, or any adjacent edit to `AllocationHandler.sol` that makes the removal cheap to fold in. Scope is the specific block tmigone identified — not a broader audit of horizon-era dead code. From 6a64d07a4854df04844a1d7d0999266abcbd7b83 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 12:37:49 +0000 Subject: [PATCH 14/29] chore(lint): include json5 files in lint:json glob MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends the root lint:json prettier glob and the lint-staged config to cover *.json5 alongside *.json, then runs prettier across the 17 ignition / deployment-config files in the repo to baseline against the standard prettier style (unquoted keys, single quotes, trailing commas). The cross-package config-reconciliation test (14 cases) still passes — content is unchanged, only quote style + trailing commas shift. Going forward, the json5 ignition configs go through the same pre-commit prettier pass as everything else, so trailing-comma drift, key-quote drift, and bracketing irregularities get caught passively instead of accumulating in hand-edited config files. --- package.json | 4 +- packages/deployment/config/arbitrumOne.json5 | 8 +- .../deployment/config/arbitrumSepolia.json5 | 8 +- packages/deployment/config/localNetwork.json5 | 8 +- .../configs/migrate.arbitrumOne.json5 | 74 +++++++++--------- .../configs/migrate.arbitrumSepolia.json5 | 76 +++++++++---------- .../ignition/configs/migrate.default.json5 | 74 +++++++++--------- .../configs/migrate.integration.json5 | 74 +++++++++--------- .../configs/migrate.localNetwork.json5 | 74 +++++++++--------- .../ignition/configs/protocol.default.json5 | 56 +++++++------- .../configs/protocol.localNetwork.json5 | 56 +++++++------- .../configs/migrate.arbitrumOne.json5 | 58 +++++++------- .../configs/migrate.arbitrumSepolia.json5 | 58 +++++++------- .../ignition/configs/migrate.default.json5 | 58 +++++++------- .../configs/migrate.integration.json5 | 58 +++++++------- .../configs/migrate.localNetwork.json5 | 58 +++++++------- .../ignition/configs/protocol.default.json5 | 58 +++++++------- .../configs/protocol.localNetwork.json5 | 58 +++++++------- 18 files changed, 457 insertions(+), 461 deletions(-) diff --git a/package.json b/package.json index 972633896..c66f0334f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "lint:sol": "pnpm -r run lint:sol; prettier -w --cache --log-level warn 'packages/**/*.sol'; pnpm todo", "lint:forge": "pnpm -r run lint:forge", "lint:md": "markdownlint --fix --ignore-path .gitignore 'packages/**/*.md' 'docs/**/*.md' '*.md'; prettier -w --cache --log-level warn 'packages/**/*.md' 'docs/**/*.md' '*.md'", - "lint:json": "prettier -w --cache --log-level warn 'packages/**/*.json' '.changeset/**/*.json' '*.json'", + "lint:json": "prettier -w --cache --log-level warn 'packages/**/*.{json,json5}' '.changeset/**/*.json' '*.{json,json5}'", "lint:yaml": "npx yaml-lint .github/**/*.{yml,yaml} packages/contracts/task/config/*.yml; prettier -w --cache --log-level warn 'packages/**/*.{yml,yaml}' '.github/**/*.{yml,yaml}'", "test": "pnpm build && pnpm -r run test:self", "test:prod": "FOUNDRY_PROFILE=prod pnpm test", @@ -82,7 +82,7 @@ "markdownlint --fix", "prettier -w --cache --log-level warn" ], - "*.json": "prettier -w --cache --log-level warn", + "*.{json,json5}": "prettier -w --cache --log-level warn", "*.{yml,yaml}": [ "npx yamllint", "prettier -w --cache --log-level warn" diff --git a/packages/deployment/config/arbitrumOne.json5 b/packages/deployment/config/arbitrumOne.json5 index 2819769c4..85baff79a 100644 --- a/packages/deployment/config/arbitrumOne.json5 +++ b/packages/deployment/config/arbitrumOne.json5 @@ -2,11 +2,11 @@ // Deployment configuration for Arbitrum One (mainnet) // Values here are committed for reference and reproducibility. - "IssuanceAllocator": { + IssuanceAllocator: { // RAM allocation: how much issuance flows to RecurringAgreementManager // ramAllocatorMintingGrtPerBlock: GRT per block minted by IA and sent to RAM // ramSelfMintingGrtPerBlock: 0 (RAM does not self-mint) - "ramAllocatorMintingGrtPerBlock": "6", - "ramSelfMintingGrtPerBlock": "0" - } + ramAllocatorMintingGrtPerBlock: '6', + ramSelfMintingGrtPerBlock: '0', + }, } diff --git a/packages/deployment/config/arbitrumSepolia.json5 b/packages/deployment/config/arbitrumSepolia.json5 index 5b3350e94..3944d469d 100644 --- a/packages/deployment/config/arbitrumSepolia.json5 +++ b/packages/deployment/config/arbitrumSepolia.json5 @@ -2,11 +2,11 @@ // Deployment configuration for Arbitrum Sepolia (testnet) // Values here are committed for reference and reproducibility. - "IssuanceAllocator": { + IssuanceAllocator: { // RAM allocation: how much issuance flows to RecurringAgreementManager // ramAllocatorMintingGrtPerBlock: GRT per block minted by IA and sent to RAM // ramSelfMintingGrtPerBlock: GRT per block (0 = RAM does not self-mint) - "ramAllocatorMintingGrtPerBlock": "0.5", - "ramSelfMintingGrtPerBlock": "0" - } + ramAllocatorMintingGrtPerBlock: '0.5', + ramSelfMintingGrtPerBlock: '0', + }, } diff --git a/packages/deployment/config/localNetwork.json5 b/packages/deployment/config/localNetwork.json5 index c9dcd90db..09d9340ee 100644 --- a/packages/deployment/config/localNetwork.json5 +++ b/packages/deployment/config/localNetwork.json5 @@ -2,10 +2,10 @@ // Deployment configuration for local-network (docker-compose dev stack) // Local network uses generous rates for fast iteration and testing. - "IssuanceAllocator": { + IssuanceAllocator: { // RAM allocation: how much issuance flows to RecurringAgreementManager // Local network uses a high rate so agreements accumulate meaningful rewards quickly - "ramAllocatorMintingGrtPerBlock": "6", - "ramSelfMintingGrtPerBlock": "0" - } + ramAllocatorMintingGrtPerBlock: '6', + ramSelfMintingGrtPerBlock: '0', + }, } diff --git a/packages/horizon/ignition/configs/migrate.arbitrumOne.json5 b/packages/horizon/ignition/configs/migrate.arbitrumOne.json5 index c28f8974c..fe86db939 100644 --- a/packages/horizon/ignition/configs/migrate.arbitrumOne.json5 +++ b/packages/horizon/ignition/configs/migrate.arbitrumOne.json5 @@ -1,54 +1,54 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - Arbitrum One values - "governor": "0x8C6de8F8D562f3382417340A6994601eE08D3809", + governor: '0x8C6de8F8D562f3382417340A6994601eE08D3809', // Addresses for contracts deployed in the original Graph Protocol - Arbitrum One values - "graphProxyAdminAddress": "0x2983936aC20202a6555993448E0d5654AC8Ca5fd", - "controllerAddress": "0x0a8491544221dd212964fbb96487467291b2C97e", - "horizonStakingAddress": "0x00669A4CF01450B64E8A2A20E9b1FCB71E61eF03", - "epochManagerAddress": "0x5A843145c43d328B9bB7a4401d94918f131bB281", - "epochManagerImplementationAddress": "0xeEDEdb3660154f439D93bfF612f7902edf07b848", - "graphTokenAddress": "0x9623063377AD1B27544C965cCd7342f7EA7e88C7", - "graphTokenImplementationAddress": "0xaFFCb96181D920FE8C0Af046C49B2c9eC98b28df", - "graphTokenGatewayAddress": "0x65E1a5e8946e7E87d9774f5288f41c30a99fD302", - "graphTokenGatewayImplementationAddress": "0x6f37b2AF8A0Cc74f1bFddf2E9302Cb226710127F", - "rewardsManagerAddress": "0x971B9d3d0Ae3ECa029CAB5eA1fB0F72c85e6a525", - "curationAddress": "0x22d78fb4bc72e191C765807f8891B5e1785C8014", - "gnsAddress": "0xec9A7fb6CbC2E41926127929c2dcE6e9c5D33Bec", - "gnsImplementationAddress": "0x9B81c7C5A21E65b849FD487540B0A82d3b97b2c7", - "subgraphNFTAddress": "0x3FbD54f0cc17b7aE649008dEEA12ed7D2622B23f", + graphProxyAdminAddress: '0x2983936aC20202a6555993448E0d5654AC8Ca5fd', + controllerAddress: '0x0a8491544221dd212964fbb96487467291b2C97e', + horizonStakingAddress: '0x00669A4CF01450B64E8A2A20E9b1FCB71E61eF03', + epochManagerAddress: '0x5A843145c43d328B9bB7a4401d94918f131bB281', + epochManagerImplementationAddress: '0xeEDEdb3660154f439D93bfF612f7902edf07b848', + graphTokenAddress: '0x9623063377AD1B27544C965cCd7342f7EA7e88C7', + graphTokenImplementationAddress: '0xaFFCb96181D920FE8C0Af046C49B2c9eC98b28df', + graphTokenGatewayAddress: '0x65E1a5e8946e7E87d9774f5288f41c30a99fD302', + graphTokenGatewayImplementationAddress: '0x6f37b2AF8A0Cc74f1bFddf2E9302Cb226710127F', + rewardsManagerAddress: '0x971B9d3d0Ae3ECa029CAB5eA1fB0F72c85e6a525', + curationAddress: '0x22d78fb4bc72e191C765807f8891B5e1785C8014', + gnsAddress: '0xec9A7fb6CbC2E41926127929c2dcE6e9c5D33Bec', + gnsImplementationAddress: '0x9B81c7C5A21E65b849FD487540B0A82d3b97b2c7', + subgraphNFTAddress: '0x3FbD54f0cc17b7aE649008dEEA12ed7D2622B23f', // Must be set for step 2 of the migration - "graphPaymentsAddress": "0x7Aae8ae011927BC36Cb4d0d3e81f2E6E30daE06D", - "paymentsEscrowAddress": "0xf6Fcc27aAf1fcD8B254498c9794451d82afC673E", + graphPaymentsAddress: '0x7Aae8ae011927BC36Cb4d0d3e81f2E6E30daE06D', + paymentsEscrowAddress: '0xf6Fcc27aAf1fcD8B254498c9794451d82afC673E', // Must be set for step 3 and 4 of the migration - "subgraphServiceAddress": "0xb2Bb92d0DE618878E438b55D5846cfecD9301105", + subgraphServiceAddress: '0xb2Bb92d0DE618878E438b55D5846cfecD9301105', // Must be set for step 4 of the migration - "horizonStakingImplementationAddress": "0xaA3359434B534dE9964d4e72bE2782b076a1Eb5A", - "curationImplementationAddress": "0xc4Ce508c8fda35C597CC78e3604261110fc4c957", - "rewardsManagerImplementationAddress": "0xBcD7a231eAB1f4667AAbFdb482026f244bfBf101", - "disputeManagerAddress": "0x2FE023a575449AcB698648eD21276293Fa176f96", + horizonStakingImplementationAddress: '0xaA3359434B534dE9964d4e72bE2782b076a1Eb5A', + curationImplementationAddress: '0xc4Ce508c8fda35C597CC78e3604261110fc4c957', + rewardsManagerImplementationAddress: '0xBcD7a231eAB1f4667AAbFdb482026f244bfBf101', + disputeManagerAddress: '0x2FE023a575449AcB698648eD21276293Fa176f96', // Global parameters - "maxThawingPeriod": 2419200 + maxThawingPeriod: 2419200, }, - "GraphPayments": { - "protocolPaymentCut": 10000 + GraphPayments: { + protocolPaymentCut: 10000, }, - "PaymentsEscrow": { - "withdrawEscrowThawingPeriod": 2592000 + PaymentsEscrow: { + withdrawEscrowThawingPeriod: 2592000, }, - "GraphTallyCollector": { - "eip712Name": "GraphTallyCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 2592000 + GraphTallyCollector: { + eip712Name: 'GraphTallyCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 2592000, + }, + RecurringCollector: { + eip712Name: 'RecurringCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 2592000, }, - "RecurringCollector": { - "eip712Name": "RecurringCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 2592000 - } } diff --git a/packages/horizon/ignition/configs/migrate.arbitrumSepolia.json5 b/packages/horizon/ignition/configs/migrate.arbitrumSepolia.json5 index adb2eb86d..9019e9d0a 100644 --- a/packages/horizon/ignition/configs/migrate.arbitrumSepolia.json5 +++ b/packages/horizon/ignition/configs/migrate.arbitrumSepolia.json5 @@ -1,54 +1,54 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", + governor: '0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3', // Addresses for contracts deployed in the original Graph Protocol - "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", - "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", - "horizonStakingAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", - "epochManagerAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", - "epochManagerImplementationAddress": "0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da", - "graphTokenAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", - "graphTokenImplementationAddress": "0x4cf968bA38b43dd10be114daa7959C1b369479e5", - "graphTokenGatewayAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", - "graphTokenGatewayImplementationAddress": "0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC", - "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", - "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", - "gnsAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", - "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", - "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + graphProxyAdminAddress: '0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C', + controllerAddress: '0x9DB3ee191681f092607035d9BDA6e59FbEaCa695', + horizonStakingAddress: '0x865365C425f3A593Ffe698D9c4E6707D14d51e08', + epochManagerAddress: '0x88b3C7f37253bAA1A9b95feAd69bD5320585826D', + epochManagerImplementationAddress: '0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da', + graphTokenAddress: '0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04', + graphTokenImplementationAddress: '0x4cf968bA38b43dd10be114daa7959C1b369479e5', + graphTokenGatewayAddress: '0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb', + graphTokenGatewayImplementationAddress: '0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC', + rewardsManagerAddress: '0x1F49caE7669086c8ba53CC35d1E9f80176d67E79', + curationAddress: '0xDe761f075200E75485F4358978FB4d1dC8644FD5', + gnsAddress: '0x3133948342F35b8699d8F94aeE064AbB76eDe965', + gnsImplementationAddress: '0x00CBF5024d454255577Bf2b0fB6A43328a6828c9', + subgraphNFTAddress: '0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A', // Must be set for step 2 of the migration - "graphPaymentsAddress": "0x57E70eC8905E26341d40aF60Dca56cDBA8C166E5", - "paymentsEscrowAddress": "0x4b5D3Da463F7E076bb7CDF5030960bf123245681", + graphPaymentsAddress: '0x57E70eC8905E26341d40aF60Dca56cDBA8C166E5', + paymentsEscrowAddress: '0x4b5D3Da463F7E076bb7CDF5030960bf123245681', // Must be set for step 3 and 4 of the migration - "subgraphServiceAddress": "0xc24A3dAC5d06d771f657A48B20cE1a671B78f26b", + subgraphServiceAddress: '0xc24A3dAC5d06d771f657A48B20cE1a671B78f26b', // Must be set for step 4 of the migration - "horizonStakingImplementationAddress": "0x2AF6F51e119A79497C3A3FFf012B5889da489764", - "curationImplementationAddress": "0xbC8F4355f346e47eef8A0DBFF4a58616ACf7DaCA", - "rewardsManagerImplementationAddress": "0x856843F6409a8b3A0d4aaE67313037FED02bBBFf", - "disputeManagerAddress": "0x96e1b86b2739e8A3d59F40F2532caDF9cE8Da088", - + horizonStakingImplementationAddress: '0x2AF6F51e119A79497C3A3FFf012B5889da489764', + curationImplementationAddress: '0xbC8F4355f346e47eef8A0DBFF4a58616ACf7DaCA', + rewardsManagerImplementationAddress: '0x856843F6409a8b3A0d4aaE67313037FED02bBBFf', + disputeManagerAddress: '0x96e1b86b2739e8A3d59F40F2532caDF9cE8Da088', + // Global parameters - "maxThawingPeriod": 2419200 + maxThawingPeriod: 2419200, + }, + GraphPayments: { + protocolPaymentCut: 10000, }, - "GraphPayments": { - "protocolPaymentCut": 10000 + PaymentsEscrow: { + withdrawEscrowThawingPeriod: 10800, }, - "PaymentsEscrow": { - "withdrawEscrowThawingPeriod": 10800 + GraphTallyCollector: { + eip712Name: 'GraphTallyCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10800, }, - "GraphTallyCollector": { - "eip712Name": "GraphTallyCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10800 + RecurringCollector: { + eip712Name: 'RecurringCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10800, }, - "RecurringCollector": { - "eip712Name": "RecurringCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10800 - } } diff --git a/packages/horizon/ignition/configs/migrate.default.json5 b/packages/horizon/ignition/configs/migrate.default.json5 index b770de7a3..a27b8dd8f 100644 --- a/packages/horizon/ignition/configs/migrate.default.json5 +++ b/packages/horizon/ignition/configs/migrate.default.json5 @@ -1,54 +1,54 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - Arbitrum Sepolia values - "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", + governor: '0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3', // Addresses for contracts deployed in the original Graph Protocol - Arbitrum Sepolia values - "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", - "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", - "horizonStakingAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", - "epochManagerAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", - "epochManagerImplementationAddress": "0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da", - "graphTokenAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", - "graphTokenImplementationAddress": "0x4cf968bA38b43dd10be114daa7959C1b369479e5", - "graphTokenGatewayAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", - "graphTokenGatewayImplementationAddress": "0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC", - "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", - "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", - "gnsAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", - "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", - "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + graphProxyAdminAddress: '0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C', + controllerAddress: '0x9DB3ee191681f092607035d9BDA6e59FbEaCa695', + horizonStakingAddress: '0x865365C425f3A593Ffe698D9c4E6707D14d51e08', + epochManagerAddress: '0x88b3C7f37253bAA1A9b95feAd69bD5320585826D', + epochManagerImplementationAddress: '0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da', + graphTokenAddress: '0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04', + graphTokenImplementationAddress: '0x4cf968bA38b43dd10be114daa7959C1b369479e5', + graphTokenGatewayAddress: '0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb', + graphTokenGatewayImplementationAddress: '0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC', + rewardsManagerAddress: '0x1F49caE7669086c8ba53CC35d1E9f80176d67E79', + curationAddress: '0xDe761f075200E75485F4358978FB4d1dC8644FD5', + gnsAddress: '0x3133948342F35b8699d8F94aeE064AbB76eDe965', + gnsImplementationAddress: '0x00CBF5024d454255577Bf2b0fB6A43328a6828c9', + subgraphNFTAddress: '0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A', // Must be set for step 2 of the migration - "graphPaymentsAddress": "", - "paymentsEscrowAddress": "", + graphPaymentsAddress: '', + paymentsEscrowAddress: '', // Must be set for step 3 and 4 of the migration - "subgraphServiceAddress": "", + subgraphServiceAddress: '', // Must be set for step 4 of the migration - "horizonStakingImplementationAddress": "", - "curationImplementationAddress": "", - "rewardsManagerImplementationAddress": "", - "disputeManagerAddress": "", + horizonStakingImplementationAddress: '', + curationImplementationAddress: '', + rewardsManagerImplementationAddress: '', + disputeManagerAddress: '', // Global parameters - "maxThawingPeriod": 2419200 + maxThawingPeriod: 2419200, }, - "GraphPayments": { - "protocolPaymentCut": 10000 + GraphPayments: { + protocolPaymentCut: 10000, }, - "PaymentsEscrow": { - "withdrawEscrowThawingPeriod": 10000 + PaymentsEscrow: { + withdrawEscrowThawingPeriod: 10000, }, - "GraphTallyCollector": { - "eip712Name": "GraphTallyCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 + GraphTallyCollector: { + eip712Name: 'GraphTallyCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, + }, + RecurringCollector: { + eip712Name: 'RecurringCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, }, - "RecurringCollector": { - "eip712Name": "RecurringCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 - } } diff --git a/packages/horizon/ignition/configs/migrate.integration.json5 b/packages/horizon/ignition/configs/migrate.integration.json5 index 5b2f2155f..775e56161 100644 --- a/packages/horizon/ignition/configs/migrate.integration.json5 +++ b/packages/horizon/ignition/configs/migrate.integration.json5 @@ -1,54 +1,54 @@ { - "$global": { + $global: { // Accounts - "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", + governor: '0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0', // Addresses for contracts deployed in the original Graph Protocol - "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", - "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", - "horizonStakingAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", - "epochManagerAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", - "epochManagerImplementationAddress": "0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da", - "graphTokenAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", - "graphTokenImplementationAddress": "0x4cf968bA38b43dd10be114daa7959C1b369479e5", - "graphTokenGatewayAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", - "graphTokenGatewayImplementationAddress": "0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC", - "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", - "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", - "gnsAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", - "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", - "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + graphProxyAdminAddress: '0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C', + controllerAddress: '0x9DB3ee191681f092607035d9BDA6e59FbEaCa695', + horizonStakingAddress: '0x865365C425f3A593Ffe698D9c4E6707D14d51e08', + epochManagerAddress: '0x88b3C7f37253bAA1A9b95feAd69bD5320585826D', + epochManagerImplementationAddress: '0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da', + graphTokenAddress: '0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04', + graphTokenImplementationAddress: '0x4cf968bA38b43dd10be114daa7959C1b369479e5', + graphTokenGatewayAddress: '0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb', + graphTokenGatewayImplementationAddress: '0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC', + rewardsManagerAddress: '0x1F49caE7669086c8ba53CC35d1E9f80176d67E79', + curationAddress: '0xDe761f075200E75485F4358978FB4d1dC8644FD5', + gnsAddress: '0x3133948342F35b8699d8F94aeE064AbB76eDe965', + gnsImplementationAddress: '0x00CBF5024d454255577Bf2b0fB6A43328a6828c9', + subgraphNFTAddress: '0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A', // Must be set for step 2 of the migration - "graphPaymentsAddress": "", - "paymentsEscrowAddress": "", + graphPaymentsAddress: '', + paymentsEscrowAddress: '', // Must be set for step 3 and 4 of the migration - "subgraphServiceAddress": "", + subgraphServiceAddress: '', // Must be set for step 4 of the migration - "horizonStakingImplementationAddress": "", - "curationImplementationAddress": "", - "rewardsManagerImplementationAddress": "", - "disputeManagerAddress": "", + horizonStakingImplementationAddress: '', + curationImplementationAddress: '', + rewardsManagerImplementationAddress: '', + disputeManagerAddress: '', // Global parameters - "maxThawingPeriod": 2419200 + maxThawingPeriod: 2419200, }, - "GraphPayments": { - "protocolPaymentCut": 10000 + GraphPayments: { + protocolPaymentCut: 10000, }, - "PaymentsEscrow": { - "withdrawEscrowThawingPeriod": 10000 + PaymentsEscrow: { + withdrawEscrowThawingPeriod: 10000, }, - "GraphTallyCollector": { - "eip712Name": "GraphTallyCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 + GraphTallyCollector: { + eip712Name: 'GraphTallyCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, + }, + RecurringCollector: { + eip712Name: 'RecurringCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, }, - "RecurringCollector": { - "eip712Name": "RecurringCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 - } } diff --git a/packages/horizon/ignition/configs/migrate.localNetwork.json5 b/packages/horizon/ignition/configs/migrate.localNetwork.json5 index 21f34880e..68e9166c7 100644 --- a/packages/horizon/ignition/configs/migrate.localNetwork.json5 +++ b/packages/horizon/ignition/configs/migrate.localNetwork.json5 @@ -1,54 +1,54 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - Local Network values - "governor": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + governor: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', // Addresses for contracts deployed in the original Graph Protocol - Local Network values - "graphProxyAdminAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "controllerAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "horizonStakingAddress": "0xc5a5C42992dECbae36851359345FE25997F5C42d", - "epochManagerAddress": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "epochManagerImplementationAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "graphTokenAddress": "0x3Aa5ebB10DC797CAC828524e59A333d0A371443c", - "graphTokenImplementationAddress": "0x3Aa5ebB10DC797CAC828524e59A333d0A371443c", - "graphTokenGatewayAddress": "0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690", - "graphTokenGatewayImplementationAddress": "0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E", - "rewardsManagerAddress": "0x9A676e781A523b5d0C0e43731313A708CB607508", - "curationAddress": "0x59b670e9fA9D0A427751Af201D676719a970857b", - "gnsAddress": "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", - "gnsImplementationAddress": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44", - "subgraphNFTAddress": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", + graphProxyAdminAddress: '0x5FbDB2315678afecb367f032d93F642f64180aa3', + controllerAddress: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', + horizonStakingAddress: '0xc5a5C42992dECbae36851359345FE25997F5C42d', + epochManagerAddress: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9', + epochManagerImplementationAddress: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', + graphTokenAddress: '0x3Aa5ebB10DC797CAC828524e59A333d0A371443c', + graphTokenImplementationAddress: '0x3Aa5ebB10DC797CAC828524e59A333d0A371443c', + graphTokenGatewayAddress: '0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690', + graphTokenGatewayImplementationAddress: '0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E', + rewardsManagerAddress: '0x9A676e781A523b5d0C0e43731313A708CB607508', + curationAddress: '0x59b670e9fA9D0A427751Af201D676719a970857b', + gnsAddress: '0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f', + gnsImplementationAddress: '0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44', + subgraphNFTAddress: '0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e', // Must be set for step 2 of the migration - "graphPaymentsAddress": "", - "paymentsEscrowAddress": "", + graphPaymentsAddress: '', + paymentsEscrowAddress: '', // Must be set for step 3 and 4 of the migration - "subgraphServiceAddress": "", + subgraphServiceAddress: '', // Must be set for step 4 of the migration - "horizonStakingImplementationAddress": "", - "curationImplementationAddress": "", - "rewardsManagerImplementationAddress": "", - "disputeManagerAddress": "", + horizonStakingImplementationAddress: '', + curationImplementationAddress: '', + rewardsManagerImplementationAddress: '', + disputeManagerAddress: '', // Global parameters - "maxThawingPeriod": 2419200 + maxThawingPeriod: 2419200, }, - "GraphPayments": { - "protocolPaymentCut": 10000 + GraphPayments: { + protocolPaymentCut: 10000, }, - "PaymentsEscrow": { - "withdrawEscrowThawingPeriod": 10000 + PaymentsEscrow: { + withdrawEscrowThawingPeriod: 10000, }, - "GraphTallyCollector": { - "eip712Name": "GraphTallyCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 + GraphTallyCollector: { + eip712Name: 'GraphTallyCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, + }, + RecurringCollector: { + eip712Name: 'RecurringCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, }, - "RecurringCollector": { - "eip712Name": "RecurringCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 - } } diff --git a/packages/horizon/ignition/configs/protocol.default.json5 b/packages/horizon/ignition/configs/protocol.default.json5 index 817758796..8f853518f 100644 --- a/packages/horizon/ignition/configs/protocol.default.json5 +++ b/packages/horizon/ignition/configs/protocol.default.json5 @@ -1,45 +1,43 @@ { - "$global": { + $global: { // Accounts for new deployment - derived from hardhat default mnemonic - "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", // index 3 - "subgraphAvailabilityOracle": "0xd03ea8624C8C5987235048901fB614fDcA89b117", // index 4 + pauseGuardian: '0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d', // index 3 + subgraphAvailabilityOracle: '0xd03ea8624C8C5987235048901fB614fDcA89b117', // index 4 // Placeholder address for a standalone Horizon deployment, see README.md for more details - "subgraphServiceAddress": "0x0000000000000000000000000000000000000000", - "disputeManagerAddress": "0x0000000000000000000000000000000000000001", + subgraphServiceAddress: '0x0000000000000000000000000000000000000000', + disputeManagerAddress: '0x0000000000000000000000000000000000000001', // Global parameters - "maxThawingPeriod": 2419200 + maxThawingPeriod: 2419200, }, - "GraphPayments": { - "protocolPaymentCut": 10000 + GraphPayments: { + protocolPaymentCut: 10000, }, - "PaymentsEscrow": { - "withdrawEscrowThawingPeriod": 10000 + PaymentsEscrow: { + withdrawEscrowThawingPeriod: 10000, }, - "GraphTallyCollector": { - "eip712Name": "GraphTallyCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 + GraphTallyCollector: { + eip712Name: 'GraphTallyCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, }, - "RecurringCollector": { - "eip712Name": "RecurringCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 + RecurringCollector: { + eip712Name: 'RecurringCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, }, - "RewardsManager": { - "issuancePerBlock": "114155251141552511415n" + RewardsManager: { + issuancePerBlock: '114155251141552511415n', }, - "EpochManager": { - "epochLength": 60 + EpochManager: { + epochLength: 60, }, - "L2Curation": { - "curationTaxPercentage": 10000, - "minimumCurationDeposit": 1 + L2Curation: { + curationTaxPercentage: 10000, + minimumCurationDeposit: 1, }, - "L2GraphToken": { - "initialSupply": "10000000000000000000000000000n" + L2GraphToken: { + initialSupply: '10000000000000000000000000000n', }, - - } diff --git a/packages/horizon/ignition/configs/protocol.localNetwork.json5 b/packages/horizon/ignition/configs/protocol.localNetwork.json5 index 5b5ea1e2c..a70990f70 100644 --- a/packages/horizon/ignition/configs/protocol.localNetwork.json5 +++ b/packages/horizon/ignition/configs/protocol.localNetwork.json5 @@ -1,45 +1,43 @@ { - "$global": { + $global: { // Accounts for new deployment - derived from hardhat default mnemonic - "pauseGuardian": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", // index 3 - "subgraphAvailabilityOracle": "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", // index 4 + pauseGuardian: '0x90F79bf6EB2c4f870365E785982E1f101E93b906', // index 3 + subgraphAvailabilityOracle: '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65', // index 4 // Placeholder address for a standalone Horizon deployment, see README.md for more details - "subgraphServiceAddress": "0x0000000000000000000000000000000000000000", - "disputeManagerAddress": "0x0000000000000000000000000000000000000001", + subgraphServiceAddress: '0x0000000000000000000000000000000000000000', + disputeManagerAddress: '0x0000000000000000000000000000000000000001', // Global parameters - "maxThawingPeriod": 2419200 + maxThawingPeriod: 2419200, }, - "GraphPayments": { - "protocolPaymentCut": 10000 + GraphPayments: { + protocolPaymentCut: 10000, }, - "PaymentsEscrow": { - "withdrawEscrowThawingPeriod": 10000 + PaymentsEscrow: { + withdrawEscrowThawingPeriod: 10000, }, - "GraphTallyCollector": { - "eip712Name": "GraphTallyCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 + GraphTallyCollector: { + eip712Name: 'GraphTallyCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, }, - "RecurringCollector": { - "eip712Name": "RecurringCollector", - "eip712Version": "1", - "revokeSignerThawingPeriod": 10000 + RecurringCollector: { + eip712Name: 'RecurringCollector', + eip712Version: '1', + revokeSignerThawingPeriod: 10000, }, - "RewardsManager": { - "issuancePerBlock": "114155251141552511415n" + RewardsManager: { + issuancePerBlock: '114155251141552511415n', }, - "EpochManager": { - "epochLength": 60, // Note that localNetwork does not auto-mine blocks, so this could be any amount of time in seconds + 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 + L2Curation: { + curationTaxPercentage: 10000, + minimumCurationDeposit: 1, }, - "L2GraphToken": { - "initialSupply": "10000000000000000000000000000n" + L2GraphToken: { + initialSupply: '10000000000000000000000000000n', }, - - } diff --git a/packages/subgraph-service/ignition/configs/migrate.arbitrumOne.json5 b/packages/subgraph-service/ignition/configs/migrate.arbitrumOne.json5 index 8102ddfff..a0c725644 100644 --- a/packages/subgraph-service/ignition/configs/migrate.arbitrumOne.json5 +++ b/packages/subgraph-service/ignition/configs/migrate.arbitrumOne.json5 @@ -1,38 +1,38 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - Arbitrum One values - "governor": "0x8C6de8F8D562f3382417340A6994601eE08D3809", - "arbitrator": "0x113DC95e796836b8F0Fa71eE7fB42f221740c3B0", - "pauseGuardian": "0xB0aD33a21b98bCA1761729A105e2E34e27153aAE", + governor: '0x8C6de8F8D562f3382417340A6994601eE08D3809', + arbitrator: '0x113DC95e796836b8F0Fa71eE7fB42f221740c3B0', + pauseGuardian: '0xB0aD33a21b98bCA1761729A105e2E34e27153aAE', // Addresses for contracts deployed in the original Graph Protocol - Arbitrum One values - "controllerAddress": "0x0a8491544221dd212964fbb96487467291b2C97e", - "curationProxyAddress": "0x22d78fb4bc72e191C765807f8891B5e1785C8014", - "gnsProxyAddress": "0xec9A7fb6CbC2E41926127929c2dcE6e9c5D33Bec", - "gnsImplementationAddress": "0x9B81c7C5A21E65b849FD487540B0A82d3b97b2c7", - "subgraphNFTAddress": "0x3FbD54f0cc17b7aE649008dEEA12ed7D2622B23f", - "legacyDisputeManagerAddress": "0x0Ab2B043138352413Bb02e67E626a70320E3BD46", - "legacyServiceRegistryAddress": "0x072884c745c0A23144753335776c99BE22588f8A", + controllerAddress: '0x0a8491544221dd212964fbb96487467291b2C97e', + curationProxyAddress: '0x22d78fb4bc72e191C765807f8891B5e1785C8014', + gnsProxyAddress: '0xec9A7fb6CbC2E41926127929c2dcE6e9c5D33Bec', + gnsImplementationAddress: '0x9B81c7C5A21E65b849FD487540B0A82d3b97b2c7', + subgraphNFTAddress: '0x3FbD54f0cc17b7aE649008dEEA12ed7D2622B23f', + legacyDisputeManagerAddress: '0x0Ab2B043138352413Bb02e67E626a70320E3BD46', + legacyServiceRegistryAddress: '0x072884c745c0A23144753335776c99BE22588f8A', // Must be set for step 2 of the deployment - "disputeManagerProxyAddress": "0x2FE023a575449AcB698648eD21276293Fa176f96", - "disputeManagerProxyAdminAddress": "0x2cf40C92706943dCAE5E0Ba047a29563863C9d75", - "subgraphServiceProxyAddress": "0xb2Bb92d0DE618878E438b55D5846cfecD9301105", - "subgraphServiceProxyAdminAddress": "0x49021Ada0806cabce24b73002EB4477fe4934215", - "graphTallyCollectorAddress": "0x8f69F5C07477Ac46FBc491B1E6D91E2bb0111A9e", - "curationImplementationAddress": "0xc4Ce508c8fda35C597CC78e3604261110fc4c957" + disputeManagerProxyAddress: '0x2FE023a575449AcB698648eD21276293Fa176f96', + disputeManagerProxyAdminAddress: '0x2cf40C92706943dCAE5E0Ba047a29563863C9d75', + subgraphServiceProxyAddress: '0xb2Bb92d0DE618878E438b55D5846cfecD9301105', + subgraphServiceProxyAdminAddress: '0x49021Ada0806cabce24b73002EB4477fe4934215', + graphTallyCollectorAddress: '0x8f69F5C07477Ac46FBc491B1E6D91E2bb0111A9e', + curationImplementationAddress: '0xc4Ce508c8fda35C597CC78e3604261110fc4c957', }, - "DisputeManager": { - "disputePeriod": 2419200, - "disputeDeposit": "10000000000000000000000n", - "fishermanRewardCut": 500000, - "maxSlashingCut": 100000, + DisputeManager: { + disputePeriod: 2419200, + disputeDeposit: '10000000000000000000000n', + fishermanRewardCut: 500000, + maxSlashingCut: 100000, + }, + SubgraphService: { + minimumProvisionTokens: '100000000000000000000000n', + maximumDelegationRatio: 16, + stakeToFeesRatio: 10, + maxPOIStaleness: 2419200, + curationCut: 100000, }, - "SubgraphService": { - "minimumProvisionTokens": "100000000000000000000000n", - "maximumDelegationRatio": 16, - "stakeToFeesRatio": 10, - "maxPOIStaleness": 2419200, - "curationCut": 100000, - } } diff --git a/packages/subgraph-service/ignition/configs/migrate.arbitrumSepolia.json5 b/packages/subgraph-service/ignition/configs/migrate.arbitrumSepolia.json5 index c3d2dcc69..bdac874f9 100644 --- a/packages/subgraph-service/ignition/configs/migrate.arbitrumSepolia.json5 +++ b/packages/subgraph-service/ignition/configs/migrate.arbitrumSepolia.json5 @@ -1,38 +1,38 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", - "arbitrator": "0x1726A5d52e279d02ff4732eCeB2D67BFE5Add328", - "pauseGuardian": "0xa0444508232dA3FA6C2f96a5f105f3f0cc0d20D7", + governor: '0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3', + arbitrator: '0x1726A5d52e279d02ff4732eCeB2D67BFE5Add328', + pauseGuardian: '0xa0444508232dA3FA6C2f96a5f105f3f0cc0d20D7', // Addresses for contracts deployed in the original Graph Protocol - "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", - "curationProxyAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", - "gnsProxyAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", - "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", - "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", - "legacyDisputeManagerAddress": "0x7C9B82717f9433932507dF6EdA93A9678b258698", - "legacyServiceRegistryAddress": "0x888541878CbDDEd880Cd58c728f1Af5C47343F86", + controllerAddress: '0x9DB3ee191681f092607035d9BDA6e59FbEaCa695', + curationProxyAddress: '0xDe761f075200E75485F4358978FB4d1dC8644FD5', + gnsProxyAddress: '0x3133948342F35b8699d8F94aeE064AbB76eDe965', + gnsImplementationAddress: '0x00CBF5024d454255577Bf2b0fB6A43328a6828c9', + subgraphNFTAddress: '0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A', + legacyDisputeManagerAddress: '0x7C9B82717f9433932507dF6EdA93A9678b258698', + legacyServiceRegistryAddress: '0x888541878CbDDEd880Cd58c728f1Af5C47343F86', // Must be set for step 2 of the deployment - "disputeManagerProxyAddress": "0x96e1b86b2739e8A3d59F40F2532caDF9cE8Da088", - "disputeManagerProxyAdminAddress": "0x154a73CB6ebB5717a15f203d6E160E6F41ecC527", - "subgraphServiceProxyAddress": "0xc24A3dAC5d06d771f657A48B20cE1a671B78f26b", - "subgraphServiceProxyAdminAddress": "0x15737D9f8635cAcd43e110327c930bd5EC1fe098", - "graphTallyCollectorAddress": "0x382863e7B662027117449bd2c49285582bbBd21B", - "curationImplementationAddress": "0xbC8F4355f346e47eef8A0DBFF4a58616ACf7DaCA", + disputeManagerProxyAddress: '0x96e1b86b2739e8A3d59F40F2532caDF9cE8Da088', + disputeManagerProxyAdminAddress: '0x154a73CB6ebB5717a15f203d6E160E6F41ecC527', + subgraphServiceProxyAddress: '0xc24A3dAC5d06d771f657A48B20cE1a671B78f26b', + subgraphServiceProxyAdminAddress: '0x15737D9f8635cAcd43e110327c930bd5EC1fe098', + graphTallyCollectorAddress: '0x382863e7B662027117449bd2c49285582bbBd21B', + curationImplementationAddress: '0xbC8F4355f346e47eef8A0DBFF4a58616ACf7DaCA', }, - "DisputeManager": { - "disputePeriod": 28800, - "disputeDeposit": "10000000000000000000000n", - "fishermanRewardCut": 500000, - "maxSlashingCut": 100000, + DisputeManager: { + disputePeriod: 28800, + disputeDeposit: '10000000000000000000000n', + fishermanRewardCut: 500000, + maxSlashingCut: 100000, + }, + SubgraphService: { + minimumProvisionTokens: '100000000000000000000000n', + maximumDelegationRatio: 16, + stakeToFeesRatio: 10, + maxPOIStaleness: 28800, + curationCut: 100000, }, - "SubgraphService": { - "minimumProvisionTokens": "100000000000000000000000n", - "maximumDelegationRatio": 16, - "stakeToFeesRatio": 10, - "maxPOIStaleness": 28800, - "curationCut": 100000, - } } diff --git a/packages/subgraph-service/ignition/configs/migrate.default.json5 b/packages/subgraph-service/ignition/configs/migrate.default.json5 index 6c2155be8..6de736023 100644 --- a/packages/subgraph-service/ignition/configs/migrate.default.json5 +++ b/packages/subgraph-service/ignition/configs/migrate.default.json5 @@ -1,38 +1,38 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - Arbitrum Sepolia values - "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", - "arbitrator": "0x1726A5d52e279d02ff4732eCeB2D67BFE5Add328", - "pauseGuardian": "0xa0444508232dA3FA6C2f96a5f105f3f0cc0d20D7", + governor: '0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3', + arbitrator: '0x1726A5d52e279d02ff4732eCeB2D67BFE5Add328', + pauseGuardian: '0xa0444508232dA3FA6C2f96a5f105f3f0cc0d20D7', // Addresses for contracts deployed in the original Graph Protocol - Arbitrum Sepolia values - "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", - "curationProxyAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", - "gnsProxyAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", - "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", - "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", - "legacyDisputeManagerAddress": "0x7C9B82717f9433932507dF6EdA93A9678b258698", - "legacyServiceRegistryAddress": "0x888541878CbDDEd880Cd58c728f1Af5C47343F86", + controllerAddress: '0x9DB3ee191681f092607035d9BDA6e59FbEaCa695', + curationProxyAddress: '0xDe761f075200E75485F4358978FB4d1dC8644FD5', + gnsProxyAddress: '0x3133948342F35b8699d8F94aeE064AbB76eDe965', + gnsImplementationAddress: '0x00CBF5024d454255577Bf2b0fB6A43328a6828c9', + subgraphNFTAddress: '0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A', + legacyDisputeManagerAddress: '0x7C9B82717f9433932507dF6EdA93A9678b258698', + legacyServiceRegistryAddress: '0x888541878CbDDEd880Cd58c728f1Af5C47343F86', // Must be set for step 2 of the deployment - "disputeManagerProxyAddress": "", - "disputeManagerProxyAdminAddress": "", - "subgraphServiceProxyAddress": "", - "subgraphServiceProxyAdminAddress": "", - "graphTallyCollectorAddress": "", - "curationImplementationAddress": "" + disputeManagerProxyAddress: '', + disputeManagerProxyAdminAddress: '', + subgraphServiceProxyAddress: '', + subgraphServiceProxyAdminAddress: '', + graphTallyCollectorAddress: '', + curationImplementationAddress: '', }, - "DisputeManager": { - "disputePeriod": 2419200, - "disputeDeposit": "10000000000000000000000n", - "fishermanRewardCut": 500000, - "maxSlashingCut": 100000, + DisputeManager: { + disputePeriod: 2419200, + disputeDeposit: '10000000000000000000000n', + fishermanRewardCut: 500000, + maxSlashingCut: 100000, + }, + SubgraphService: { + minimumProvisionTokens: '100000000000000000000000n', + maximumDelegationRatio: 16, + stakeToFeesRatio: 2, + maxPOIStaleness: 2419200, // 28 days = 2419200 seconds + curationCut: 100000, }, - "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 index 4d6048d55..b81c66baa 100644 --- a/packages/subgraph-service/ignition/configs/migrate.integration.json5 +++ b/packages/subgraph-service/ignition/configs/migrate.integration.json5 @@ -1,38 +1,38 @@ { - "$global": { + $global: { // Accounts for new deployment - derived from local network mnemonic - "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", - "arbitrator": "0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b", - "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", + 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", - "legacyDisputeManagerAddress": "0x7C9B82717f9433932507dF6EdA93A9678b258698", - "legacyServiceRegistryAddress": "0x888541878CbDDEd880Cd58c728f1Af5C47343F86", + controllerAddress: '0x9DB3ee191681f092607035d9BDA6e59FbEaCa695', + curationProxyAddress: '0xDe761f075200E75485F4358978FB4d1dC8644FD5', + curationImplementationAddress: '0xd90022aB67920212D0F902F5c427DE82732DE136', + gnsProxyAddress: '0x3133948342F35b8699d8F94aeE064AbB76eDe965', + gnsImplementationAddress: '0x00CBF5024d454255577Bf2b0fB6A43328a6828c9', + subgraphNFTAddress: '0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A', + legacyDisputeManagerAddress: '0x7C9B82717f9433932507dF6EdA93A9678b258698', + legacyServiceRegistryAddress: '0x888541878CbDDEd880Cd58c728f1Af5C47343F86', // Must be set for step 2 of the deployment - "disputeManagerProxyAddress": "", - "disputeManagerProxyAdminAddress": "", - "subgraphServiceProxyAddress": "", - "subgraphServiceProxyAdminAddress": "", - "graphTallyCollectorAddress": "" + disputeManagerProxyAddress: '', + disputeManagerProxyAdminAddress: '', + subgraphServiceProxyAddress: '', + subgraphServiceProxyAdminAddress: '', + graphTallyCollectorAddress: '', }, - "DisputeManager": { - "disputePeriod": 2419200, - "disputeDeposit": "10000000000000000000000n", - "fishermanRewardCut": 500000, - "maxSlashingCut": 1000000, + DisputeManager: { + disputePeriod: 2419200, + disputeDeposit: '10000000000000000000000n', + fishermanRewardCut: 500000, + maxSlashingCut: 1000000, + }, + SubgraphService: { + minimumProvisionTokens: '100000000000000000000000n', + maximumDelegationRatio: 16, + stakeToFeesRatio: 2, + maxPOIStaleness: 2419200, // 28 days = 2419200 seconds + curationCut: 100000, }, - "SubgraphService": { - "minimumProvisionTokens": "100000000000000000000000n", - "maximumDelegationRatio": 16, - "stakeToFeesRatio": 2, - "maxPOIStaleness": 2419200, // 28 days = 2419200 seconds - "curationCut": 100000, - } } diff --git a/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 b/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 index 9c93e1087..59227c006 100644 --- a/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 +++ b/packages/subgraph-service/ignition/configs/migrate.localNetwork.json5 @@ -1,38 +1,38 @@ { - "$global": { + $global: { // Accounts already configured in the original Graph Protocol - Local Network values - "governor": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", // index 1 - "arbitrator": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", // index 2 - "pauseGuardian": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", // index 3 + governor: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', // index 1 + arbitrator: '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC', // index 2 + pauseGuardian: '0x90F79bf6EB2c4f870365E785982E1f101E93b906', // index 3 // Addresses for contracts deployed in the original Graph Protocol - Local Network values - "controllerAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "curationProxyAddress": "0x59b670e9fA9D0A427751Af201D676719a970857b", - "curationImplementationAddress": "0xc6e7DF5E7b4f2A278906862b61205850344D4e7d", - "gnsProxyAddress": "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", - "gnsImplementationAddress": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44", - "subgraphNFTAddress": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", - "legacyDisputeManagerAddress": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE", - "legacyServiceRegistryAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + controllerAddress: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', + curationProxyAddress: '0x59b670e9fA9D0A427751Af201D676719a970857b', + curationImplementationAddress: '0xc6e7DF5E7b4f2A278906862b61205850344D4e7d', + gnsProxyAddress: '0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f', + gnsImplementationAddress: '0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44', + subgraphNFTAddress: '0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e', + legacyDisputeManagerAddress: '0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE', + legacyServiceRegistryAddress: '0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6', // Must be set for step 2 of the deployment - "disputeManagerProxyAddress": "", - "disputeManagerProxyAdminAddress": "", - "subgraphServiceProxyAddress": "", - "subgraphServiceProxyAdminAddress": "", - "graphTallyCollectorAddress": "" + disputeManagerProxyAddress: '', + disputeManagerProxyAdminAddress: '', + subgraphServiceProxyAddress: '', + subgraphServiceProxyAdminAddress: '', + graphTallyCollectorAddress: '', }, - "DisputeManager": { - "disputePeriod": 7200, - "disputeDeposit": "10000000000000000000000n", - "fishermanRewardCut": 500000, - "maxSlashingCut": 1000000, + DisputeManager: { + disputePeriod: 7200, + disputeDeposit: '10000000000000000000000n', + fishermanRewardCut: 500000, + maxSlashingCut: 1000000, + }, + SubgraphService: { + minimumProvisionTokens: '100000000000000000000000n', + maximumDelegationRatio: 16, + stakeToFeesRatio: 2, + maxPOIStaleness: 7200, // 28 days = 2419200 seconds + curationCut: 100000, }, - "SubgraphService": { - "minimumProvisionTokens": "100000000000000000000000n", - "maximumDelegationRatio": 16, - "stakeToFeesRatio": 2, - "maxPOIStaleness": 7200, // 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 index aedf53531..c9cce14d3 100644 --- a/packages/subgraph-service/ignition/configs/protocol.default.json5 +++ b/packages/subgraph-service/ignition/configs/protocol.default.json5 @@ -1,41 +1,41 @@ { - "$global": { + $global: { // Accounts for new deployment - derived from hardhat default mnemonic - "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", // index 1 - "arbitrator": "0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b", // index 2 - "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", // index 3 + 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": "", + controllerAddress: '', + curationProxyAddress: '', + curationImplementationAddress: '', + gnsProxyAddress: '', + 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", + legacyDisputeManagerAddress: '0x0000000000000000000000000000000000000000', + legacyServiceRegistryAddress: '0x0000000000000000000000000000000000000000', // Must be set for step 2 of the deployment - "disputeManagerProxyAddress": "", - "disputeManagerProxyAdminAddress": "", - "subgraphServiceProxyAddress": "", - "subgraphServiceProxyAdminAddress": "", - "graphTallyCollectorAddress": "" + disputeManagerProxyAddress: '', + disputeManagerProxyAdminAddress: '', + subgraphServiceProxyAddress: '', + subgraphServiceProxyAdminAddress: '', + graphTallyCollectorAddress: '', }, - "DisputeManager": { - "disputePeriod": 2419200, - "disputeDeposit": "10000000000000000000000n", - "fishermanRewardCut": 500000, - "maxSlashingCut": 1000000, + DisputeManager: { + disputePeriod: 2419200, + disputeDeposit: '10000000000000000000000n', + fishermanRewardCut: 500000, + maxSlashingCut: 1000000, + }, + SubgraphService: { + minimumProvisionTokens: '100000000000000000000000n', + maximumDelegationRatio: 16, + stakeToFeesRatio: 2, + maxPOIStaleness: 2419200, // 28 days = 2419200 seconds + curationCut: 100000, }, - "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 index 867873db1..77c802ab0 100644 --- a/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 +++ b/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 @@ -1,41 +1,41 @@ { - "$global": { + $global: { // Accounts for new deployment - derived from local network mnemonic - "governor": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", // index 1 - "arbitrator": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", // index 2 - "pauseGuardian": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", // index 3 + governor: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', // index 1 + 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": "", + controllerAddress: '', + curationProxyAddress: '', + curationImplementationAddress: '', + gnsProxyAddress: '', + 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", + legacyDisputeManagerAddress: '0x0000000000000000000000000000000000000000', + legacyServiceRegistryAddress: '0x0000000000000000000000000000000000000000', // Must be set for step 2 of the deployment - "disputeManagerProxyAddress": "", - "disputeManagerProxyAdminAddress": "", - "subgraphServiceProxyAddress": "", - "subgraphServiceProxyAdminAddress": "", - "graphTallyCollectorAddress": "" + disputeManagerProxyAddress: '', + disputeManagerProxyAdminAddress: '', + subgraphServiceProxyAddress: '', + subgraphServiceProxyAdminAddress: '', + graphTallyCollectorAddress: '', }, - "DisputeManager": { - "disputePeriod": 7200, // 2 hours = 7200 seconds - "disputeDeposit": "10000000000000000000000n", - "fishermanRewardCut": 500000, - "maxSlashingCut": 1000000, + 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, }, - "SubgraphService": { - "minimumProvisionTokens": "100000000000000000000000n", - "maximumDelegationRatio": 16, - "stakeToFeesRatio": 2, - "maxPOIStaleness": 7200, // 2 hours = 7200 seconds - "curationCut": 100000, - } } From 51b220837a61965df8c577e569dce9fcd34896d4 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 12:43:35 +0000 Subject: [PATCH 15/29] refactor(horizon): drive governor from config parameter in deploy modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six of the eight horizon deploy modules hardcoded `const governor = m.getAccount(1)` for transferOwnership targets, while the subgraph-service side and all migrate modules read `m.getParameter('governor')` from config. The dual convention required anyone touching the system to know which one applied where, and it left horizon's protocol..json5 configs silently missing a governor field where SS's were not — exactly the gap that hid the SS-side localNetwork governor drift fixed earlier on this branch. Unify on `m.getParameter('governor')` for the six modules where governor is only used as a target argument: - core/{GraphPayments,PaymentsEscrow,RecurringCollector} - periphery/{Controller,GNS,GraphProxyAdmin} Two remaining call sites still need `m.getAccount(1)` because the `from:` option on `m.call` only accepts an AccountRuntimeValue (returned by `m.getAccount`) and not the ModuleParameterRuntimeValue that `m.getParameter` returns: - deploy.ts — Controller / GraphProxyAdmin acceptOwnership - periphery/GraphToken.ts — L2GraphToken acceptOwnership In both files the kept `m.getAccount(1)` carries a comment recording the constraint and the expectation that configs set the 'governor' parameter to the index-1 address of the deploying mnemonic. Adds the `governor` field to the two horizon protocol configs that didn't have one (matching the corresponding SS-side values): - protocol.localNetwork.json5 → 0x70997970…79C8 (test mnemonic index 1) - protocol.default.json5 → 0xFFcf8FDE…409f0 (legacy default mnemonic index 1, matching SS-side protocol.default.json5) All 14 cross-package config-reconciliation tests still pass, plus all 574 horizon, 290 subgraph-service, and 101 deployment unit/foundry tests. Production deploys (arbitrumOne, arbitrumSepolia) go through migrate which already used `m.getParameter('governor')`, so no production behaviour changes. --- packages/horizon/ignition/configs/protocol.default.json5 | 1 + packages/horizon/ignition/configs/protocol.localNetwork.json5 | 1 + packages/horizon/ignition/modules/core/GraphPayments.ts | 2 +- packages/horizon/ignition/modules/core/PaymentsEscrow.ts | 2 +- packages/horizon/ignition/modules/core/RecurringCollector.ts | 2 +- packages/horizon/ignition/modules/deploy.ts | 4 ++++ packages/horizon/ignition/modules/periphery/Controller.ts | 2 +- packages/horizon/ignition/modules/periphery/GNS.ts | 2 +- .../horizon/ignition/modules/periphery/GraphProxyAdmin.ts | 2 +- packages/horizon/ignition/modules/periphery/GraphToken.ts | 4 ++++ 10 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/horizon/ignition/configs/protocol.default.json5 b/packages/horizon/ignition/configs/protocol.default.json5 index 8f853518f..d93d53143 100644 --- a/packages/horizon/ignition/configs/protocol.default.json5 +++ b/packages/horizon/ignition/configs/protocol.default.json5 @@ -1,6 +1,7 @@ { $global: { // Accounts for new deployment - derived from hardhat default mnemonic + governor: '0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0', // index 1 pauseGuardian: '0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d', // index 3 subgraphAvailabilityOracle: '0xd03ea8624C8C5987235048901fB614fDcA89b117', // index 4 diff --git a/packages/horizon/ignition/configs/protocol.localNetwork.json5 b/packages/horizon/ignition/configs/protocol.localNetwork.json5 index a70990f70..a4ffcef66 100644 --- a/packages/horizon/ignition/configs/protocol.localNetwork.json5 +++ b/packages/horizon/ignition/configs/protocol.localNetwork.json5 @@ -1,6 +1,7 @@ { $global: { // Accounts for new deployment - derived from hardhat default mnemonic + governor: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', // index 1 pauseGuardian: '0x90F79bf6EB2c4f870365E785982E1f101E93b906', // index 3 subgraphAvailabilityOracle: '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65', // index 4 diff --git a/packages/horizon/ignition/modules/core/GraphPayments.ts b/packages/horizon/ignition/modules/core/GraphPayments.ts index 4ce5ec3e0..d4b5d1208 100644 --- a/packages/horizon/ignition/modules/core/GraphPayments.ts +++ b/packages/horizon/ignition/modules/core/GraphPayments.ts @@ -10,7 +10,7 @@ export default buildModule('GraphPayments', (m) => { const { Controller } = m.useModule(GraphPeripheryModule) const { GraphPaymentsProxyAdmin, GraphPaymentsProxy } = m.useModule(HorizonProxiesModule) - const governor = m.getAccount(1) + const governor = m.getParameter('governor') const protocolPaymentCut = m.getParameter('protocolPaymentCut') // Deploy GraphPayments implementation - requires periphery and proxies to be registered in the controller diff --git a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts index 432e50743..80589c351 100644 --- a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts +++ b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts @@ -10,7 +10,7 @@ export default buildModule('PaymentsEscrow', (m) => { const { Controller } = m.useModule(GraphPeripheryModule) const { PaymentsEscrowProxyAdmin, PaymentsEscrowProxy } = m.useModule(HorizonProxiesModule) - const governor = m.getAccount(1) + const governor = m.getParameter('governor') const withdrawEscrowThawingPeriod = m.getParameter('withdrawEscrowThawingPeriod') // Deploy PaymentsEscrow implementation - requires periphery and proxies to be registered in the controller diff --git a/packages/horizon/ignition/modules/core/RecurringCollector.ts b/packages/horizon/ignition/modules/core/RecurringCollector.ts index c1481aa4f..48d74eba2 100644 --- a/packages/horizon/ignition/modules/core/RecurringCollector.ts +++ b/packages/horizon/ignition/modules/core/RecurringCollector.ts @@ -12,7 +12,7 @@ import HorizonProxiesModule from './HorizonProxies' export default buildModule('RecurringCollector', (m) => { const { Controller } = m.useModule(GraphPeripheryModule) - const governor = m.getAccount(1) + const governor = m.getParameter('governor') const revokeSignerThawingPeriod = m.getParameter('revokeSignerThawingPeriod') const eip712Name = m.getParameter('eip712Name') const eip712Version = m.getParameter('eip712Version') diff --git a/packages/horizon/ignition/modules/deploy.ts b/packages/horizon/ignition/modules/deploy.ts index 428f2e0c7..6fd0d9270 100644 --- a/packages/horizon/ignition/modules/deploy.ts +++ b/packages/horizon/ignition/modules/deploy.ts @@ -36,6 +36,10 @@ export default buildModule('GraphHorizon_Deploy', (m) => { RecurringCollectorImplementation, } = m.useModule(GraphHorizonCoreModule) + // m.getAccount(1) rather than getParameter('governor') — the from: option on + // m.call only accepts an AccountRuntimeValue, so the acceptOwnership signer + // has to come from getAccount. Configs are expected to set the 'governor' + // parameter to this same address (index 1 of the deploying mnemonic). const governor = m.getAccount(1) // BUG?: acceptOwnership should be called after everything in GraphHorizonCoreModule and GraphPeripheryModule is resolved diff --git a/packages/horizon/ignition/modules/periphery/Controller.ts b/packages/horizon/ignition/modules/periphery/Controller.ts index dd6664925..9ed7e4b61 100644 --- a/packages/horizon/ignition/modules/periphery/Controller.ts +++ b/packages/horizon/ignition/modules/periphery/Controller.ts @@ -3,7 +3,7 @@ import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' import { ethers } from 'ethers' export default buildModule('Controller', (m) => { - const governor = m.getAccount(1) + const governor = m.getParameter('governor') const pauseGuardian = m.getParameter('pauseGuardian') const Controller = m.contract('Controller', ControllerArtifact) diff --git a/packages/horizon/ignition/modules/periphery/GNS.ts b/packages/horizon/ignition/modules/periphery/GNS.ts index 71dc69e4b..4195d803e 100644 --- a/packages/horizon/ignition/modules/periphery/GNS.ts +++ b/packages/horizon/ignition/modules/periphery/GNS.ts @@ -19,7 +19,7 @@ export default buildModule('L2GNS', (m) => { const { L2Curation } = m.useModule(CurationModule) const deployer = m.getAccount(0) - const governor = m.getAccount(1) + const governor = m.getParameter('governor') const SubgraphNFTDescriptor = m.contract('SubgraphNFTDescriptor', SubgraphNFTDescriptorArtifact) const SubgraphNFT = m.contract('SubgraphNFT', SubgraphNFTArtifact, [deployer]) diff --git a/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts index 82d73ef39..52dd6087d 100644 --- a/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts +++ b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts @@ -2,7 +2,7 @@ import GraphProxyAdminArtifact from '@graphprotocol/contracts/artifacts/contract import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' export default buildModule('GraphProxyAdmin', (m) => { - const governor = m.getAccount(1) + const governor = m.getParameter('governor') const GraphProxyAdmin = m.contract('GraphProxyAdmin', GraphProxyAdminArtifact) m.call(GraphProxyAdmin, 'transferOwnership', [governor]) diff --git a/packages/horizon/ignition/modules/periphery/GraphToken.ts b/packages/horizon/ignition/modules/periphery/GraphToken.ts index 73f2f29ad..24d4564cd 100644 --- a/packages/horizon/ignition/modules/periphery/GraphToken.ts +++ b/packages/horizon/ignition/modules/periphery/GraphToken.ts @@ -12,6 +12,10 @@ export default buildModule('L2GraphToken', (m) => { const { L2GraphTokenGateway } = m.useModule(GraphTokenGatewayModule) const deployer = m.getAccount(0) + // m.getAccount(1) rather than getParameter('governor') — the from: option on + // m.call only accepts an AccountRuntimeValue, so the acceptOwnership signer + // has to come from getAccount. Configs are expected to set the 'governor' + // parameter to this same address (index 1 of the deploying mnemonic). const governor = m.getAccount(1) const initialSupply = m.getParameter('initialSupply') From c1079ff4858aeadf80f09fb219d7d109b823b000 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Mon, 11 May 2026 12:59:47 +0000 Subject: [PATCH 16/29] =?UTF-8?q?chore(lint):=20bump=20solhint=20catalog?= =?UTF-8?q?=20^6.0.3=20=E2=86=92=20^6.2.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the workspace solhint catalog entry within the major and refreshes the lockfile. All eight packages (contracts, horizon, issuance, subgraph-service, interfaces, data-edge, token-distribution, root) pick up the new version through the catalog. Also restructures the per-package .solhint.json files. Previously each used `"extends": ["solhint:recommended", "./../../.solhint.json"]`, which under solhint 6.2.1's reduceRight-based extend composition let solhint:recommended's rules win over the root override and re-enabled `compiler-version` (which the root config sets to `off` to accommodate the workspace's mix of pragmas — legacy interfaces on `^0.7.6 || ^0.8.0`, horizon/issuance/subgraph-service on `^0.8.27`, data-edge on `^0.8.12`). Switch each package to a single-string extends pointing at the root config: `"extends": "./../../.solhint.json"`. The root config itself extends solhint:recommended, so the rule chain is equivalent — but the single-indirection form propagates root overrides correctly under 6.2.1. After the bump + config fix, `pnpm lint:sol` runs clean across all packages: zero errors, zero warnings beyond the pre-existing pattern set. No contract source files were modified (verified — solhint --fix touched none). --- packages/contracts/.solhint.json | 2 +- packages/data-edge/.solhint.json | 2 +- packages/horizon/.solhint.json | 2 +- packages/interfaces/.solhint.json | 2 +- packages/issuance/.solhint.json | 2 +- packages/subgraph-service/.solhint.json | 2 +- packages/token-distribution/.solhint.json | 2 +- pnpm-lock.yaml | 137 ++++++++++++++++------ pnpm-workspace.yaml | 2 +- 9 files changed, 106 insertions(+), 47 deletions(-) diff --git a/packages/contracts/.solhint.json b/packages/contracts/.solhint.json index d30847305..780d82f39 100644 --- a/packages/contracts/.solhint.json +++ b/packages/contracts/.solhint.json @@ -1,3 +1,3 @@ { - "extends": ["solhint:recommended", "./../../.solhint.json"] + "extends": "./../../.solhint.json" } diff --git a/packages/data-edge/.solhint.json b/packages/data-edge/.solhint.json index d30847305..780d82f39 100644 --- a/packages/data-edge/.solhint.json +++ b/packages/data-edge/.solhint.json @@ -1,3 +1,3 @@ { - "extends": ["solhint:recommended", "./../../.solhint.json"] + "extends": "./../../.solhint.json" } diff --git a/packages/horizon/.solhint.json b/packages/horizon/.solhint.json index d30847305..780d82f39 100644 --- a/packages/horizon/.solhint.json +++ b/packages/horizon/.solhint.json @@ -1,3 +1,3 @@ { - "extends": ["solhint:recommended", "./../../.solhint.json"] + "extends": "./../../.solhint.json" } diff --git a/packages/interfaces/.solhint.json b/packages/interfaces/.solhint.json index d30847305..780d82f39 100644 --- a/packages/interfaces/.solhint.json +++ b/packages/interfaces/.solhint.json @@ -1,3 +1,3 @@ { - "extends": ["solhint:recommended", "./../../.solhint.json"] + "extends": "./../../.solhint.json" } diff --git a/packages/issuance/.solhint.json b/packages/issuance/.solhint.json index d30847305..780d82f39 100644 --- a/packages/issuance/.solhint.json +++ b/packages/issuance/.solhint.json @@ -1,3 +1,3 @@ { - "extends": ["solhint:recommended", "./../../.solhint.json"] + "extends": "./../../.solhint.json" } diff --git a/packages/subgraph-service/.solhint.json b/packages/subgraph-service/.solhint.json index d30847305..780d82f39 100644 --- a/packages/subgraph-service/.solhint.json +++ b/packages/subgraph-service/.solhint.json @@ -1,3 +1,3 @@ { - "extends": ["solhint:recommended", "./../../.solhint.json"] + "extends": "./../../.solhint.json" } diff --git a/packages/token-distribution/.solhint.json b/packages/token-distribution/.solhint.json index d30847305..780d82f39 100644 --- a/packages/token-distribution/.solhint.json +++ b/packages/token-distribution/.solhint.json @@ -1,3 +1,3 @@ { - "extends": ["solhint:recommended", "./../../.solhint.json"] + "extends": "./../../.solhint.json" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2f67fdae..f9eab6c88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,8 +109,8 @@ catalogs: specifier: ^2.1.0 version: 2.1.0 solhint: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^6.2.1 + version: 6.2.1 ts-node: specifier: ^10.9.2 version: 10.9.2 @@ -203,7 +203,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) typescript: specifier: 'catalog:' version: 5.9.3 @@ -347,7 +347,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -715,7 +715,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -999,7 +999,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.0 version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -1065,7 +1065,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) ts-node: specifier: 'catalog:' version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) @@ -1150,7 +1150,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) typechain: specifier: ^8.3.2 version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) @@ -1276,7 +1276,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.0 version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -1451,7 +1451,7 @@ importers: version: 2.1.0(prettier@3.8.1) solhint: specifier: 'catalog:' - version: 6.0.3(typescript@5.9.3) + version: 6.2.1(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -4757,10 +4757,10 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ajv-errors@1.0.1: - resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + ajv-errors@3.0.0: + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} peerDependencies: - ajv: '>=5.0.0' + ajv: ^8.0.1 ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} @@ -4776,6 +4776,9 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + amazon-cognito-identity-js@6.3.15: resolution: {integrity: sha512-G2mzTlGYHKYh9oZDO0Gk94xVQ4iY9GYWBaYScbDYvz05ps6dqi0IvdNx1Lxi7oA3tjS5X+mUN7/svFJJdOB9YA==} @@ -5036,6 +5039,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base-64@0.1.0: resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} @@ -5135,6 +5142,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -6620,6 +6631,7 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.0.3: @@ -6627,9 +6639,13 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} @@ -6637,7 +6653,7 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -8050,6 +8066,10 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -8096,6 +8116,10 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -8596,6 +8620,10 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-starts-with@2.0.1: resolution: {integrity: sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg==} engines: {node: '>=8'} @@ -9501,8 +9529,9 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - solhint@6.0.3: - resolution: {integrity: sha512-LYiy1bN8X9eUsti13mbS4fY6ILVxhP6VoOgqbHxCsHl5VPnxOWf7U1V9ZvgizxdInKBMW82D1FNJO+daAcWHbA==} + solhint@6.2.1: + resolution: {integrity: sha512-+VHSa84CRjm2s+KZWYxIDnI+NokcLsZHOSpRtg5nBFmnVfh6RPmPaFd5TN922Cfrm2i85kNoQtLiapALe26b5w==} + engines: {node: '>=20'} hasBin: true solidity-ast@0.4.61: @@ -11397,7 +11426,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -11406,7 +11435,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@changesets/changelog-git@0.2.1': dependencies: @@ -11464,7 +11493,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.2 + semver: 7.7.3 '@changesets/get-release-plan@4.0.13': dependencies: @@ -11574,7 +11603,7 @@ snapshots: '@commitlint/is-ignored@20.0.0': dependencies: '@commitlint/types': 20.0.0 - semver: 7.7.2 + semver: 7.7.3 '@commitlint/lint@20.0.0': dependencies: @@ -11914,7 +11943,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -15361,7 +15390,7 @@ snapshots: cli-table3: 0.6.5 commander: 9.5.0 dotenv: 16.6.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 open: 8.4.2 prompts: 2.4.2 tslog: 4.9.3 @@ -15380,7 +15409,7 @@ snapshots: hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-deploy: 0.11.45(bufferutil@4.0.9)(utf-8-validate@5.0.10) npm-registry-fetch: 17.1.0 - semver: 7.7.2 + semver: 7.7.3 ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) tslog: 4.9.3 typescript: 5.9.3 @@ -15933,9 +15962,9 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-errors@1.0.1(ajv@6.12.6): + ajv-errors@3.0.0(ajv@8.20.0): dependencies: - ajv: 6.12.6 + ajv: 8.20.0 ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: @@ -15955,6 +15984,13 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + amazon-cognito-identity-js@6.3.15(encoding@0.1.13): dependencies: '@aws-crypto/sha256-js': 1.2.2 @@ -16281,6 +16317,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base-64@0.1.0: {} base-x@3.0.11: @@ -16303,11 +16341,11 @@ snapshots: bech32@1.1.4: {} - better-ajv-errors@2.0.2(ajv@6.12.6): + better-ajv-errors@2.0.2(ajv@8.20.0): dependencies: '@babel/code-frame': 7.27.1 '@humanwhocodes/momoa': 2.0.4 - ajv: 6.12.6 + ajv: 8.20.0 chalk: 4.1.2 jsonpointer: 5.0.1 leven: 3.1.0 @@ -16437,6 +16475,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -18450,6 +18492,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + glob@5.0.15: dependencies: inflight: 1.0.6 @@ -20379,6 +20427,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -20425,6 +20477,8 @@ snapshots: minipass@7.1.2: {} + minipass@7.1.3: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -20878,7 +20932,7 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.2 + semver: 7.7.3 package-manager-detector@0.2.11: dependencies: @@ -20973,6 +21027,11 @@ snapshots: lru-cache: 11.2.1 minipass: 7.1.2 + path-scurry@2.0.2: + dependencies: + lru-cache: 11.2.1 + minipass: 7.1.3 + path-starts-with@2.0.1: {} path-to-regexp@0.1.7: {} @@ -21784,7 +21843,7 @@ snapshots: moment-timezone: 0.5.48 pg-connection-string: 2.9.1 retry-as-promised: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 sequelize-pool: 7.1.0 toposort-class: 1.0.1 uuid: 8.3.2 @@ -22031,28 +22090,28 @@ snapshots: transitivePeerDependencies: - debug - solhint@6.0.3(typescript@5.9.3): + solhint@6.2.1(typescript@5.9.3): dependencies: '@solidity-parser/parser': 0.20.2 - ajv: 6.12.6 - ajv-errors: 1.0.1(ajv@6.12.6) + ajv: 8.20.0 + ajv-errors: 3.0.0(ajv@8.20.0) ast-parents: 0.0.1 - better-ajv-errors: 2.0.2(ajv@6.12.6) + better-ajv-errors: 2.0.2(ajv@8.20.0) chalk: 4.1.2 commander: 10.0.1 cosmiconfig: 8.3.6(typescript@5.9.3) fast-diff: 1.3.0 - glob: 8.1.0 + glob: 13.0.6 ignore: 5.3.2 - js-yaml: 4.1.0 + js-yaml: 4.1.1 latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.7.2 + semver: 7.7.3 table: 6.9.0 text-table: 0.2.0 optionalDependencies: - prettier: 2.8.8 + prettier: 3.8.1 transitivePeerDependencies: - typescript @@ -22389,7 +22448,7 @@ snapshots: table@6.9.0: dependencies: - ajv: 8.17.1 + ajv: 8.20.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0a60d1cce..fa5c80080 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -58,7 +58,7 @@ catalog: mocha: ^11.7.5 prettier: ^3.7.4 prettier-plugin-solidity: ^2.1.0 - solhint: ^6.0.3 + solhint: ^6.2.1 ts-node: ^10.9.2 typechain: ^8.3.2 typescript: ^5.9.3 From 640f91b258069348af9d62ba121b03a3a9009399 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 12 May 2026 15:56:03 +0000 Subject: [PATCH 17/29] docs(issuance): capture pending NatSpec updates and refine test docstrings IssuanceAllocator.todo.md sidecar captures pending NatSpec fixes: - _advanceSelfMintingBlock and distributeIssuance docstrings still describe the pre-Self-Minting-Accumulation behaviour. - _distributeIssuance and _distributePendingIssuance both call _advanceSelfMintingBlock; one is redundant. Reword "selfMintingOffset == 0" framing on the test_DistributePendingIssuance_NoOffset_* tests to "fresh catch-up case": unconditional accumulation makes the literal phrasing inaccurate for the elapsed period inside the call. --- .../contracts/allocate/IssuanceAllocator.todo.md | 14 ++++++++++++++ .../test/unit/allocator/distribution.t.sol | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 packages/issuance/contracts/allocate/IssuanceAllocator.todo.md diff --git a/packages/issuance/contracts/allocate/IssuanceAllocator.todo.md b/packages/issuance/contracts/allocate/IssuanceAllocator.todo.md new file mode 100644 index 000000000..d1e1ccea9 --- /dev/null +++ b/packages/issuance/contracts/allocate/IssuanceAllocator.todo.md @@ -0,0 +1,14 @@ +# IssuanceAllocator.sol — pending updates + +Tracking pending edits noted but deferred to avoid touching contract source until the next maintenance window. + +## NatSpec drift after the Self-Minting Accumulation fix + +PR #1334 made `_advanceSelfMintingBlock` accumulate `selfMintingOffset` unconditionally and collapsed `_distributeIssuance` into a single `_distributePendingIssuance` path. Two docstrings still describe the pre-fix behaviour: + +- `_advanceSelfMintingBlock` (~L364–371): drop the "When paused, accumulates…" framing. Lead with the unconditional invariant; keep the pause case as the state where accumulation persists past the transaction. +- `distributeIssuance` "Pause behavior" block (~L346–351): drop the "Normal distribution if no accumulated self-minting, otherwise retroactive" split. Every unpaused distribution flows through `_distributePendingIssuance` using current rates over the undistributed range with `selfMintingOffset` as the budget bound. + +## Duplicate `_advanceSelfMintingBlock` call in `_distributeIssuance` + +`_distributeIssuance` (~L417) and `_distributePendingIssuance` (~L453) both call `_advanceSelfMintingBlock()`. Second call is a no-op in the steady-state path but still costs a function-call + SLOAD + compare. Drop the call in `_distributeIssuance` or split `_distributePendingIssuance`. diff --git a/packages/issuance/test/unit/allocator/distribution.t.sol b/packages/issuance/test/unit/allocator/distribution.t.sol index c9cbf0b8b..0ec8e51ee 100644 --- a/packages/issuance/test/unit/allocator/distribution.t.sol +++ b/packages/issuance/test/unit/allocator/distribution.t.sol @@ -484,7 +484,7 @@ contract IssuanceAllocatorDistributionTest is IssuanceAllocatorSharedTest { // ==================== Pending Distribution With No Accumulated Self-Minting ==================== - /// @notice Starting from `selfMintingOffset == 0` (no prior accumulation), + /// @notice Fresh catch-up case (no residual offset from a prior partial flush): /// `distributePendingIssuance()` must mint each target only its own allocator-minting /// rate for the period, leaving the self-minting share to the self-minting targets. function test_DistributePendingIssuance_NoOffset_DefaultGetsOwnRateOnly() public { @@ -553,8 +553,8 @@ contract IssuanceAllocatorDistributionTest is IssuanceAllocatorSharedTest { assertEq(allocator.getDistributionState().lastDistributionBlock, lastDistBlock + totalBlocks); } - /// @notice Starting from `selfMintingOffset == 0` (no prior accumulation), with a - /// target that has both allocator-minting and self-minting rates, the target receives + /// @notice Fresh catch-up case (no residual offset from a prior partial flush), with a + /// target that has both allocator-minting and self-minting rates: the target receives /// only its allocator-minting share and the default receives only its own rate. function test_DistributePendingIssuance_NoOffset_MixedTargets() public { _setIssuanceRate(100 ether); From cf055bd5a7146c823cce89f3bd9112ccb5508ab3 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 12 May 2026 16:07:06 +0000 Subject: [PATCH 18/29] docs(audit): drop intermediate PDFs and per-finding markdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep Graph_PR1334_v05.pdf as the canonical Trust Security audit report. Remove the v01–v04 intermediate fix-round PDFs, the per-finding TRST-*.md extracts, and the directory README that indexed them — all superseded by v05. --- .../audits/PR1301/Graph_PR1301_v01.pdf | Bin 555085 -> 0 bytes .../audits/PR1301/Graph_PR1301_v02.pdf | Bin 589789 -> 0 bytes .../audits/PR1301/Graph_PR1325_v03.pdf | Bin 641200 -> 0 bytes .../audits/PR1301/Graph_PR1331_v04.pdf | Bin 656340 -> 0 bytes packages/issuance/audits/PR1301/README.md | 192 ------------------ packages/issuance/audits/PR1301/TRST-CL-1.md | 17 -- packages/issuance/audits/PR1301/TRST-CL-2.md | 17 -- packages/issuance/audits/PR1301/TRST-CR-1.md | 19 -- packages/issuance/audits/PR1301/TRST-CR-2.md | 17 -- packages/issuance/audits/PR1301/TRST-CR-3.md | 15 -- packages/issuance/audits/PR1301/TRST-H-1.md | 30 --- packages/issuance/audits/PR1301/TRST-H-2.md | 30 --- packages/issuance/audits/PR1301/TRST-H-3.md | 32 --- packages/issuance/audits/PR1301/TRST-H-4.md | 32 --- packages/issuance/audits/PR1301/TRST-L-1.md | 30 --- packages/issuance/audits/PR1301/TRST-L-10.md | 39 ---- packages/issuance/audits/PR1301/TRST-L-2.md | 30 --- packages/issuance/audits/PR1301/TRST-L-3.md | 32 --- packages/issuance/audits/PR1301/TRST-L-4.md | 26 --- packages/issuance/audits/PR1301/TRST-L-5.md | 30 --- packages/issuance/audits/PR1301/TRST-L-6.md | 26 --- packages/issuance/audits/PR1301/TRST-L-7.md | 28 --- packages/issuance/audits/PR1301/TRST-L-8.md | 37 ---- packages/issuance/audits/PR1301/TRST-L-9.md | 33 --- packages/issuance/audits/PR1301/TRST-M-1.md | 42 ---- packages/issuance/audits/PR1301/TRST-M-2.md | 32 --- packages/issuance/audits/PR1301/TRST-M-3.md | 28 --- packages/issuance/audits/PR1301/TRST-M-4.md | 33 --- packages/issuance/audits/PR1301/TRST-R-1.md | 11 - packages/issuance/audits/PR1301/TRST-R-10.md | 11 - packages/issuance/audits/PR1301/TRST-R-11.md | 15 -- packages/issuance/audits/PR1301/TRST-R-12.md | 17 -- packages/issuance/audits/PR1301/TRST-R-13.md | 11 - packages/issuance/audits/PR1301/TRST-R-14.md | 11 - packages/issuance/audits/PR1301/TRST-R-2.md | 14 -- packages/issuance/audits/PR1301/TRST-R-3.md | 11 - packages/issuance/audits/PR1301/TRST-R-4.md | 11 - packages/issuance/audits/PR1301/TRST-R-5.md | 11 - packages/issuance/audits/PR1301/TRST-R-6.md | 11 - packages/issuance/audits/PR1301/TRST-R-7.md | 13 -- packages/issuance/audits/PR1301/TRST-R-8.md | 11 - packages/issuance/audits/PR1301/TRST-R-9.md | 11 - packages/issuance/audits/PR1301/TRST-SR-1.md | 15 -- packages/issuance/audits/PR1301/TRST-SR-2.md | 15 -- packages/issuance/audits/PR1301/TRST-SR-3.md | 15 -- packages/issuance/audits/PR1301/TRST-SR-4.md | 21 -- 46 files changed, 1082 deletions(-) delete mode 100644 packages/issuance/audits/PR1301/Graph_PR1301_v01.pdf delete mode 100644 packages/issuance/audits/PR1301/Graph_PR1301_v02.pdf delete mode 100644 packages/issuance/audits/PR1301/Graph_PR1325_v03.pdf delete mode 100644 packages/issuance/audits/PR1301/Graph_PR1331_v04.pdf delete mode 100644 packages/issuance/audits/PR1301/README.md delete mode 100644 packages/issuance/audits/PR1301/TRST-CL-1.md delete mode 100644 packages/issuance/audits/PR1301/TRST-CL-2.md delete mode 100644 packages/issuance/audits/PR1301/TRST-CR-1.md delete mode 100644 packages/issuance/audits/PR1301/TRST-CR-2.md delete mode 100644 packages/issuance/audits/PR1301/TRST-CR-3.md delete mode 100644 packages/issuance/audits/PR1301/TRST-H-1.md delete mode 100644 packages/issuance/audits/PR1301/TRST-H-2.md delete mode 100644 packages/issuance/audits/PR1301/TRST-H-3.md delete mode 100644 packages/issuance/audits/PR1301/TRST-H-4.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-1.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-10.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-2.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-3.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-4.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-5.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-6.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-7.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-8.md delete mode 100644 packages/issuance/audits/PR1301/TRST-L-9.md delete mode 100644 packages/issuance/audits/PR1301/TRST-M-1.md delete mode 100644 packages/issuance/audits/PR1301/TRST-M-2.md delete mode 100644 packages/issuance/audits/PR1301/TRST-M-3.md delete mode 100644 packages/issuance/audits/PR1301/TRST-M-4.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-1.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-10.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-11.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-12.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-13.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-14.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-2.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-3.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-4.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-5.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-6.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-7.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-8.md delete mode 100644 packages/issuance/audits/PR1301/TRST-R-9.md delete mode 100644 packages/issuance/audits/PR1301/TRST-SR-1.md delete mode 100644 packages/issuance/audits/PR1301/TRST-SR-2.md delete mode 100644 packages/issuance/audits/PR1301/TRST-SR-3.md delete mode 100644 packages/issuance/audits/PR1301/TRST-SR-4.md diff --git a/packages/issuance/audits/PR1301/Graph_PR1301_v01.pdf b/packages/issuance/audits/PR1301/Graph_PR1301_v01.pdf deleted file mode 100644 index 8f14dd018160adebc8b0217c77283ed975780d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555085 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�CYlVuTW@rI57C-*hf)(Ydb%j2)M5&d_7cc8h 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 diff --git a/packages/issuance/audits/PR1301/Graph_PR1301_v02.pdf b/packages/issuance/audits/PR1301/Graph_PR1301_v02.pdf deleted file mode 100644 index e9512ec7ee7fb2da516b299461a93a06fed9299d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 589789 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 #YL?^@m<^Ijg66`N>_?L8b7+GLEa1em@ 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%0DB$A3b_7AZWd9Ac{$;u+M(8dbviy z^6&hWdtQsNz?)4q;p_AS46Es37mDuuX3QCJU(9|u0&AV~lGDqrgqzZyi&odABwn5J z4)VKZ{CXB{i;FqfRy4L@Ij!Q89LD z?_`tu;MGv@BV)hoFK(kG92YMZeV;=#%Pyup^^_X7WhCyKUv*BGcFSA6rxEThcf+2R zQ@ixtV* z3WoB+WwcaiZAoTlHMP!k(e_D6;)H2ecr+1A!m2K-dj}hP2CQPn-_VS*QTJfc$;asQ zA0=*>3q;ilDj*|_7v0YhP8WbwuC;EcBz4N@2CNl(x#0@so_6uUMarL8ZGm#(D*!$0!;Iv z_!qCLi=AXfqZb8YUd(wIUO4ea2y;oDrJWcz(NVjDRS_*?N< zo-alcIaQ_fm$vriwBhc6`b)u1rC=!KjV7Dtb+y{9D_Tob8Hby{fr~b)&3=nf%JxnhXkhQ8ErJXZRMML$n zjdaI50D*ubG-x_Bg+~4XMq;}Y`VT>p|H>=;Khcc;56=%H$NwHO>Dbt9iv2fNBp}R} z<6OVCeM`3or5(T`qlA}5fX+1@-bImt#pa$ynlGUxIc9+FwS6VW9e=WJ$xsM7#XvWs9;6$SV0~gJUrhotp*OBx0|cG{X-B; z5lTMX%)iyU8-_SRF#2%kIOBSV#l0)A8!tc0z)G+`xH|Lfn47h?@bJFbS+ai6Gd~XQ zcW{5+X9t5A2{7{63FpRKyFP3y$Yrr*VxNziXl^Xuv}B7jn)JlQiK0=sTnQn?@aZRz z5XtG;bN({t7g=>RYC@{SklkK>xnjwiDmRk{n*#)s?s{VpC!`|e+48sx*~GeO1vqr|hp0^pdYwMw^!N=IyEc(0*^g;a(IzZ~ z976+8(5IT0TZyRj=n`dkX!iA8x&)?tHOPphw2e%nGaN^D zPoEPY6M?>{aEXTs(r+SR=#vFKy$X1d_QM#{i+h1~$z^wmHPAbJ>}^OOw1~dq@=9Tr zLvn0`O6{}y#FDkP*^iylT;s}Sw(6Hl3GN;rG4K2n!n6%HbV;x8NUK^7y0kSVO!sYH z{eu#P)$J{f4V3di#1bse+;6=#XnQs~vd!H;=AoWS09R?Y*?Kave&}CHsjp40=*n#i z58H3<-NEb&@~C`@E3iLc4Qhv;6 zmn_GplcJjh&9QGgIC_R}K9$d@eN*>rc#GJ}CL~K}^Q{r3u+xDGND(ef`6_sEi3Y%{y3H+@`$(wF`b+9|_6WBj7ZMzYWu>yfVrq;)z;(D~rAwBsTNMH1Y=i|`lm7|M%No1IwG7KZ`cP&gM$5umtH zwKnViHcM?gGvtJOcl&*$^$ZWk8hHsS=H!#=jgEjv;IhoZ)3DHD0nh+j8C?8OI{5y=DOlGgL&y~BSL1tbOzNz% z%^X z22OpLdUM7^Ar7#o%o9lh?#UeDB@~Gy4Pcm_rB47>dsq=zsB^gA z^>mx&X01fkOm;5mV<0`bABHa^y0+$$N3|X~b{aUupJtY;2A2Cwp%2x+DZE7ix5EGI z3$>fy;krZwg~Yn|8L$h9BA|E<@{0DHc~6y8bF96LKqOkk8^*$4(#X@jZlVtu)|}UlkmOSjkrZUNV>arm*$p%{ zlrsF%P|rYk+=Zjy9{R^budQaXGlVE$ z!R&~J3+JAb`;4}VW)hb927JZ(p@`R^u*5T#8W9q&*>}r}yr)rS!ZKU~uaI|VVg{0q zXL=wpRm*l$YQ@s)>9Y`d#|rHP#x?4FC~g!izSrmp)Z_YXsXEoG1{9!fEH^PrLjfI@ zsR!Vd{pc-eJ7p?0CNCA@9O>YIdVrRh*9h5(8z6UCKUieW6dabJ#5955P%f5|I42r{ z!;#`~qL5=qe239Lhv-uwC=^uDg0|@vBrK$W5G65sQ!lnq(1X?eHg4|8@a6)gyH%fP z3Xzr~U3xUQMu&#Ulk}IF4SReXvoC;%wEtmQihv=@%z+gLKfCaqs`UJ&Ew!;93BP(@ z+o+#6#*pH}hEs$5pw}zsQHhbEK@}rno)vG+rEi4=hiTdXmW#+aUn2o(#=9lG zBp#HU5AkHfnSv&Dy|rro<$Gb{n=8KCYP{Etf+1(~f_zK(yJ+F(uA;*Q66OxC!|h(O z4v}NQg<=yz*{(|vzDf63$sn_^`iq>2Q>ev=4O5QFX%MvclJwj^$NYDDD6Q+-=2bH>DcIXC|sdq&U=^i3av?A?OBx(gvW-g4rq1t)=x5RIJ18LAW_R_!sq zS*eECSjXN+9MLIPLdOs|oAsLH9VAIx#UZH@NA-yZ~3zUfq>gIKda9< z8}o}~R$0{c_o4lci8wm`>PXjLf|WEDSdAofob9-pRjXT#9(aa%gUn+$^%;=JoMhaK zJMM-%_}_yS>Ibe6{J5d?p)g>^wI#Pv+#>{=C^zT1GSi!~LxngCK0D9|QWdPR?)1jV zAMIr*yiRwH);GI#%fy}BY0i`k^iM2z99;;#WSpFho^(yDRPa=f#d97f3Sq&!NR}hU zJMV9iHr?ygAQmG*m*xanM|nn<#-%%lo0?@GF0o(2o#>Cd##c~XFqIl+Cw$0Fhw9)> z?gQy{#ZvK~wyR1mu^VVht2b7pJx|yAESrf~#$QmNcbl;-Db91d;$_7$^gj@Q-_K1C zi{o{QC zr-*T#^7$J0wFWogS^9m!A6r+yr(k*i~?`EBR`u>FcgK)2+c@EhqI>h7#}M*>9) zw%Ni6jC~ej3w(;LSt=&f%3E;TKd7FGpR0{+B=V(fK%4`e5Yoac znjMgcEZ4!AE-yLFVok8>ZZF@otlerT&vLHoWvZ3m5rAOwN!2P)7!Iy~_4B?NDz|9# z<|?bG&V0JY>>o{soaO%LG&hFzlej&{x%oSoJ_D?t7rk9GL>FN`T;U0++OW+q&*Rjc zpop+9aZRyj%V&V%K8)!72KN5qGH)~Di@Eag9*nYgO0LGZoyixSVFZi{tS#ZBFKk8?2E8FnX;=2U!ZB!Xaua*s;uFl8N{$@Wn-Hqlm zplp8Pc4H$QiB5hptZD4p^ntyrP9I;43$rJMwUHt-IS_1-a$po1pFl2*2gg);)iXC4 zSKUQi>w}=Cj)1Lv;kiL!S#BRjXKPcdb4s(aBh!^ZM!8_Pfoox&uJqi)Dij$V6&V4s zVO!{okI`90O5YAMw?bKmFwvdiZ9$XHXFEi(D@{J>8*T?A#d)$nE2O6L-<#}!>7p?<;?rzV9gxX z*x`|5>((oKIfq;eK+)NR7I4!|@=-Q#yZty9THwwXh)Hl=1C2>W%aj-@MVPO-|dE zdB>44wfVMJfxvGcfY*89#w7t_B<;H%VGBD`qun2Fc6*{4yUFgWP2L8$oq1q6x`jzE z`30gC`9F-kV{>R-pmiDBwr$(CZQCcdZQCcdZQHi(Wr{|YjwT#!XcTxcT!7oIvSTDB$8KISN) zL`!fB8WJZSNZvkpPvaAF7>_+^sm=h9C5TAzazA2v+H5wQa?z_Fm(|hJY_rh+Ih}lZ zI)2=}ZVq2h7InRn>LvgzTOsch)m#6D7hBNj>;A(wbM9#+Lm>S;$=5bD>c?nu-*B$7( zwI?#K50vMI?l7+J`TBl3QvbK|G2Q-kdOqHIH}030yY`EL8eAoqoAB&5yAHXjaOrxS z>rNQ%2-sXO9!DZh$EE+nZ>$HhSwc%r$BzUfT_JAWoBZMU8VY3Z#@pEjfZM;L^tP@G zf5Nq^r_cGT$1v6_GVShpzsDwTd!?*JkEOnR{MmAUnKnmx8>bW8B%}YPxCDjZwpd|t z!H#oOr*mR4VxFr_(Wy2dk=zEq<#9UYs4{CQjy4pifl`^62KGLJ#50}h4q|_#3hQP4 zq~}3vTTrjnU17KeJ(8*=S3jOIPUtLAzcbwOLqsn!&FfN`{W+R!z<=GFG2~NzOta#b z6!OX!=fK59MRDrV+c$ZpiebmYx0Zb=z~4dWJOj@TNY%XDCa5xn?Jx%%``P2#GjQfg)HQYz8$|?@hjE}W|_vkwz2lE5Y5G9%c6qGI$5ArJ>?K>0>jI5V4^}Ofk(WT1r5niU9cw z0Pkyux8GrI=N|EdbkLXve)LDPRhBa4XhtG2r(+e7R>tAsO(*dtpSwfofhC4UD^u!% zW`$^PYPBrJteZ>Y_|JN`ERd-_$^gsDI>G{6eo1^z#FLC#QSKkTbJ z2+em32cpS6h;%m|mO~vBU=~8L&LWU2-|YF#5Xu8z7NIlSA_$#R#D;Hf4MGNv$x#>T z`T1_K&J=z>bvE~Uq1`K}YQ>Z^|H;3mdmcz{l-zjloEifzx&&qE$BS~z?@Ma^C_GO| zh)Va0fl+f5Zm>y?5Jv4&fWLjbhG?Y(GhZg4zw)X5<4Sok0H=72YT6@;V@!E*3e?P# zd;XB&v0-40$+J{X_>)?J?1tFd_Z0SpO|Y^@=Hiw5Z7?ENTWGyn=v@fj%8Uc?yX#=& zkB5kQ=uXR@1?pO<3CkWc2D?Rf6vOuDIDl=?(uLC4aCrbu2xb^pp>HV1}(t# z+D}l4PuuzfXxjd?%>5;zgAkh%&6YB4_wE?zH>e${>F_qk2fxcGgF+=y{X)3b-#yG; zAGi%fW}bn|gsEX<6;5eVbfr0D2>i+N<3xr!XUV@2$;1dKoU(XQaHZ{`*zuu4q~Osg zDX#i548tr1m8r|^eA0oZOD#}y4M-rh;o$eQB3wM;))Aa29pJsLQYMvpJFKb%gBQ$@ z6DL7Z1R4_B6zbG@4X>CwB|ffEkA{17pPKfDSV_P*5ody98JZN?$s5H?BhXV0S97+= zEU(vXm@Vf|zB;^nuPkFgyY1zm5+mn3Jh1&&xVI0?OVYyu3t}*(ee&@D4EBeCp}$=e zkUk050xz&D$<1g~_wZ^rT1yarrOXX^C%77fVpVei|KpPlHFr`3vKQix`BsUaa%dPV zk=Exu6sY>;83>j@80ggrRM6uqs%e)m@xC*qXX<*?Z|W)L0X9F-^0$qV;q!dRl4Tpu zF#sHZ$kGxC#Mv2i!`q3Xsy79~83aSKgMDBeoDjzV#%D0|uIxy6ExVcU|6xg-CDpC{ zn5fNVq{mLlz3$aB*!W1&JdUJmv%(=H+NW3vuU9Qhfe63w$$#TSweKy?McO3Vf{gUv zb6cgOe>C^MF{dG-=VBFl7h%;WsR#nd`zCDd1o2InhE)SCOUTc^foA2BGt7FUCjDlz zH^BOiM0)g0$3Dtdbh?B7XgVNzUf)wgt+wk(g>w>Rx7bBEkxGaj-a7^)t?bzk+Oe37 zEj*kGsh1{;WK8-oD@H=xqkgwm`Woab7r`-vHH9w+_~Eb6t5%3u8qqL*k~LwJOndf? zQ83801W?+&7YZgWx1!PniTlS01D;AVwHlF+XD$g6+d0L%kT^6?gI;Y9GLQw#(;3khlju!BU-W35qWV6D>{y2L zrW}*Whj|i12G-El(^4B|9v6kL<7MNRZ zh7IrpsO$&q6DfQV{_LX9`JUx{UE^ZCTRW$$o(W0A!G_8Ciu`Od0^YEk{7W-7^z5cf zU4jRt>vLq@rQFv4zL6v)s1E)F@7ym;YXYuIY{;EjI^Xv~&DWc1XIypV_8CC~v(4ocRq_WXQ1;U=aSE zjgSyYz2Xll7lt?`6!1f%h9CPP##S)=b`!7;EsyQE=*9OQCHMg(cR}-1uBFL->x5bn zvON~3_8<$FYI`BPGaep%Mn7^sWMZsNKp-`Lg$%IF$%ZM3c|OG^x(goi>RBB9idcj_kSLk#6t?YG+$?U2?|q3OcfL$2c0_|A0CVU)0nU z@5%={J{crURUMvy!S=EWA5sjghx$C_O}*l%;{Ix%L^fXei_DLN%BD~tNd|6<1LxC^ zCAVm^1RGq~Rva4Q82$Omnr9f=&BN5HxuC7OXjwYy5>D=luHm~)y7T{sJ6yX3Zrabr znKP3EKBj@wGo#R-bREbW+bi|Gnx420m*OCnR$jPyokEr4TOj$*ie~{3w>^GAd4FEy z+_Op-%m{+HcJbMuhRMuK`J1qK{o+1v&a>IN{5JzRAc>^$}BrN26^T2Bgvx&8_3r>$TYm= znYocgKRY7C6F3-QI#B_>fsmg;w`15?*aGyPrhEf`QRE>b)^WgdeAfK4>f7oMaRQE9 z5sb1-H%woJ?BYcjVkM||oC`6tJh$P!>kINtnFV1|!%P#IZMwa8aLrhZm6 zdU#0nwmvqm3$DmZbA0>l;V1AQqxAS`Zy>vtClWER`P*(OTk zpoEn`SY$SYk0nYe-M{&MO&e2=qp8oY>*&IrY3lH~{ysa*oIV@Q&&3qnw;#9id9J#O za+T1xaf^+^53`GnS*9-UC2duwzu1kF(p$AtT(~bKRCLwHLHM1x**p(FUSE_D#BcgZ zrF~Jo?9qZmy%N!M>DqEU{`W8YozMFs{8>DHt}jVQn#15(Kx+6@}IZYc?^P~f*x3)X`2&k zwSbq+8ECntpBgH4Se=ys1z$I2E)pWN0y&#__o7+yM;4id!|BpQ9+d&M-Ss9Q8tI?Y z5)H5je%K{o!FXT-i-eE}*x_Aqs%8G@ZYzSCUwUqhRYtI*S=KFV{!8^g*w0=Fx#Zga z$Qxl8_^~A1RIHc(kvBTz?*Y67Z~TY@F;Zov<$OHk8N`fuLqANJWS$V=KieK-qM-K> z57MXXx8C+NZ-?z?d2XM!8`6tRzOL6NPya)2F!nxuTKPVF>pJk?m-7&UGooEGuu?;W zB{pUM`aXJ9kh36X>H`pIze7K7C zL=nVrLXT(}%vdwBut~Fk5XA@P&`1yjh%8%I{>sP!?1XSlPhM<%hU7#j=Z0Aw)g)5jIZ7C4z7MU-Nn7JdgH0#H?>Bl6rsIa_U$BJ~X0 zj{xE0x26uX{P5)*CRTbh94Y0Sx3ULF3Pz=b-Bdmqj{V%ED*4O)4Aiq0P0vqyW<=FY ziwr=dJ6CtI^b=hvGJRL|6Oam*KIQNXje!9`PjnGG*Mv34ROzw0 zh0rgLwFOL)KwZ*wKTK?}1~xiEBarFNn*oxw?UydfSteu3G!+b*+)GSxmN5$an_^N0 zhC+SL0ooO}JBsCmRa4Mnl&IcDf6;sbTBn4T%689%}uy#5h&cDaBSP z+USU}1F-k@wtl);Z{c%h&_%15V%i4u)VR@rPeL?0q%)9DAQqvCh|GeDC@&zq)|XG% z3)hQJI%WLfBfl4E8uD)Zd&->0!}!EqFsu4UrBQ-S2df{66sEm{aEel(NCDBo2!(OdEMOE#o+5W8ahb18b^`m8_Kt@gH8$xL(Bqrd8jz|FZe_ zONWgLM6aKBU#Jk%d!!v=@zYNMKYNV1pwC;;*X57}G(27%-fDUN1qwBsB&(_PNaA2sz4rzMWCPbW0r2FBY zC94~W0x5>Jnt+-FxOIR$Um850T{!YO)P%2h7p+1aXoAb6dHxQIUXV9hBUD7n{`#D= z>#Id_)lyMufUME2cT4`=bt(B>Au}XmPz9Zv>`ZPywsIq}na}3L(ndPY(Wbvk^OFMo z3JSAHi*QW+!h%%G5jdT*TK>JH(pg|SpOf4jJeP#o(x|Ua+0yM4l|&_*S4EA)YJdcdG0IEMVb#xSH{P72T`Xpx4MRk~`q( zz9D-or{-4aNQ`<#h*K-+c2~roXd~>qR?%I>Db5VCf+<@7&b?a89`hdUr3r4;B%I*C zeidoFi;+xULmC_2M*t0}>7tb=d56<@nB|TxztZPl3QRc1WT;t~;`;Z~R zI!PaO+rf;2vLfe)eF=pU3vj@05@zEV85SRNp}AqY0RkWl9YN5cDrQ+o@?_x5O_E3M z%>?)fH-r0!fmP!?6L=%r4`s>2EcQPJYXi4gy#qz;^~6b zB9UD9N0JwbcB5DabAd3R%@^K3Pb|;mB(1HVn;hYhQl?Xy^YCnNu|{BM5e@yEzUkA! z*R+qQq&Y)Yl7P{XwoG$R?r$i?8V(qcblfXxZ-sW7sOMqU9JzqUrC{!Z?gTk>fYjS9Y#j;JHe$xIR)mY(*n(5)PwRA21koT-0DyJ6wg zbk3Eltat?8GuhBx0T(-u!)e3|0(cdhQs zy(C5~PJKi>gr3#FFiovf&1cd^a}J;25o3G7 zL$6$66uWW@wp4xb$W~X!c~kk`qG(d>v*U#y%wRq3QWof()vEb$8X zz$Fgx#=n;0Y+9a;IGzdDRkyzVe9L6-gaC)E9$W*P`^MnOuHk2xzelRc^!>T-t&AjD zlSb3q`1$imj4Umq)Zl;Jw~Ju?bgFf-nTS@D#H8`78M~cLJ9yFT6(zTFh>Nf76>0d> zC{HCViGgdKr;=LKZIoe;TK6z$*U9Hq1g5q$y5LwvVCv{9oGTgKJsfz<|0y~f?_S5) z5yl8`nkXEAG-LZGK7n#x&@kg=5;KDWcO8mPON%U>u^!f7YC@{%#~JB~Q3YpB1IfU> zsWOoUWKM^Sdd8@4KgLb|Y!lP3>V03FqE6~o&BqQNRDC_SuhxLTCCRIv(e*}5DTXhd zMEt?2Xp;cjsSo8uM5iIG4&VVSr8<4rz5DoR=!rDf3~=Ii_Lh%6!Gw<;;WDXXfIF&3 z?O%pbDBND-zDaiVNFK@5uj1tFFG5qZ27tk9DlC3>(n6C@!2X=}_VLGiZ6>L10cbo^>82<<<_{X$dv?8d-~5Kr--OpLoIJ}Ix%gu7NQGLk zF&(H~x=O^W>!A%oDuW5_8hZ`=O@#5)asRa)Bw5Da5Y4@k}*dH{VxuIzd3fu1@`;#}d956E52w$eJ5|@RGm}v*_Cd z|8X$M_12ZznB?lp*f*$;)5Lf1@vGNUO{4GaJyQ**MLr1Ss4Xi#deN)ZI3czZ5_aGu zz74#T+jB9}kU{5P6$iv>kjUN|X;9!l>Pt;Sz;gr>PS<`3OhSJ*LhV(BY>DXz=+}R8 z=fx`Rl(CHe?7`LLNz5kgyF0QVqut7cpn6iaC%*n#a`F*9A>gdUb?@qIf9;vzW?uB) z{&5|uUdRC#hksEtM+sY}Gv2*)W2@htUk{rZSOSX&wnK$JP(uT$8ti$jxG5Rxv`FI! zK()B)I;cXdrC`*q)^c42B?q=80&n|+Vq-zk6uufG&Iq>QRa;DxDyy|>qh|9~D@#Fn zD?QDfU1C{Yan?^c9YiQ>W0a-gsDuV6t~LpUT%0`wa0u~Xh#vaF z!2aylhi85;x2emE7ArN06auO{Xz>x^mD3aB%gDx%ngrRdZ%vMKXL4{~g{EG4ePZFYOB$3ApBKoPh`bW+T)tF ztbBdrxOu0kE*9mg0q3vO%+Ux+YY#QdBZCv+jvQ(IMr3O#F6%StHl)YIZ zZmGqOplBTn)sUpz(_Md1KFbe#p5e0FK>IL18XRLeqa zdxWoKM)z$CoV*X|Oz7)7u>`g!!%2FqO(KI$qZxi^q9l|S`A048sy%MiGE@>VI+aK+ zg&>X0V>~)$^+-bI1ohca|E^K>HC(wl$WeShzQYPV9}wf+veO%Y);c`Bam}BhDxA*3 zA#oon46*IyB1E;^l>@CBjp%VwSuC7BN5C>?BnLf6|viC z_JVLbm>+0w!_o;IMnxcBl>Gg>TQd`otlcEN@+|x5U!Ut`>}iRlDT{TcW{aivjozKm z>FcA629AD|>-U0^>oMz!muJDlRieam!-~En5!FGjWZesmM`asY-OSUEG-H_U1G}P? zn9uF~dlH5wf66BAoRKfO!-JO|>}E8r9nxQEK`iV$Z&nIvsO7qqwM{d0=xJ@$!V83a zO|-Q~0$ga#_yL4Qvk^OVxC!#^!q>h)W+6z7BjLD}Qzh7ItyczeJct8g!Jj~tqlW6+ zohMEC*g>ggJ>xi8aWbo!vD?=vcKZJ1>b*d{Z{$h-jDY)?$SonszGH%};+TAB#>`U!Jbr8sDz2Uu`tAd`GRzJoc5tpI25c ziwEWS6W%&2wfbJW-R*bZ9DGn3{{K}zy8EIU!XxISNzFCSmXGh}dw=$)l-AmDL7Is{uydR}_0Pfy*y@*&!Uop)DsbS`Q%dFG4L-E+VUj(6-rN?W1fa?K>R9=#ozhZuW|cu3O&o+sde(_sfu6!^K}Gz#&_bh zHCKN|-me{N-7QaXC{Z_nPOLORpT6I?fN}cN0RYdJMEK`$_$^%e2mM`Mzb2pZ!sdqi&=cJ)v z>v1P2&H*)=gtz6c2c+OTlS~}2IVBMq<}QAn);%VOu#-lh^Th+6jVGr)c5(*NEG|YH zHxGA>!nZA_)V>tTyN6=(nbrLWTOK;aym_QUp6dYaKzWHgugYj7h*JMNE#CY?b%)pK3#=qSd|cKTpMPF~ z_8~5?0VcxJab6S3#2ZH2!&EaS3@CPiL4xJOuHd?L=64*bRMiNo!hzGfz$Nk!q%>SA z0qpycAJ#g2XhZzpj0k~`kw{~lG1Za5;pk-V8`q zB*7cFRRpcke@PK~wyfzRBR$Gc1gVJh7MZ2 zQ5jy3i3l(Z!SkB?d9!m6L1t;sIOyza#(M+2 z2~2~+P9Ef*9Zr0NU$xL(Dhrx-Epb?OW$XmKdg@~rfo6aroW!*`hexk+)UT~1CX&Uh z&<)PcTXKlr9VjB%4E4m|L+!^h^Lo<(+1f@-M28-3B2%INRIA9?fW!3?T9Gdxn~`#V z4e+GM5dlxsNAI9W-`~IuZx3!uXYdl^$J|{nVDNq*Z(W0e_P8J_gwVvmE_4U%5#z=C z=MS2TMFL2fNHpct2W?22b5)>~2sthR5gcY25n@eqVuvwD>*A?A12Rj}k`fQW8G3j& z^4puJk&<{+OS7&}LWFH{1C~xW#V}B!+%2R_nn4seKw+Gk{>rrRPQ~BbDHfO;_=>K^ z9~>ejXM`{)>+tN(3+oKKfOi^gu26 zilQTyL=FJEl46CU2n;P7COdC;*3^l^8`>O4fHe@?O+}N%&ggOlG;9JG0QXl2R2jv= z1yvaFLiPHD@CNl0O7wiVonL+x8UjA*`P;LVVb^oR?EuzaCJl17%1HoOxpFh|spF8s zPkH*VZUYdqFG=H){Z=F2$6gA5|AY(x#u`JQR@UXpu`JVyfRyjnSf!|^glFyXO}rdE zz6l*VV|XdYKIu}q0rcLW=iPf4!+*~mj~Die5s$hj$C)pGdYpKKaWjo+r1Ru(gKLBi z1)560wxBHQjmX>xl&TBH7uWuf+m?fFG!Sm|3G88E6i)*R92(l3ghaZjeE+x>G~$6! z_L6=z+#Dq$)F%d{-!iI(G8)XQLF*8?XU|eiX#u;dD!4HfH4P0u&V4!5P>j4@GK|BN z%baNBfa2fvfmblMDhh6v&IS!}E}ibb)pW3Mj09ai;T`CRW8sEr=rP4VCM<{ySJYG{ zNC_MA9R)7fHDa31L(wFZ9ib4P$&NCAY{0r^lY>uKDg@aii@ubz$K@65uvx);EP2Iq zgkA9R;Fr5)6$$FNC}vQ1gT>huAATiXM7>zc@}$U^fj4+5AmWHGD)wn6UMswm*hJ18 zD0tXO%0a8~e>o|qA2JQqtqUv=PC4Q5O@a)3SmcL5CEODGA2ishAR2NmWVk$Cn*f$$ z$wR0gzfeBvDusII?Ar5G+#6aJmPEfxWoaybroLSRZxuA8PiA+(l}@*641?3@=S4bn#~|qD0gG!chHp@Yew3MZ*EuJ#Gll=1<5zWKj2hRPf!>#vE0K&L5l`-X|~8s zgfby}mAJ(p1#>GMdS|I(UuNGlv82*$v$E+rn#yo8&1F9%#SytFR=_Hg$v7L#OPo0^ zYlLMeEuSnIF0QIsU;WyzI;qf7>J?(@<4Kn`ryc^qAa8aFw&t`xhl!zKdkqD&PXQE_ zd<0P;9Z{?BrB!Pp)zW|oA*=St$WCbXNXzw5Iw=dIRO)D$rf>4~vPNiFD+Ws7f(z4- zw8&6W8lsJ9M-;SYx`c|vaMy^`LIA}{1u+55)?7qnp`FP#0*h_}LX=@$rcus}oyk_p zFm}OIW34dVN#O*}+peS+V|)b?W>JYvk}u46l?Sj`@Uc6keE!so(wBS39L5J=H%of< ziP0vC?M8b7%dbY^?7gqpzFha9qyw-q)cZfDl`5Vr0_o2Q>_wj%MriXJ23Oq7YM^Xl&YMtno<5u5; zp%I-qg+8RK{O+g;O*6PbNg5fs^qj zMPr{T`)=}$nj#p#ydcE(%AE5gf>4K@JI;YXQDl~aOL;J`IqAqJX;5s)GVAs5>jyQ< z=8>y_qtRL{s~6*N1+Z+F20*}K!x8s(fJdj!PI#=|V*_&xJ^R)onXKi?RRbnls_svN z4Oo}TtfC9BzQ34xORchkqN^+>?{&iw$1K@y#VE+>=@K+a0&aQIL9~fk-8gv{hPwES z)G$PjEfAVCmlQ{R&)t*ziaH3}uzM4CU{pSCau{x_#r&gk7i$BAWhyw!RYgLG8DQ6j zWqFFX+HNe!Ep}%Y9I?o*z42yC$G&O*O%Sj#mRX65_WKSoA)1uvM7h>j{LN@4WrjEe zNCaEVdn8q7RM;6O%0HD!J%cx9HPT>}1BXos2d_h=%-^#o2=9Wg{dOck{0lQFpK;lr z{%nUv^`eB5Rq4*0!Q`82%xzl+KkJ=v_F-Ogp||IC28gy1XRy)*J0BQlb4Mb+B8yDD&v$dQ)PI3#OeM z+oDf5r8F#AaBrV0W*Zhg#o{6AR5=pMJX(q1>8Ou z!!F;f&YFFtzWC_57WcrEmT9t;g1_AI2x+>nsi1_I2}yYPl3=DSq`frWbtR*OZjUem zuO7GTVNLmSR}+330=(l^4nE3HsvYqF*#ziILTkWs^S#5uK2s`YZ*>rZKL zz@Gf;Qm0o4!%P>-PI|18C2_xrl>Snm_Y?tSrGrb-&pmvDciWMF6;vro1)Q3x^g|Ft zvZI9}*?>FotC3dY018~qU!!LxGb6DWn>kp5F1QlGI&hWPIQlw9#yz-lKheF_aD zf!80AU(uX_J#-=G#n?$>L3Fe1y3`q{lTL@DM=ov9ouUHYfdlrYeZo@wM#UDa;v2~H zwXh?dlBAY8$#YV*nmXe(35QHG0$9(B2lE|A0NrA zQ4z1Ze2F?p;NSb7Z98q?^)QAdG4*3SRCwjsjIQnL7HOr%lFbFOq?$qtzsu_U5^7*l z(Vb>QrN6;W@0U+-L}jQa{FCw+8zJAu+KB-OPpnBI;Qy3)TQayD+6e*rC>ZB&`>>2R zO-(Z4TakDxplYL4>SJW81EqD>6-+CMuDw+4D)Hi)`oI_TbwlFZ-V(iyNq9f>IQiN_ z0t4#5M+Pk06i;1I>Iu*G%Oi+i8sWD$`oC;|cMHe3ojrvxi*4;GxXpHoRys7~Bm>LS z4G&!18cKaVV#Cf_olCjeY9wf@tpaNIi@7jM2utij$DI*_1(L~N7RyEE{G^r*HzEU$S!zp?>y?m{^<|8c7vw=;yHr{54#}L5`=LN}JUsGuS zzYOKUax&LnRFeme2xFKXd5PrZ3g49;2kWUgv#TvN91-p*JAC!B;DOAg_&Ya32e@b_ zPnT3{S9!W<;nX<$XxY@Ze)Q&YCwhJ7jYW%TyV#|0gIxK_?h#=2$n48{&8FVTk#^?% zj+>FJoc6Lyko@ zv+YVW=zclH%XbVv4ICSSLRSBufeh$kYCe5wT7 zY(qTaTHBy<&|WsQVs9g`xkA}!)$*8fKPvo);ucqWte9M{&}8hOPtax-xy}`r))iFvHLZ5#gIwI-jX+bHArfY!_uES)-`CZ z_mA);gQ#%TJ3XKhBG>;VrC|PFr4+0TjQ@k0vHV|UXYBsJ$`0C>!a2hHZ)Hc+)Boxy zv8jiw*~d0W&u|XO6j_l3Uy}Uv`+a7Lj#6sFCB%KT4XkeZ-^|R^j2D~uVn;RFa22dx z4^L)`En_F;X@74l-Ad~ZUq@RnZ5$uU>T-oe<@3ea=S{`1wEd)!-pZ~YK29$eq_4*} z4b=Z*%7HEd&HFm+GJ`GeEGn=v(FZd0<*9CqwPupE-qTN)&4RaSzj*vPW3!ToRSX^ zUOnQ)R`xg%JrgBWnBZuay~#~1bPY~38|MbSzzLmH=GX096lsLZNotKiP@E|~R{l5x z*>4_Kc|Ed0o@T(afE;&}hc!06`oQ&B{ObAW;=RN$p*6|+P(y41C+K7WrDSFT;6xBf zM^OGqB;yfr{*V0Nc!IRY(xTva$+7C>-q4KQ{o+eb20|tTG_itp~yj|{T51nS`{gw6zDO!=}<7|{XR{V+OIkU(+G z&d3~p7WluBAX+?-YkoM)?k(Qs-QOMtQKGZrYG?QU9YgA*=N_cVIX;ZKv+(v?{(xG# zzk%K6Ev6ODyJf|Z0YnUi87|@d6~7zq_o?^ly&?DxG-@3JJX5;dSpo!|srp19;vo_W z(o)<)=MF5$xcAwp0VubPVAcm@nsYJIiLNLiW;gdw)N#bm1&%(h5ah3eQ2)u3OHu@6k<;e{8fiI@2te{pPo=^(j7sSzd*WIxLQ~%-hIg;m zP)I<>I*1a5hEHMLD>EhFb#r;C4S;=o@z5hgCRUBuB;lii1W|y|?Hl&zYmW~qp20~m z#$T2P1|67)X0RX%<f0&&Xr@p#D%$6%`NfR zF!c)X#kH#Wb`@!^*ctHt4w?l?BR0D>F8O4{tGN4~swzZJ$u%zdS*YBq>pO#wqjZyU z-ToM;H$OL@UVM;I&cQ`aUOwdqnw|Np?0evC7^TPY{^rOe5=)wTGGfgWqagjcXzCe@ zz+kgPhpwYMAZPN9FX>y&CUJzUT79ZHLbrLjLz!=w31gIzcDFDcH$R#dj2U#W$2)8nV+7f)D=YTFDd{U`)!q5mX7l$2?qRTs~SUvP!r zCXmFlI)-;BScv(Mn|lP61odW7PMoP%me!QoSBqjhzX{jq+YyY_#22(YM(Ol0rUOe4oS-X4 zjQbl}_gGHX4R({A_EHwLmvb6mI&E9BAX52*-@6`!e&83 zL23XleN2z;fZjZYoa2el13?4BI&a8wtTTgaQit?oq1uL_a<{`{xzQ{IA6-I`9-z!G zK2c6{MD2C^hhG&>#;1QWLL*Z8=W!hPh&0+iA=6Ogm0)1BMk*&o(StK>uw`dLoRUMQ zChl(SwUOFLmQ~{Y;ePygP6783ZU}IUm_|Urs#?~OXkvK)4M`ecd`lg%mR3h5%~_b4 z#wpZ#O78qhlmKe)uKoxjae0;UNd&WTQkV(Oz@ioKT_yn1(u zys`uOYB(ord46Pas2?ZB&Ud^*svpDi_jRwD-wX@WAjmT@6Y#%knAd#jN z$l&KgLx4-21=zRd9Cv#ExRHcPt#^@@+P_Z-f5WPEz;@-04s8X&RIU~~WSgFiT?x(a zs5E^_nXKqTM>1AYiKX;XX8KmQ!*4Z`4E9BXHUX=sUP-FDa7Z68NdLpE%q9$!xb(hx ziac=o>wRbMKSOw2D~L@l^<%JrHS^RN*BCYxF$qJ<0KEpj$9!K2YD6g$oclXh zHBkX}FjhyD;g}7p0JyH^OOBlY*x65)&Mw|gbLjw%rT8m^6HAF2zmoTaA)97ja=M?y zjv~6^#*WWH(jpI!#*9lB>$TbnE(gACL6_l1&T*odep{p;7C=sgCIcFOVgg^lDAzKu zTY&~d2Um2;v=Sb8Ni`i;kpB*CDnS(!Y>f&TEKb82Wydju)2+3eY{Fo$4^+a1aQuT= z`Q-2EjGPvnMA&K(M=uA)asfbkZ~zmJd&YrHJD(4*AErqA-cdScGDRZx=i5&x3C-V! zqaJen_f#M4vGfO`{bR7Gj&xH6>}NpCg9}tdWnw-O^lVE4lLA4FnP6tU zSNpoed&J0PJ~E}Q@Xrxp7}6Um=J}*R1zhJE~4Y1gR!l|40C3} zp&`Kc>7J-BOI{hSkzWkgdr>C^teCGL!V8GrV4^Y!-kxhiG3zV|2SHE87&r#>>sWU8pX5-74XP$H1M0?@H`Jk?7_6ORlTU$C`)cq7>5&7Aj>*i#{II@lPPsV zVA~ZQk_n9>IXnJ$6r=BeJQ}F#(%!Jw_Fpmq8$Rt_g%_?}ca#b}SbRaCMD19`1N8J% z@nTOag`h=D%K9bpbDhk8vHHm^qEh%ABPBCVT;MJ->x ze!yl#9k|%pDj*W+#rC|Hx`RBdMMIhHD76&yYR8pjRS{S5NBO8u>hwgl$o(99DX|u% zZ8cC@^Ji9TQfE9Qgn^Jx!54sp9 ze16eM4}?67&I9%3qd+s5%Tcp8R!|$x_2I~o!xs3CD=){Pgzc=(UCy&RkkFc*1Ub<- zM?@g+2wtU@>DR;2aHjU?_d{W8n-JOJFKlt*SKCIlI$oD6( zzAK~m4X<%c_S4_bH4>4mkZ2Oz%{37z(TFrerx76+Z_j|?_?;uUr@}AXIRtJ4WE+NK zIRg$C?mKb8JQEL$R9JM;-M&9W8PE{96no~YRp=9_+QS%~IIs=#3fE8o$aO}{S<|z@ z+ktuTlRDHDi}hAcmNNnuO55C5V_}!=TZ_gx?0!@|pb-!b_kby%XY?SFsQJ*Lt{g$L z74ml=#b5YOUItF|zmWwn0o{Gb_!U$Pqb}fUbDG*E#xhRWW=tQ`s&Xdk|8wZ&;tS)w ztax7Zxom(iHVayiuWYI_8a7|-kU+9wY+5j`M)LDFlZ9XKKbdi%*S%y)SlfCwDUO$v zO0D+bk;-Fj9SfzEpwD{-3Cy4hq`W@$MUS8$Zye<)wzAbG-iM`b)G9K067sa^3|EF$ z!L#9CrnJYCtL-2Cw}=@+q_HV!gPoyuJ4q+=qB3@>X)_ucW@D0S%vtNv=GzG#(8E*9sa}{*_b#kDtm9|EC)`deQU57IPLz3Bpq1dsDB2-eOASz|d6w-N-692i!SG1}w z-@@ME22OV0$!|-B(vI%b&QuVCJTGg+^0Z_PPHFc={POR!pz6-2y?hHGv8J;{(nV))m5e(Zxl5ZFI*#qkmbF9n!9_S9kHwR^KK-Ot5fS! zp;|oit56!B%IXQ#>#K+!<+%g#8|6dmWa@YUG@zx*Uk~^|X%!<+K-)~DX>UK2zK5V&jxPg6GSuPD$zZV^@?WDMG(zn756DJWs#~m;?()d0)GP;9n5j<}?gzQl zLLp;rz>G%d8w|2h=dr_Ur#X!cV?srLH~yXU2DITg-Ap8*QPN0P40Fu=&f_M(_ zxGIHZamrySG`c)VsM?gPcxbtb*~IF1U_P%`fRXz%g4b2J^TrRtEa@#Rp$x131@6aj z*XnY&JI?!u3zVU`T6@4tO;S%D>9FC-*Nz7_mczUEX)j(4Y84?6GWNoF%r0|Cwyz!DuC;@rk@ zI5&hM6*TYqv4f)s&B0ZZZ-nc{a&fmMDNWRxm*J{)B^4gb#}8<;bJNDxsjY~Jl7Jrc z#A$c;%3){SlxVDL>$!{ktn8Jmn%+t|bj$YKGh_XQzOMU>pC8pY@dahU(w87y!$0y6#!n@y{|gD7%p z$+{i;6!IcSbQ^a=kGWZ=aqH$sCA6CMb+lruxMOPoMKz@ci4UhQ*x(IZ7R7%Y2$T#_ z05RJYnNGX(W2$B*p=S38a#B&p9G8g$prb(#pi+9T8Cw|dvI;3Hx_C*@Y{YFhu zxSj)ErbN-ElF(4zuxH~g@=!ng5Fil+^gAoMJx|(VP^%&Mix15)ktTcH_itqY-w8n4 z$eeCF%l`<*xFBz)coG?l7Nhinqy1TLejwvtm$>kMl_8x%i1S4g(tIphgQ85F?ANfY zFSk=MUY?~lJ}%jJz14p<3_aDF5Wh?xY@whBC2@}Ug`~!C%A6r|{QWmBds|m6kto=V zNRZBYubA>6CWaia#4zvq!brXjHt~l28NUq=6DX_(%>{s(0f0Wd?@bWvzT{aFTt`zQ zVll)nzh{D~glVqTqrx_`!o!AT&sp_TWmo}D2<)&(@|fY8kz$>0ULF#OtKz^tf~b-O z32o+lC!sOi5ZxlHfmzDL@GH;jKjF-%+WSGrBc`9TB<-~~>2^}}?s6f_U!E%?Nxnx& ziu)X4YuX&}P!rO6|Lh@2Gf4I?vL}zTEEJP#BVD@Tj(?rbdTw5oRbIL_#Vm#EyK?E_ zJ7Ot48ZKN!VK$m2>Bx>LSbmEtS8&FiC3M^gqcp0yeAr&NiqJ1_XcP!rmJS|41t%U0 z4L;`o zt-+`0r0?ivYeXkyW^F;IU}WI<51)yJgO-s4pOt}$mWc_UnT?s2o*kc+k&Tv}Q460= zP?4LPP8I)Gu16<|&rB!qTPgkL0s;n(W;WJzigd~f;{VymO&uL=9XRReOw1fjo%Cr9 zY^>;v98Hbvjhw7#Y-}CPtjrv&=>ES0eM=jCIwNK_J$-gI7DfhrV@3mG4th3bb_OFB zLqlUGqu;w?WoFi6V$f${q_fpCu+TFxa-cJ?v39iAGjMdE(Kj-*w=uAwbFep{bFwyb zHnMlnv!oNUw{dU~wz1MPvz9h;a4@nqF|wz1u(2ePVqjpS!2f*+MMrxl14lVMdn0Q{ ze0H|~5U-4^4gX8B$iT+(zrCsd-awd%iT=ONb8xgb(zAkrbj_Ul4`GWP@f#QaN1)d` z4i<(eK3^MF#Lsg6>Z#UaLsD}y#My3kJe;Vv&LMu@+V|s*jj7O*4Ap@*gSnbtAtHZh z&zAjRl1XWrZoRvWrh?b?8-?mnR>iiop#y=*XO40 zjLwOpYQyEmAFqZsz$Ytvkb2n1E&C21Rw*wPSs>e1B{a86R`&a@MAy#!{^0QO@RJPJ zc6y&Ubu&9#_lA8}000hNJQjr_;z8FQ?u&P`RCl?rAOJ(_Zc)>lo#zcvCV$6&Oh;CB zdw}T2+kIaUcqsmaaCX$V^O-@SzZx#Tfw;4*Vg!{oBXpwH$DS5KHIt-FI==VKHGfns z9mj?{4OQwl1TUcjvyr+V&gu=mXitk64p|^FH1;;Lh!v$L$|$+hfyaWL78TD<87Yo2 zX=C^UxV-B(7i))`Ga)aso_-i^vkTkITggJEJ{4uzE$09fHlOg*PYkkHT5(#it^_?= zGv>~_P1nqR5a!02yQTdPUSG`Fe^SG}0$zGFLHpjOgxY#X-zSbnD)4!K+B7HqYqc}I zy2Ca@WQ)|AyK)ooYBono*-bV%_o14i%KSZ4f)b^!iBfFwQ=nVXQ7CEEj3XoM2>eqa zd|4P0+;AHk>Xt16oDE&QfM74^R~tysPD+cqhBzH)q(RNsbux2sB8Y%NE`QLjz=P~B zX<$S6YjnXfj}(IO0J>?%A^UxT01$SmKWRTW_s3?7E`G!3Z91}28esd2+6rx!ZcD!r z2r0E_Ztcylf4-6JcpbBsbO*nNDu+h&=|0#A0_48teN zI{h_!E2DLW>izX!XpgmOtu)fv0)UM@>___LsvBiW!w$tDekVU#`#9+Op{S7UBU3$?EZr_Gb}eksW4H0nJBht_FXC<38)NR>BVhezt)Dfu=feP|soa4tt*R%NOW~VsF-a z#M8@wn?y=p_$5X%C8IUpVJZkkG1=HmKu(ZQ!jvFqTJMp5uIT-PLx||5cYQ_ zpcuVJzks7P@5+1#`aqj+P@t9#5iTEJ<}zF(mX1VM9a{!3s(&01wW}856ku3Ttv1F* z(o8Ml!ao)U;R<=#jYuksWc+ff*`k!~S~Aj_5dcQsR+y>mhn@i8-QerRV(^v_f^5f$ zx4a7U`n(o$Ch$~k-Y>?uX@_g;sCmd)nE0i=Ju+&2br)z26XG9Bi?lKr^NN0X;p9m8p1csh zf?@@}tZ>Lyqhd!c2+2o2qX55x3n$?|n-^;g6@q zVPT2G&DCiM=mv_E7~(bz4y2yQI}#!Zk{tlL^9wPWWNr*!JjOeQpzVq}u-tBsbE*3tGN~hnI#UN|_kdaaCZK%AO=tICGylQ6#J={s zuOUyqi2A(gGwL(>;qVK;o4veCHnFwi#t8^XT|hV%S~1M5l_20U1;yO~iYc-`%%DNk z(i9!ZWdNoX(nIps+g((9tk0YgApA2@nhwpR?BAG9L+H4`vxs6O)^2t6z1M#zMxS6Z z{UfzEXF6J3pLbx4OlmHnkZ#0IepN^uDDvo4fFhU3UuHMsBZ#L-7A7VacrTw-uU5+Gwlb{y!L!smS6Q236+3H z_Z_(2%^C}ifk*d73Fv)L_tBL-%=-B|m<#|-KnvJ$Y{iv#u4{7H9yc=~@@SqF%ut#~ z!MaVKkZaq0ER&pV!Zo7^XgpXcpCa-d3)J5^w7C{lNNJWCyAGO4Mfk%>_8Obx+7&CT zktNQ3{LrFpJyNxk+>t_fJXy-0ySyP-q*tPSphZTE;LdE9nYu^c*aJ3c!L?~goQz*hCxk~ z7txbVeQ|D)$5J+}-Zc<^dpuu*FgkSC+>Q$L%XS=2r%;^>qR3h*2NF0`I+y%9rf&I6j+dU1IOiMq*@VAXPMdWsd#k`98x!XU{I zb{3$=`tc}j6n}nox0qV-+D&&E=eTah8+LZp!dS2%HLC^u+}T0Qk>i7*AwA8<{MR=M z1x>Tav(|G>#K2AsHg$q}c-f*#Zgs^T_r=#2|1Y345X>?Aiqj{v#(Z`tPqXCg-Gbh6 z@_CgS4FONorX^#z@O&?3Mjc-;ZVLyBwlkvJEZB{uYorN^{t$Pzl=AWBgrd zQiIN2=>Z-IL#Dw1xO49TrAS&iXoD&Iz(x=Q{1H)DYkyra6IX=fRc_8-1{5J@b^?!z&7&!h<*B2}c*+bELF2tWch3-|dVmrQ1&Z^ka zYtpp^k+HhNYoU0!;cEb$;IyzSzuTLd^7bo+$SDE?A{7mTmxA{8^7eLZ2Y2n|A;u~5 zlYx+hhjy6;tSqjcY;Ei2o*Zpn%crxMGp9P43;hP(ulA1ex-+n><92Q?hwiV(xwnVc zQ4`+ph=WkBZX{xWg#IuTlQ3HeFVDxE9*&EH0vo!R7@3{}*po@s>7)BsaIp_q7sNmK ziAW>_4+baqsKZ`AEVk8Df37qa(BQ64UPi=v+Ecb~rjPidV|ao7BXN=T6YO0yKsGh% z&~AH3{I?X{B6qEtbtUmi%}u-Yu4gah+M5O$LjRkwD@%+3RnYQJHW(to)3j>>3q}d` z`o*aIN$_Pjp+;EXF*nzBvY!Ca=hmojx_Fxf9PMEzwn8G1Iy7YY1LLp9o+ps(HBBK^ z*XYw-kZgfFW0az;sP`Z+{XH;R(O6U zfMw)a8`&AMDzxR%`0F9n*@T*gX4u<(O-2sfs-eYIVgBN~Q%$MJ=s){|HzAya`kvgZ zH4S92b#d`ws<-D(FJf?<0Be{Aa~vT+&Mg%7C6A~CrD{jVudCIpaI3ZzdzV#F3w7$8 zrFj;$(R8(Myfk$jHM1(;os`vmSbNvXb(GwW65fFH%=lBb>yRbzz7=5g)n&2?vOwY4 z-Od=i7dYr*kJ5hx$o4!$RtAa(P28(Wiu8A(7>CL9&2!w7m@2&RZZQg;mpWa8*>)qZr5+_s@Oz* zH1GN+P!6)`wQ8dZn;UYi)oK!3H|49dc=hi@Az;ypFkx*or#1;JNaZFoZ{I|go!f`Z zWmj$|rMqb|AMnK;3-=X+&gSIuV&%15xcXi`KAH#04N-Fxs+QSZj87>n?mG#P=N)G5 zwj6-;OUtL9!rbk+lULZ975;@;mHuO|nwHfM&)HGSl68R%YlM!ja_Sg0;$%gJ)oROm zMFmKM5ZpcR5eaA<2vH4w!U~*g>y#(qR<3I59keKAp(On1rBmtK1TfBvZ5eP_4x+IX z$v;0!hn(54;mc=Rv5(DEOBw0S(3l#*q`*J|%MK(6ew}zAzGIbE@9yixi5oIyefKS< z|F0~txjdSt{AZ$ir2rlVYXOKIqb)67tY;TC1Ug=SP{%6UVaV+a{Phi zLPhGv$7ynW#}E5X5Gg9(yQp!xf0{5Y4qYM`{7Fx`(KNbI!O)Rv8o|=IFJXG8@N+kI z7I6p}V07tmXSqZBLU6W4XA1M9z0cN+e&kAwT!-!_k437k<-LhOj(6;-aVl(a6wU^4 zzFp|2h{jChM{0G#uvh0GpfdC|en`X!iUrg)wxS_ip~RA}9S*Hx1uQWGJeXN-*w-#X zIQFe#228B+U!DKY(A=pfK$Ck137fOS%KPAOhqUVYE2-^+)u_d`I#{NC&VseDFoVX5 z;#`yLfCy8?Hoo3B`4ZMlWGb|JEHrx;c4YR^bb2Mm+7LmP>f+hI3HzXwa~>8yfq(mx z#C4=M?XIYRscku_7F+&iUh25q^{!=1HZ*h4Rm_*>{3R?wS{l2~!}a_g5~`>L zRHuFFO<&tUjRz}MLQKF{9X;XYZ zKVI*X?t^E?XJV%y`5BYM?VB+O3`xFlp035Hzg<*b5p#;O0qFEyXYAg~B*udm8uEUV zzj6C@Q?psC%RRZ!szXnhd=GTmv+gwSHTqH6^KVW_n~TKzE%=r_Z9Q&Gh6o&rpFv9J zM?0EfWuo=_zIMD4^~HasdC1hiQm4q(zo0M~+O{_HzL&h>fiN9$_x1oH-k>1nCi2q; zHYkzN)3E~9kO8g<*d)gS?cT08E9Xq74veEjO>o&Rw&X&7>(x>9-~H+2e@4N!Dp`t< zq{nS7m_nM0bJ5(@UYiGf8DWcvjq6-SCl@<&FNsn+Smnj_^ngP!+Y+{fGuGG=Ob;6e zV<`<8(<0fr%-!E zo&bEFjm1MW}>4|0Afe`C9#>406Xwk!7es>Uz2f1ZPuDiHFHgV)YvSZbk~?qVuS&X~Ir*)pJM@ z4DlvtpTj!Mg~ZmF86EX$YP(I?o%ARgYokH3=O*Da5 zUSL%oNgA%7Sbj_44g?p7astwgDo0)7bc(86VA4>QI4asvU4ge_-Fo@$cNr%LX!Wc5 z`zT<iH6w8y7dN?f zbQ_s0Ewc(*N)xOrq(l(}5@D{mu^Rj(m)OBpX;-Myd*A)DPppIGTGr7mLY9%;I>G7& zH%vT?@RTgfP*hj76D0)qrIZP!6#DFx-k4rwK4dAqL-Hxcn=9rwEiRoG!TbTlYaqE* z;!ML9RPOIGA!t`tZWo#X6bJ$ajN)-3vkf(-?)vu$Dr+x!)}4038sfI0m2L6v=hwdA7Wo$B73T^_WEAGVo^>s0T+QUw4@Ey<^wSb!WEFs4#pwG+@+*9}U_CgHTKAl}CMdQHoF*WO zLcj-$QZ}^1*eG8$z8BMjaQf9!-vnYH?|^~g$dXFeN|AbusOtmg5>|OKnt=1a0{Sff zB!Vf02Hpt;EnPKLz1sv(I;yF1(wu3GP00c|TPYQE2|;^FHx|jK0vU~%DaSpw=*5vG zNiJ{|D7?QaUI9RM4(_JEt@Ln%ay>~)L6xQAb=vae5B~hI!IO0UZy*fY{|Le`bNpWr zM$5|KfHnS`SNQ?2wF57@9diMg|JI03Jn2BHzM*Mta$Uws%c!|nH$1*Ij+{<>&CdJF ziH%>P89YXk&@;QdZU_w^O0+;H+q$>J#OdF((zd&fmy`Q)Go=o);!Vmz#nV)eOwF}T z_(F`iwn{n8%F@}&BU(%88|3!TL1A!nJ zusXb7BN!*V6Uk!^UybkCryk{sJ-WEOBc^*5^g{MJMoQL?mM{o+2ZWXLUjdTQ@${pW z2fRZdm(q+svX+E;tIUUkCt&fv0g?>sbVmZ%UAz8xEj@N_0G$3^h4)x3e6A}VKL>3m zS=!sBkTe%DCwSct{R=&1=GSi`PWKN-hx88=+{0iTqy_j4MBwNr+UT~mX?pncixnqA zE_9I;DBnXQmB9y==eSytVf@%K%VVpH#J$A>V{PbZ*szo0I&dzoh_wS{ak_N|KhVHt zPFmA!7t%t}3Q>HJw}~2Ztyt~l+)8aN=4}+c&$A-xZVsQ)blFoE*G%6!DEKMLA4rYd z87M68AghueV?WFoDL{nc;&9mG{$lC+rcVtBDnE*pO#M4L3VK3;cMRZAIl0iwxUGL; zC^815Q0Wg6WE8?7p!CM|y7lVGA}=;f=r>+>M=|go8<`Lc!=k$HqF{gwh^oGpM7YGi zU~G%3>DSq-eK-s+1Hl!HFYs2OFD!)OU@8R)^Q4=49OI3?F_Q_WBLdCDd)0aaJUnlL zm&CO}B0=|C_NP)-V zqi+Kq)#MT|;NJ)@fE|?G1tA~s>h?|r?(H&x)z4RD#e%JMCnVR%AE=COs3`ZEIuk<( z?e_!2&992~%kB&~di{I@rrp0m9-sU0b%&^beY&)M;o5vVc$&Z*QzNkYW3z{3&bi}U z*9cRMs2$77$4!kxg7l>BOXI$m+c8maqX;CfnL>`72ta1nC7s+n;_D4g_WVoapw4LR zAoVO{Kr>(4C8;8IsMxAzpoKLKg`A(ueGy7=Vi>w}-FmVVg)Tj7+Gn#5##Bfb zb!PNwUXDgSa9nGkzB|DI6fvNs{2D)7U+A^nT;Nyekb105j*e}Y@-|roa6rG<| zafAqxEBZEs#gaDBNlv!aPfZn{G73UX8h00N}St8ESqqvH+v;)xyJxE_@1*%}O53Gaqq+CR0 z%g+FM4?w*0G@GjG{`3KeMDm5u9mT7m;|>jUQ-6|m_dx$)?>iq~!t!fxHj15S0NMjj z9UZ>O(89pI*rjsQoS}W2MUS|!oyF3!_}|3)^60owgoB#0A6EfY1OGM5SLP&9Ti+2f zamfNN*=~D2ajYt;OL&OLRsqkkZTE!eoCgV)H>)|ccMj)E0PC`{xOyC+Ts);?CQnJWXa{~; z9qnd!39%ORGU!z4>S{6sj9;rSQysHS_)RT^Hz#^;Ii%pjW!?w?q1ZIrh@+uQzJWFzLTdX|{aE#2F_;W`^`dhZ5S8wAzOMDh9dNCA$$ZRAae;3Ko0Zpr^Z>Cg4+`;<$}0#M5vs* zwIi^2C{-Z=`M)_qIEB2CLt!cDrtO?ioqf0Ss*(g-u3yP3!Cj597BT)RMh6;n2H7sdtZ{;kQY8rJlMDddkAwR(KCU#D!y$w|A+y4h zH)hpY;7kkv+mLdW6IVs->_6URWv|kF1E`|AZ#pyl^^(<5b(7g4h!k<*T=Mm&fL6?{6;xIRhLU`69WznqeE#u)KOk=BYHs)fw;}nY6ML z3h0D+ioMl8OaPcloZ8Kk3O6GMkY=z&j07AHJ1cD&$pa@VPf7^Q|E#~iRtU9Vj`kNn z!j37W$l*krB;hmc8t3q)P&kWgbE|rVfw$lQxuG$+T4&bnkbwREH@|m!09sO(=Ibhv z#8fuIQG1!|$*xlsfk;GWSkpy0;})~Ki5>*b&K$Gag8H01J)^sG-)@;VTAF%gSqsAj z+l7Ahw9FktzpOb3t*H(oe*Y%NxIrAvDo1x|_*5QPxMSJP&bQ83>EF}i`T?xuDk1Eo ziOw!(G9~*7Hxfnv6skYAX&3pRZ{Pe*QyJ~VN(TxQ%n*lkMY0IL-ZV#jaWzzUcCv9* zXjZFbnB>$Zo|e}=F=T5aj2^wg(4qDCII*~Z7Ppjon_^>VD)_T~19g33X2ah1JxL!x zxjA|NHFR{CG1R;Ct#}@l=7+nJXM^9Hb10FpZhXI2yz+MPFS#bWB!+4WIzCtObWgu6 zSoU$chD5>uubdD2Z27OFH0>7gVe4N&ib^3O-=`leogwDGnX9IsIo@F}L+=3#w!ia- zcfl{yA^chGZfrb|F<0oi*~Q7?XBb2rae4kJf{aXfICvjG;>`}fbcS8Gjt)&K1%@^P z)wnbjw0$;lz_$kVm}~5LBHa667{ZkB&VprS9$KgO%#f5w3=2Pe{FV0gl3+Ipjm3@J zXL&=!wIl^bBu0||&P~3_NxU0b+bq~1TXwF!y4es*Y=rqeR!WsxR)4d?lx{o|VOgbl zsD1+<2?8-be71>XYi_J+$NKNh35iDGmj4>oq)WMGigWk~NoL&YSY4B=Oyu^oplq{w z5be@*im@rshP0MrQbTa9*cm(6&_JswlG(x58_=L#u77LFdcyVx4qjsPTuYPOX@3rM zUH$C5PEEZggxw@V_`5zk(ESR{5e7=8Nh9mcUYe?kw3%j{0R)a?np!xq2DuaNx&wyZ zrpej1Kqf^3{$%9dbvb6L)24Z`i*$lGpw%^v zEfGcO{DpraF$RH?0~5nP!nyQlA4fUN!Ot{o4B#(pJSY6y(f~S8uz2DtiWsaWGf12EX@)vW8HGH9&r=F( zt^4=G(CtpQDtkvKZx(ON&ECLK!L4MAMKQz#%0p-xNX7e8olJoazUT=^;Es5r0^tu}%F;nm(dU_I_JcsV?7C!5CyBJ{WPWLmn@&=k!8l6T=)4I6T1tc(-e z5-yzL4K3RCsUuTjpFv%aq4m#fmz$-74siqys^q*@+X+G7Yw9oQj$6(hUEpODKuXF+ zN@-yOXD+}T@b*3+uBl)i37FK}iZzbjJgrja6T~e#krQp+)tV9MI4b5TXKokE29-DP zj;HMS?NsIg1Mg2e&l~0l{ueba%fC?7b5ItJZse5PMaOQ1>R@q(mo*ZAd6={9r*(0o zY*D;QA^vu|dI9A2UEL3)jE|}kk`1#XL{;u3HBJgGXiQYHK$P*{v#P8}lVx(-_sx?K zhKz2+szx)ea;C;4x3F!k^b}x*>pNyLavYw*-*JcMUxNL8xZ~vUg`2@)4)T_=Cn)Og zL@2e(VAj5nSxJtl($Yg`UvpGqHsNmidimY!JL%Q*X0ta(B!<$1-Jp}2h7ltEZgx-% ziFIjJacG=XcHN?_7V3wNhmqR(*8c9rRU`CTu$5p1lx7=+tF7FS`P%}5qr_I8Un zLH0Zh^rqhx-hLXyH5-NTn8I=~)fuk(%8(qpK{90hURx}#$BoEf6r*NDC^%>d9p$m& zw~q&V*L90*(awzNG}a~bPw-!PN_Oo!)8)9zW!4ttjm|?A?Wr_Rb8J^K6_88>jNbTI zZ#7Z8GyvOjJe<*Jj?37ts;31aoGA}7eD1!ZBkNBJPFCPu1-M$`NG3uihw-Z=K&Yh~ z5p__iM}vJ?)KM!^^VUm7>9Q+Bf_tG(qE1%kt)<6qY;Uu>6l%o|_tK|R#lOGakr<$a zjj?_l{5eOk9MzL~2OuyCEhBN-S-B%g>Q`E7z~Q)3so7jt`wmZ)<1J zy&?RESg!3l%K(m2}Y)7z!WYC@?mr)eC*_WEyE$;jF0U|jdHMu^CAYu z`ZR3Iyj*z-Hh}QQ$2)pmWB8|}x4KkR9vtdrC9iB{pfAlJGr7GqtcrEE82d?@`<<|Xn?@Kh=Kbgmrgn2FY&&~`hVIxWScLas(z8ACdGj6%&xQP>-E#5r?VATc164iepG; z<%=Qgshqf^$u7a4rx>Wo-v=l)2Mq`ZAt|BYHnI0GApZGmSUEaXS@1iy9+#%8@AetY zi%yE) zaZd+s7oFojRJ4&(LQGCK@6M-e#O4?+(j~F6EC{4l5ibGEI26|ji2@Ejdmfz&G!l(F zEim{vgap-JjOGRF)|v$v2x~j}gFL}5D3Xle^ba|9vpuyUi~|G%Wd-pO1*U@QXnu(B z$kj9;Bf>I%|I( zP2gjZ%DF;`G$-6{^I-l3;ph}EfRqe)d$unXfZg%~DBUF9nrRpz9)#R8qEnY(JHYDa5T1_1_ z=YmgeFG}*qoaeHx!7A6_RKkOvo?o=J;5MmDDOuy~tP2i^DI*d@3iQP<*?bn~)?a8Cx9|bX0UV{1Y&^@&&aY6i@d}A$00DjgA1wXj~JF)bW zjw*$(OoGhse&z2ym<2YEEC=uRdS*Rkh}F^`n3`fm3e=LEK>sGrulKQjbTQIEbZjq1jR%iV3nZfj-V|2->fB3v^d(HowRv!ER ztd+;i%KHDe-TZ%9+}gSSVR5s6%#!DClLJJ6%rm#F2(_P)n88IjBb3%-LtU(Lh+DUO zT-an2P)yXN!C+IQfV9^UOJKu>44B};y16Q`95GK|os8hY#iWx?m<$cRIl8uWeqG(( ze^}YQ@^;XosVmZ=g`ic?!B~GajFO5xEyzw^u#HUn=ycy|!u^nhAxEDGn;n97Cj|CO zdzDaXcfZc;WDQNA)zIm5vww!z2HJMbwqYj zd1CUmtCilcHRwy-?D}`>XvZw2KvnaiCp9h929(qsl8-vgoRG(}9Y()uOq7$Zw(I&8 zU$bNPYt2giY3Y=7n)W+^oWC&oHgoL6?iDJjZgj#-R7pWn(D9R*8z=Dst-KCS@)tb% z_1Ji!)jR}%TPwWi!Ha}g!0L1MS~mtX!qpj*2`^Vzmv3IA#vsFfEo^Gi+Ul=#^fOmx zqxVuS{rBBGIzh3f!8~pk0?kAeQ0Nj~?!8pjjF})_;S$c5>+R{Soo}ek`f%fl97EcA z{M$==_6R^wpvL5(lyl({_T2I+XIo-7AebmR(^fX$BE~IN9%iH047q^lhYRajLSm8J zON5E?2@z%b1T)mg$AFbC+T5-uy+y?UiR&hvPPy4UrJyQOR|a{@Hry(9cM?h|v}^G} z%L%m3T*q`2^Xu4bMqjn^$h#Q%06%`gSK9^mNl~)fZwpHf@65e%t(Ij-JpmQpS6b<~ z&c2wXM$gibyWyi1-H4YA?S*+pyU4XMBQ7)Zv77cl9U(g+o)P2fb{zVi2am~u_T0q+ zCFk(2wua1wxM#c_Iy6dt$k(a!5+Gu5XVrKd8&+uRVdn^7x`zi5B2&=Q+B9V5Mw1?! zF~48&^l7hD(iQH3lG61_WbtMrX+z^4tKREsgXazQX=gk4-oSp}HlRKMkYPe!&KR)^ ze06}c!G)z(LvNj9ZRE_B*FkKD!|*{)ofDx134mf*;VTa)&;nLP)Dvt5e*{f-4pcu3 zh3{J$dd0`h+TDH|X>mM2cXqQE>6xC9kp=w&b@;bPx*1@UK4yQWR|W3{ifH`Xg8&?f zE&Nv$#*&kj4H%V;jkMc6xXQ=XL)d^We5bc75KX4&i5^rfW%<<9niwLKSSjGKv!yFa z1`@E%%E?2wDj(ogJ*uvHnxrrUie78)I4B=*zj3}J-A6FQ1#J=Cy|iPYSbXj?315%u zR|NrN%L<-Z^>p?p@=hrId^gZtQADyeNxB4F5P2`xrVg_$A_6OWcQFIzLkO-@)VN=a zG8&#+i2YT0D)cJlL=Bz19-{jP2UGQ>$Ch1P&c`f6qRAnMm^X-L$nfjVx|T!E77b|@ z;;6X;phn2`qS*+&@rDCF9+@48?J$9%T+OLCL<~FqRde{We4eO66r|p@AiF?Bl&db$T{ba{RGe*`_b(4T7@lsEYc$s7c$rWUngNV>ek443s5yR0 zfMEEB#7m*(em?j^Sw^gsUAn}DainMfob!B4gB(`@9lOarBX0UAebsJk_|W>Y zLBf%vKxbyBrsn9$X5dDdzUTS+#EsGZ zDZiKd@C0h_k}gBi&1zaxBBiG=^W|iBp55QpoalUy`9yq%cfjjX@B4e9-%0T&c26G_%< z!q?x4x|E2W1)!^LmZVW-hF@G|57F`j-sm5fzs~o8P01gbrQH8Rc}GNAMuURumFt(A z%wD}a#@Fcs6zf#hDRRRbcgv`mSae4!JtoFefcLlAujbawCI1tPj zSOX1gKS}NH`}h=u?WNXByiz-c1|d7px)7iCrh6%e9$ei+qZM*hUaUSn8Xvd?8c&%N zhgZTM-L6}VQRlncE>R`uLHR@=i}@^$vifcrok`9Ruob`QI^WT9hCP-O=vh^S%lOguXrUz^><7~Kh!1z{zRxFkev(m|vO!As+L4n1r^;@+@z8E&s>;eY~-zFBO$M`ehsZa zkk9#D%V)xPW}7eKqOY7=!;&^0saRcFb!5`f^C}by4B^AXGz4U#22E_cMj4fvK&qa& zefPXEA2FOfJ1~kFwt)daHeHZa1a#JAm-vS&m3!jk;PiCLm^8OVOwS3h1D8ZEe%sG% zy}CaFnvlUm^SK@?5WAr4`!pc+0w{mMFEqFJHl;O>BOF)$R&PwHX|uh6q;M^K-u4pn z-c^g`1iNSJB{HqknLb|<7`^Zc-TP~W#T>GDm?#1?SE4YonA%G@G=XkaLlZ=h8CJ)A zoqj<3y}azj%LP4Z^@F0ygQ-!*Bf!ONJ*8Pyew9p17IyPi3OPTI0Fbhlarc}68yLslqJ|uB|2s( zm;Tus_v^X)djhUsf-rUlo4$26p}Rtw#YRc;YCTVEku4mxzNpw9T9gjr+@MGfe}=8~ z8O`O4HsWGx&dTnjr&Tz$Q6Z^Z9!Vza>tP62o+CZyeQ6=E@*X`+QV-7fr&ns;1Jjy*Blfhn zBo=>jTc%T6yxjHFtmGsy-1wCGe^K_%agub)x^UaJZQHhO+n%;HZQHgnZQHiZX`9nu zzx&|s_ndRTv+u9|sLH6!dMYATtjvsz6%RJYI3JYx9AU@1{H|o5l2)(}j(f;V59F+jBC`Y%@u`uvSarhf@V(u`Q|9qiSTN0z%%<>fHy$zI;AE)HjXV# z4Lwj1FAqDK+h4Kf_*bl-^#wIoqGKh^FdKwnhX(oH6I7-`yAEz-HeWL} zuQtH~#7%8n>_@4ms&siPd=CxNVhZ!o23H{q4f2d%_BUL!Q5~)qqBFe%R4tiI59I`ICCV z(TgDkP6#jE?^h!FGbB>!JQ*ig+wtK2zPp^AQ8`cvbV5shzORVi6a~1=$R3Qef5MC~ z!jWJSK!`>#t^syu5ukyp9H0GMxzry???m_jyu*VGBHUKTn2?tE!uXev{ZSO@Rj(ba z%BY{zEs7heeBuDQ=;A+U?0F=?p>P^3lPw^)CczDw7FV{2F$xmZ%z(+=$cNfie_*Ev zWEw{l;fJKkH#tXq< z-TMV?SdMxHFJ6@7m#ZU40e5hVI_F!;ahkVEI7}Z?uB9CGc+HFdh_#Oa(0wh_aXrn^ zvPKLzOJ%Ryk*h*Qc1V~*n1I?&I=bh{v2YcwmPi|eco|N%(bfgj&BrGu%DpRqohZ@V zIMEouiK9E8>zT&6GKod?svO^9z>H%UNQ@`j`%+tIQaOkC?#%ObQN0xq_j%4$S&8lOJh480IE#o-KBIAbYX@3bej2tY{D|YT z0nD$wnq=jf)EllWOqoI^weZ2Hkih7Y1@tQ$y;8H=H7vwtp+UCrC)j-m;77IEX^KQUs@u$NRq2o%Ug-+sWnWDpvb(GRKUIAVlsC5umMhxzv)_ zYo}$+1bcB$)Kh&{mj$t7cilvcnC}p10TEu@#Y-QZP2t=A^g-d`&A7Ndq$=2Tu}1&< z!VGCm9r;TDLJvMzfJBaEacHN_7stEyy;8Cj=NVF*^@fOCCS=`9T$j7CJHN+>>Cx5? zX@kxe;*+D`P_mdaOqU$@;|iIgj#cu~evqVS=2$+))}91LwnSXBXYfbCE+nd+y_e^E zpiQv5)In(rZ~F?D*ZpRL+_ZfIso667jGw1r8+mQxQGY|^(S!a;qT@oTJ>-mJ;kF#K z4|&Rt06ww?T^Ct#k70twW5M-BRL`A9z0L0`s;?{=Vs2~lh1rs^ZKAHSiDP8vBF?g% zcY;U~M1hrdv#e^!m%Sedtb2q7x^UL?B-887jMhcLpdTZ*OW@25!AaphpJAG9(MS zB0s{`F=Nlvn6r9+1Om5PXsTgi)-~s8%DBms1|Sz7nE4FoHA}k>yRQXk z>L}t282^^n3#a&HE(#ZVlEPA0BYg_?sWtm0kB;#Uq}JM6av-F2$bJ*wK$<=3pswh* zfm0%Fs9%R2B1aI?+XE8Z(j!Ck4ijd^FRZphG{*TZkY-L&WUrrlCJ+7=Ooj(!O7JN$ z9U>9BF5Jy%?T!HaPAq0WMErx(kRQ#Qu>@nPp})&Ez>#c3cne{klO%G3+P99*(w+Am zuV?9=TIqGB>XP+M^9$XT2}|*!DRXBGQYqaWz<$f*nWbWd<&Y#q4e}kOmuIO38FAG^ zI)_}^;nwXl96iD#m>kO{uO#dK)WmoFmVUCg?v$t43EEpZu zZQvd?)ZwO0Gen&MRn>S)5Is-G)Rz@8-&WVm){K?JSagbLhBYxOT7O_DiAP&Xuxca0 zw5BrvB0)`Y_I`WW4rmW0;d<#ylU}ZT3A(pG7XBpo&?ZFw?Wgajh}IpBmG@Hs-Ly=a z(BZ{UVzh&RE+T9+16h8?a7ZUIR@d>Th~GWoPbT51>-?{J!_U(C8#m^DFAV>|I>1wK zvuU7*mX;RC*_!^qoSS(<9Zm;>i0V=E^1Rw15VBAZ57Hmv)T)$LuItLU~cS#?ADZ%05RYF&F#mLUCOaD9zlE`I*3(4X4CiNrj=w*6jht+wVLT%F0^`lq&tShy7wW z^0D0BO2gSEdQCGr6>1JPrsE8;PTeiivo(dykE*ajy2;XQsaGvgdVMIXj;W35v8R?V zG60(kq`-p~&ui!8DKo6peh{C4YBZ0cYNpN4=cQ6+UNUNFZ@ah-gL?w_tM@T4A z6)%dFMLc7C6DWReV_=h0@40OI;ZoWqIM;*ThYbZaek34qN7WU9dBYjqGsD9deo z6Hn7&mB5#V)X<`g ziq|-6*ZG^qKK7O9q_iTX%7vtw6;mxzIphu&w0we;RZvO)g*Zv5tL%CJdPvMNH zVx#unYp7pEPuz5$>x$S9i%5mx2jyin7e0Or6jE>W~O95KQn@)M9_Md zyx!;-r>d>yE|G!6qxo`tu5oS{S((=4yt4r#yAL2;yBk&yvjuI<&D6_f2^J&Pv~ati zla=suuq5a!?+8qIwnBci$T|JoE<+RX5H0JF#J65Xtm%lXb_xC|W&dMNtRy?LoG=_j{8{k{ zwfeibl7%hxd_M(!)9>?%97;@RqXCv`Up>u`$S%t7(wz8f6g-0aWHSzu%WXhqIZko) zqqw?v9JER*6Atj@x#FvCVs;@M0=o=L2VWe{GeF_B!^d;EALyVYdVc_QovSh7+7QMp z&;zShitWycL>cz|$2{>#_YAycE5f@Jc)L$#%NA zfopFbjF_TZ+Cs=ySp&QIAVcFYMxhswZy??_ykh6G6fk+^psLOSSX!oF8?j9 zS_iI`?DEgGO&lY*fOlkU@FuC!V_1@|ZWbWuW)5o08ob8vo0jWNB!mH&m}le&iL(Z0 z<@-<+1BJ!_e)(J^?J1SxgKLzq6to^<(j~(YFstccSzMDskj8Ie?M5V8aT=9v0a_zU z+s&+N#VrO(j14+9+=qV}4hQG0jP77DV9+s-fin=-;uhEYxD8FR3>Ge|%Hq{GeHF!0 zn1Bqc$E)VfM0#d7^Qxi833e)?ghol*W@?*&4kS?oQ>qnRUMMK#2@y>&nyNc^88 zEH;#zP7t{^<$DnRx|31J_Xg;XRM7ZW6+tv6EKq-d|tYI z6j>q^^EOozpg9#RUA6eHqQU1=5p+bGm{Yitt31Ux?}5YFDW3KpB@Ax(Yb>BZ)%#Wu z-ccmM4k~zEU*a21QmORFm4R>5=~p#nh{y8EZ37>nVqBs#s9cke@OY2=v)VS>RC-wg zGA>ep*Uwq3n2G9oNE|XLQlFE|yS?+EEM7!ZUi@fNz0dhEB>M-9705J?e>|j)J}%Ik z%lPD{aNRSbYY2MFi-cNCgG-2d%L6boxklF%FInE1TQx{U<7afs5UW~mrw}T3L~(9G zP%Dchcm{up=qxL7(J@ua9h$($CW;2FWQ}}0zILdR8(R6A%SpIS&Gm)?y56Tqt{dR{ zorb!-fE}$h@R5Uq(C24xrTTevHLIf0X+*r&*lAh2FQL`rK1$IY?z7+6QI;hFUsPGk zD-~dgX+lIt!xVS?+CIj?ng{Kf*j@&cAh{)2VDoZfifz>sc?ig>Ez{G*T-9$yn0nyvGL1m9?H0+RM*i?|2&THIt7#WFVUqd>%| z`-n_>QL}sgZ+E@gj)bG!<}Qjo$fNA7dqsnp^tEzNgw%3oDKo=xmAmMbiSQ27j#hYU zFgECE{A$jU76)|ta~WE&I2%EBQ#FhU*qp>#B^bY}lIEnng7&)nV2`W9PHka{tQZ#w z*z@o9Cz+UWp$xNaTTvis@Jov?7Vn0!x5tXA!;&Dljc(*tcSjMc!{an<46spEs0n+l zXE6o^9yU93VGRj}PQ!7U*aan7aj&#WLlsSN_Ygk)(Cq=n3#DQmR`46Rg?_d^{;KGo zx=t9`g*|N`(y#BC)@g8MW$!)TYYqx0GSC4jmgZ(|pm;LI5&=ctWllq^l^{yGdNxh- z-3sA#Gtr;=fOd*A=evmlS1dHlAoPg$Fv#6~Shq+Z^$Pc1+V>D*ZY`XZ$LmJc0gYX1 zu;sktPLn2vLi!rImh#N@wId$3-IFprlxsqft}HmDUAwg<-^NT|YW&_sk$#CpftRPR z?f=9pODfzmnXpkDT|&xmyOYj(@vmQ$9Rnu!`BkK?Y=vWABv~@wT}>eAbMyFs5*Dxz z@TzCS=EXd&597hQW|7v;=^h{3g(x;4C{g+}sg2ug(P^&E4^Iu`BD>f%-MBYZCW>=W z@1aG{gewwGPe^>p4S3Gh{REi!x) z5Sg1LLrNgRs!**tc3KW<#1>Hn%}$XxmfmAGSo-?)W#>e@-EvKNl%>z4W$>ROqtWnY ztWBD9w@IlBicl6}Cn2)&fo^o8$k_loi;m=YS|$BX+*wUwrKE|7J+-D6QATm!ybiOn zC!|)&CoNn7YlB$&KInF^^`LzN$F{{xm2>FSAN)p(_32EM0Fm)1#h{*wWFD~bI$YsT z-sGq8r^QkR4R4?kYpLyh3e&OI>lMglDmqjJUtJp0kzPyG%!{W4yQ*W>ps&uIYgkU* zni4)!Ht$nVqPvgrhuVHaT$-^#w$+SHoZ|x58Q8K;>GP$l8_G@K`px$9d*MWCMY~JD9jQ?Mc`mPHUgYCCi`B>*dBEcIWbE>_BFht5#ns-eeSI&X)Ozy#u~2H z>MKpyl(1H4#y+}sF&;CyWHWS;vKzmb6@=U?sEm18|?F z@e>M(JO8Tr=oP;e8K2nTjpxakbSxjYGEF-4v?J6nAnW`cXzh0%p#>5awD%)47|0-m(gb;OZVC{Wke`y;y4eD z7M}+N68pY6^93ZCBn9w4Cu2Am{-tCLBO?RH-)m{QG`8$F*bw~KcfSGz^hXU#L~ezV z5I`gn*)HpxbuSFzZSgVEn}2dPkk47)?>xsS=~UI%86;bwjn=vVfee?*;P|*IW?0iBg#)R z1qul{+nNqJfwJ#Dc+rmM?VemITAbeeK=DBffzZ8b)P@m{&_xDhY%fqGo`s!fdh`PC zw5BwJ2D>$bW+0Ja>)_G-Az*ryoax<^#}icj4<8;ZVc_xk4iU&SZja{(iY<>JvS?|| z>e7t{6Jfa@h7M9bsCtP!5)(%ciF})+{D^!;mh{|+eY2CnQLx^M>jaE0<7*HR3Al&? z(Lu?~pn1K_((A02u*2<3u%2r89@p=KXFM4%X}#WB17t~3Y0D^R#!ehEZcCO*mSd0F zZA3B#Lrx#UG_a4kh<qq1MNLW>(l=GV} z`~*f>ZC*4yth)Dxh7kSpCXSJn=Mwb*0)chPWBzwpe+_gN_%fRez!4w)>y3rjFhdHD z@~tqfI8NIUK%AWXTq*wRPz3q$?5sjdwK${}+YS6XPLl6r^wkkq;xTtBo~(2k9^c&49MKX|M2^?kGC*`anK2on#KuEk9q3RCcrAu)`8Z4txfD4%b& z&uq>kB2?^R{tb@VmO)n^N@q{~ZWI0WCc68L#n;5{v4U_qgF>u|AV~+1ljFhRR7?s8Q^}cu=1|hW{Qm!ZemkEmT zUz(s;SULY|%T}BXyA83YE&uQN315oVCgaBeCCC$q2;QaT8dB?)}J1RSUN^e5Yo$BME$j|8=8cz&I(iV6~46XuiW%CqC!*vhke zW7kJQkI@y$Wcy|HmW_8P`%h+RGtJwB*lBrtJ#N43+}E7guL25_nCmhPk3jBt6TQi7 zB5wZoOZ@4#kBic?*R`dYNyEweV&?4J+&zmOLpd1y-Fe7^-g{#6_CUvLyX1R?{?csl zcB6ncZ#Unk4({xaJsCevelO_UkLTAl1Of{At3Uzf%-4uZk#^G~8Mx zl`U+oqf6#-K}}h@-F!!B+y+O|^ZnQteGjCoj$Sjs=ha(-Ys6CMJsW^vzZhvz z6T)lr47%1Afv8zX6lGRwuc#lrnBXUnH!Hh8uCJnR%Y(gsKwI6ioSXyD4F{9Qfd6)~ zun-bhsNdyCWoQFnlM}SD0}F`)W*6OoD*$<3yq#sZ*#~+~wXUmKNc3qH-c@mca;OZ* zheUbB83}AmHzjZtE~J3sbq(C)g@ciU(IVi%%L3wUnJV>m!ff}aE4PPHr$nTh2jhaCBN(11#w6~(IpsMoOO>drsoq>E*=OZ_Vzyj z;jvwA>>MYL8mJ8*OdL-n58GCE*EKS+p9Oc1xdl6FbpSOy73~8w=%H<3#XOd#+q4Q` z8JdJnypl~R80h&~DjHw-MzYu;x0m}LV_B+r5S!t$*wQ2VKDpwbiJ!%>Jp7Cd!Gy^Vg$T_>xnp@y)A3t>O)Pv zXQ^dF7Vr+zdzwkzy6%sgz2}VXiT5ED4y}c~f6BaM6~U0OFnq@D3~#|p9yPn^L2SPK#hF?dRCt8MQpBJxX68ZwEs8vEKz-qY1`n+ zLWBb7%8=-9ULXiZDTYI40WCFvCA{=KU?#Tm7*GVBoZorLYm#&>Pgq!Nq=M7DVe9ArZe;_w6@Injr` z?_v@fB1_RL`P>&nI&u^M%5dfF5mNx2t+e-5R4XZiQBxuF?cd#eFZNzS6;A0@6*61&vQFtV|XqbX*74{K))h zbgqnsD90z=(zec4vTa9!%JFc$hx*NYT@9BUXa%VSU0_8$)f)UKFi?vGL)C=2-As&> z@*d15@GP>;;{cawbt-rjQ3~w)96N^5&|<*Q0@XgjGE2NkEzUBpBA|TO zRO9LZUyCr%R(S^xEsiGmz~Q*~)eP+KO9>|CdykOgs&W3k0aIg=Eh0&6EsX0)>wB%Z zz5-0ivV`SQY$q*D3S5!~e85#3-uxpE$%?+l zBDueMBbWa9Ghd#T`-bAeM8%-8;A1Wmz!W9&1`=yJYf zta(vE^zsz%yOOKwWvv`_*M_1S0tT?8KLp>z&ZI~Gfb8q<@APk>D{GB!9n;zRIm z$y zG#^5JFM31pBC{#g$bz_@s%GfDTbvnA1J?+-KsG zNA#We^bKfF>kj79;9v~2Enl2Ro(hlZi&N2l?lr)9-LQ*M9F`{ppQnXFBHxvfUD+AA z+a6>kKPK5qsqq(AGWjvwrX*IGKbkA;-+%T7-mXhC2y(m$nOObKVi~;rm7to27 z5>Ls0Q?zxx?q^?+9v?Dk3a_?yO27DL(GU!42(n#)xrRL~)tlRY=@ zaQP-AD2OO_zdPA-#?drOy~aPwR84Pjwy>qY?OlXLGX`P10f8BwcQ$&r(qSh^oj)>q z-VBVQI5)u-xl^}X(aZ6;SbM? znfkD+8zZ?Ux8V9_3e$n`Nsj_2n>Y@Nt$IT!`xq@k2 z^fjh(1)6yLF%Qbd_76)Y&h=(RkQ|zN0f2ch_z*Yk;3&qoGtC=yls`+YKm90$F3h-q z>I??|sEier4zjQ0da`I7Je1-=PD4MG`Z9+V{8=o_--D}=sj4#y_S96@kcU@;Cxj)o zk>kc%T&OY-H>Mz<`#!Ua-X$d-`C_!I!|||uf$+d?`HTU_=Jp!8BwBT+!$wn*8nzz@ zVz*YtRlbnOpsr_vcmIhlkr1#=D$+K@VEfo{wmNacm~eVkqN`j=nGCt!{Wpm z{$8jiqEX0&m38Uq00OGg#En(3&=4598@y?Jd%IhuHY)f0io|=5{LF$6KrUD-F5bbS ze^eK8;5kne)3qC^i=^u>N(_t^VgcdFrYLQOJwd=#K(SHeAbsOSv>_l(T%VU?F#2LL zAbbuvTiqeMJoj*Az&?m8noaoA^d4s?zev()$4b4xe)n>uggswUG^gLBqSR2Ro-eC& z1k6n1(T`F0`NY0V`K|>p(qKz&5l*Aq& zcU3MKFT$|Z#(?3l!5I#xWKBwMyF=ZzFx^OF+{;pCTwzvb+q!(Qs|0|%zH$K*<9Zi0 zy-d%Mg&i!;9bivmanqcKFzcbezauoFz?L*b3~;uS-r6=N2_M_W8k{T|h=wuVc9mFbN4dF6`(;Kj zOR=YSW&EtL!$=~$7~?IUfW1v_UroHqVtbDEkJ7=K0MIUnIhe}G7WX#u$(xkz>DgbB z_;wWiitV)%Pi%X*aVxZ1xCLo;LEt?MvSok-Q{f2@;d5L7o^fn=@!qdTz&Ih9F(bY! zl*Ef4lR(>ZkM<%zM)*LQCPBwFB2u)bWOXt9$dBnYf(jatY`D03D@&t|tJO2bUh}pQ zEh=6DHh17apS9ptCo6mqoZdbaNKDEUe3HyqFsXHA^v|X?9`mgu9eMZkV~IKay@j-!7Oz62b=0<%kl%!CnN|A*}KEd znQ#@4C55%GP}p$O86&b9tmd@DV*SP?%^l?~bk&7Wl11jfg0|vxYEA^ZGHWB`lmvOP zUhi7iVpH{U;dtA9#8n?oah>BXK!H~Me8fvFA(5+x9=uQv65c`sVSj)(bfx+wedV=b z^=moB6WITH0P9dlKDEcM-mN+4_?Jh7bkk5strO7JZ~$SEGYm%fL) ziT0cOsO+;d2^|-R9-D@A@3rZ$nE7EaD%J$4Zqs__GOOGM=Ud%c!JlRqS5Uak+k6(< zsI|C?B@*r9Mj7N%S55JKYBWXRQ9dI(y{@lqhcUYueN`52`_7CNJ$ka?jS|;dCGsvC zSBX(Ioy}eMpWCHZgDu)@dxlK8=Iv*AwS{I2O)AxTlYu1)Q+WD9s>|NT1pL+Y`pfH0 zRp$(SIc|i9SAh5ofBY^lK`wiJXqm>{; z*XHu3L->La7J<0&vN}PK!S=9*E}yk|)XY!SNGWe;hwVWPbza?9XXkbaqLW8Fd!ghh)2;}-3Z^GDnuHVzo44kwoXVFlGjx+BQj`4x&qwL+&8{Qv#T0(N7SH2F z9da3pk;6(;tVi3P4Hz2$1IsA1UG4}y#vw{6+W#_k@7DjnWRRHtr3?}?6BFm(Q`}S7 zy7pNTcUuWx!1H_{a+osgTd-LL@i-^OZZ30IYkZf&o$zUA>4JF1_`4=2zMrb9>@ZIP zY7O9Bop*Rr&m&kpIsf%82+s znpg8Ngfj9Y{G)lbIXK)8Bn^LPa;YTz!RaH~$#-|cY*kQcZfYw=(@gx>SiX+b?cC|3 z+7a<B*Ime#3S4`#P3Uaiq}fScwDw0=XNfeEZUx~uj>7Aa z#8LIRiA(f~LHM;<-&AYZ@BGmSQ`d7+$5TJB;4Uu#1lqe5#E^X;1JZrHJnY~RIK6vi zAhrIm@cSoR8LyjfV9#XcPrFl5JAZf^Zw{4@f<>BwUU{$?pFo%k_waY*dlHk%GL3wl`8}$nC4g6?1^^a(Q$3*BR~tvyOT`C zF&Sc@T|V$%>Ur-{v5xGzy@@p!4qbBAv5cu1IM3mm+9oYtv5+0|T0}J1FO5GHxsgS^ z+t0eK32G)jus~1%vs)BYYdbQlScNRKPfBz3RLhcVy}|`jw3LWfsGKo(lf*XK)V`m}0-xnt@4Wb`Mfq@t0jcJ>x8br)^UIL8r znflF&m+cAR^UFINn;CL3^}y=4wr8f@I==qc#HxG(Aq$V77k+JBxCbbW|0yYmOrt)5 zcg@q&d-Z4>k7{s{4PHv|@b4nEk0gt7_JB$mN4T_e2~MfDFJU>Fv;O$T;`M599mACI z`M?xHyCe~m*$$BjG;lN%%RQqWp&9yAG#U+NAT+#ezWu?IJp?VYgX>fWeKO&9)`DuL z&}r!2nSdgMhjo+unO6h^_a#pc_47vViLcR*kmuS>YJ2CbQGa6ihrokLpj^ijruQfi zRzzhAfq`8B zC$-z#0pKu6p$5yuoPsF{flSy`x7EmYMy7qWpeisx?nq#EQc{U=@g1UTRMzrE3Rgh) zIR<2!>MtRIJ1E1N`~GuzZZ*@>^CU5i3D;YjQb;@+GAkvNL|qY*_dyn1q+gwY#Gt{D zEqyHTMqH#7#KZzNI2C8Sz97#F$xOvoYvNOJTZq`P#523nHM~V=^ong0?Rf zNI=EtEXY^Chz60|!`zVKa72i8o9kW1k?h}dCd1SeT>*TfE~fewAf<^22C1ac+t(sf zf~{M*HMkyLi>6e|dShR^<;Pdw{Ye2o!0s_aUA@ujPPcUW4lpxE>-23kmp9C)AXm$_<6_;gda~9W!0sIt;3X!!IUQA3b2HXVTFkWnIoTJ7Q;lyQ3B1@k%mYq;2oDGUM$2gEc9!>$I zqC+bEQp}2n%y>u8<{QCYT(rz{K=QjaK=ssRRt#R_0|`=#L_X{?D-#Ezy-@I7iX97v zstC_UTugbxJa0z;T3Ru%P)8X$UThrLr>zQ+gQWg0Xd89oLYa_m4uIi!N$7j93xG@Y z(#HVFY@fJ&fa)oH(X`O|ha*6$>ly*AiaRJ&{c2e{7}%eVeJJ@{gD)R&+In&qCc*vi z1t%PsRz|%BB2ONNC}mN>UUG(K7x^@qvovqj<|xzKqWZ~GV{Cxy6wW;{wHNxnMH%gntkq*Scb+nfT)(XPOgE8o`2J zU@3n!*uaPERX?@5+1~cak_)mfB@ZTrZB4wgw&j1ehc@pDv&HLg^a`K;$^$~_qwuy6 zhoA;cPEWHzb#<*Ruz}VtvIz>43C3`#V%dw_K0~*DP%;H2m#d_pfkp4MtR09+Q%a$s zmF@ho=XE(tdNlk?*S_pUSZ<04>TubY#x~V<3IW#>@C0pBc1pfG7~jwe2H-xn4&+Zh z1Pm$hk{KrH-h&Xm-hwnNC-Boik?uYvZBKC8j5D*Kq*YkI7XZ3)Qm<5! zH1NBs!C-+5(4@qy>MoeTfn+j#UJaF!d|Cr2j%G{z^|^p8u@|y9)B+qZf-)fnRo3Q! zHx)qqfy)wd5{*In(}b?d0Ld=N*ryGGlsZB>b)0amAt$|^DE+KYx1f)q6CAf8*g9JA z1FhQ9#pxF16~ltS8XZ;W`@Sd%CXBKnpD6k?Fq%lAfTT4Mq<2=HQzW%B1bEB`?y)^f z^((ay#_LAaVAy*=I_cLkJceVB|MOh4WUJ$qSuxlxg7O||SrQ6Ybt|b-MV*i!JDFI{ z9K$23s;~OTLeU0>lwPH;L43wTK5N7-tCE-jX7!$}7$)BfWz-q#SsOJ{?V5tuq&_QY6$m*5L;j$rf`6wK!>UKsnV%x0a>%@MFhqZ2kb|-XrcN~^n1gr|>A~As^Q3kbU;@Yq)XH)oCANi`o zWrE<9cC?oABs;q>s^TEH`&sYSd0FK~$xFg1o00p0K(o)s=K0t|goX<6Ese^s=;7_3 zClmLPw>`x|`W#Xr{+K! zS{t-O%T>VXIZ~G3A3%e2?eh>4TU!{1qYvwTl2xslf{Qw6n-aSlPbSV)+Lo8{_{3$@tGTQvVAi<6q?pe~0{s=--uO;^3fT zB4FY8i+lG!5ZO6c{;QIV|GFcY82_6i|4sBCh@4DxY@7tF3`}&a|7O>3CD}Py=vY|) zW>?04rg-|_l>EyF|3%6Fbj!D0nHcGq*}fqe=-3(mQ%g2RI?lf%{_{G({{@lhFBkkB z@gJi9P?G6;)DWwkCTKSckI$jLy!_H9HC4ub#u^v_Vt z{||w|{NDrP-$ehR947-E<9A>%Gky=9?{Db-iV{}Fzr+3Owq*XtaQ>Su|4sDoaEy$M zbgbV9-*4>SLzSKBd!&4CG0}1UEf5)5+5VYK`7g?70(yBPD`jU}0(vha(xYbPx3Y zi$AWHFDe?agelNb7Y6I5`10z~QM(Ri5=e}H)G4~!Qv17PQt-X>3E4bllBcvN;jTpM z`a+mnQx($$1b)nbp)94@GIJM;az1!-@gn0C8(r5{2OCSh;FCD|x!PA(=s=i}h>h>K zO2o>$9+8w?X(+5fq%PMg@kdm2rEQ|LcG8V(jiO&gJ!N%EZUWM9>2XPGo{+U=gnc%W zYIs?~Ml^*P9!d>@IQwS**5%~$;r0+a-69e&XnUL zCFfn;%C?kx8S4?BC`n~<;j1d>&Pno8D({j_$cdH(-$hKQdzDC^W5gyU^w#LjEBm2Zz+vc(OG6#>iPjtZK+P z!ixGVv&p$XN~i|r*5diI#xhrt1@CrIzA4WkTk;n05GlKq97ZP*+5TJoCJy-E8C_> zRBZGJ8;@I_RO%9@Tu5#YMMh7amzU$3Ozuz$iE58n53;PTfPs`#FDj{3VUseIP>KBI zmQ3~i4~x+DE5}Bw70Cv?6|@o+vlPh+%g}~+v?|uC<)$c>f?w17(Jr}<&==*BsKh8^ zN;uJBekeXGNvYFvF)y`f1#@KUQ&e#4rYNbdP)9V^)U#4y7ym|TVqyihzg8_&$!-4- zn-XwDew0g95tZ^NO!%x|N{CRV!cdJ?!lYb>Sp?FN;*wJ#mNI>pGo{F9R^^l`M-!D1 zQ^ZDP#9T5nK$KQ3_Efx9miiP}RLu^7d#A%HRwFvDTq_7nt2G-KS-x;$=f7XVStJ_t zX3c~Rf3;%6M!H|hk^w)i_h- z^pj@eX82N7cU?KXvqi- zf3KJ+RDxSNmuqmAdHu3l=x+kneregOa9;cX$`Mhd$H`YsMMAmg*|M z@v5=1lAW59Pql`OWH!!bh{UWnVv_8%6|GV4zm|=p(ap67v?qJk4Z8EJ700V2KUZ3^ z|4e3XOe4{9{gPBvY*C`hgjG$9w*}i;Rt@}iZ3b^BL`0C{9 z8}#PtBc&UULrbOyYPH{m#q=AEkHvqU^yzp0xcImhFUID|?bHs*=(ydh!}4L@u=8h9 zbo{NI zyTX@$8;R|y%CV)hk(;4Wdx*-xEF)0G{#ZtXJs$rv^tSbSb}(gck0mW>6zzwwalD0J z@n!lb;^B&=Fmnm^jAi*YR;}mv*|}W1U8^2TN5`g~YR^(N_-9IAtyX?VuSQO7rX`a; z*F{fWPECHrkDFh+$McUyk8c-mSL=t(=5+UycRRYRl-nY`*SUUPKk%=V41v!{iW@vF zXy5c@A$xvV3HK+V%+>v~n?WzeUCi6T*0fuiPi8~!J9i_U{?=ee$OEK9v#1G-)LY-- zcgzpyZEE*g17A=ls28+u_&=z>%iVhd{XoAWo~=KRn^D&NY8W+L<9gZ*Eqk?2V`=l| zK9WU9;w1slrdTC8kZ`UzHXS)wOw)Ig;n2Td;#Hq1 zYzcS#ePT3ig{&&l8!4D$hI<=?{WM`aJAB@$4`1ce%TGmL%3H_9?NfW$r%yx2Tgs~2 zL8V`Y=5@<(5T0DAAMeXwHMV}wvn|?hnk7BhxXLxnG_e8*%w`EhWRL_k4jb57D(H?Gv2eCGz3p&*Ob|$ONrFfTm zJbcYxIrRDKPX+h9+s^0jp0of;{-2IrZ)<;E|Lku)f;UdLWbUZ_f1JGqcpEy>E*xg& zG|bG*%*@a*HO$PMhM5@}<}}RA%*@a*x8duah40+`_P=NMe{9QRStDs=Sf zVG;3c-tEjrVI6BuK+l`ETQk?2vr%geGh5Bss{i<6@kw7k`Go(?qv7r0!tCzs^vBWp zI7PPV&&k8EhvzXfk48@i&!)|dU#|y2?_T?N^LO*HnLjzYIG^0#5enMfyp;95y7}I| zd%C{AkGpPW_MSqPEWM2u@waiR7-&%BDloJ)>bVx?CFFK{x3MnQ3MZ~Mo|UtUKV1S@ zCOL=66$-n3WuKTuTEBFjkFVw_a5nLqI+6T=0E>s+ z7S&BsX#2C1G+W->OQ}s4+}fzk@M5HVReM@v+E2){tIZGGdb=$MTolWPfl&T50i>Re z&jg%Qy*$)^LyDsjuWXJ{e{%)os3HOI(hg6nfyns!bee+6B(-@@?5e!^=xSmKSW=y$ z(`u;Mjk-R~r=^^6aS?khkk|zKvMEH*)YzgS1H3Yk@6@aT<+v;dydPS!81?xWC?+&S z?E1Xf{N&P##uQej(Di80U5m`+*JS3k$PU^+)u1YCOSb8+5LLLzGcDh<7ZpIExpTLpuhTTE*zp zvS+LHw!^rDNUKJow}-!L8h*-<){xztnxkVU<&pawpI=xd|5a=~JcBDMyDU9UOKqZ8 zp_2Znr=cRsuvOOv&O=!PF9=WDM|NcRR%If;BHj=|HyLg?uv#8sq)Hj%x@&O^1ckXG zC1j(f$@PKKdt0r@kw71tLtdbYVf&mP-|fLBa*$$q_EMbn<9+{Gg`gN2&cCkWUPlxH z$TsBcJ=`Gpe#v+gf9OYiwdYCzWJZo5Afiw?#am*4|9($u9r2FW0Y3h6>=6weDCjG}C?^qWn!Wf@=I*t}7i+p4Mv5$97G7S^r7ZJMtS}Y*&_vTT8F9`L zPH?j<5GM$N43?eguh`hO>9AW8K%<=SDcM@EIgBE>iZGK{&y;k-YAu416tb?zpLQe~ zAhy7dlR!3L*^BpjAzc;y{ea)WpDCRQP6`DH0K|+$K8-K|__}eKGu^e2ER}r~h!=hB zv2rhB$u7uCb?p_*n_6Y_99`X3grHj8WrT}HWxLTP`dM}DN5q4M0tckPz&VUpMQsBN z4VC}gW{hiKJ-`=cm~?Q9jkT)nYQ##Cj6ng7)Vq@IC}bpO52ADPyOQ&kOhh@&KzZeHOiP^NZKzM+FnE#Z@8z5%0=NQZ<033m}m$%+aIn}I@{Ms$M90!o$yvL~F%M|N%;8R7#bX{&$kGB(OeK=Egd8gKIMo$#0mp@L zM7w5({dKpynostX-Y4eFq#KnXoJ+#ERzxw4NMs}F_B?$TP|cACxTC+x$;1ZTPYHw~ zzw<~oV*dD&Beq96j>W-kU=!I^q6Kf)HF*7>#Esw%6bB2~Fj}w2-X*eZb_uZiCx42K z9D9~R`y6|(zDd$Prbv5P65KneVU+}9@!d3K&LgxKsSw@F1i~+Sm(b0KCRihkafZK} zgyy(I86Ft$08q^o8~pKx!~m(=_py2(z?M;U6zuu3*HBHT=L>7HuuysRN7IRxS&r{y zpLu_0Dz_5!A8<%fFCGJofQ4gq|I0!=p<5S#o=2&OX><0s@V;PYB zZcvyoSP&{;X5Y2MD1R85PaaS%Hc@mc>U(?QcYyk{SXh<}Fz_M;w4z#H>yb?JSzxl2 z#x5zU3lu5mJ@SE};04Wrgh7$^=m&Jawj;R_T?TA*^1MQNy5+e65(9TcxT}EoE*dPb zXRkalaBbBc@~#RJFx$NVb_{dl|4C?tDSNS*ZNY}3ds>jOI6(FxU@-yXy)T|O3-QS& zZ?=9Y9}IgA0rY}#20`meF;LhdEWmXnAqZ^wfQy?i3yx!(Mv>uBRbK_1MZ~f7tfHLK>Q_qgtFN zl|;y)+7)h6cfZ-@q_w*r{li!&hyF}1_7iY>ww_2yFDLtpL1B|fK~^u<%_-$D5=Zs> zk=9=V`ql%OP+`Jc5URjYanyP~T;G~CvJekRn>inl-;v~Z*-L^nFzuYA!yKiXxfZ?B z%LE3R4&#J&}_&s-gB>*b1&%|@j~G5<*1#5ZY@2(Ua6}{ z+MB7XFkqIa9bl8&e-6U=G$`jh;YYDQvy!)5VkdxL>&Tnpv07t8&;Yo5_JZEty|$ZW z#9^jl7r7QHoP+rCy|T9vm3M+fHY%BlO^R31C?gJwf~+`RiRX}itK)^6Hp$dI9VzF_ z!ld91xqH%&!Jkvi%uVw2{L@n2+_bZ?GH|xaMqIKA9Z2w~f{^L6^TASKj9h2j6b_;a z9>RMj^_U0|%)Vwb?(}$%p=${ES7cfU>9(All;V1R+t3kA=TQcDa$;y}>4_=11pl14Oe#5I zv#?!K;>hCIMB>JEzY88cluC5!XL8ot3!Xfb%5>_la{`dFhf;-3{Q+)zd!nUdiTPvE z1La)(CYUOQ#;9{ZNeABP8A{pg6U_0B$*zuUKiVEy0hb4cm=bHy&L>C3udvcM7}-%L zYQ^F}%Qv7<6o{oyc)r>%u`txhOJ+@_4S`HV85T^8N0R7a-XuV2i1c?@@z|uf5W6pq z?wI-|aiYjohagnc$`90VV|TwwvZg08^gT2ld9+@*P9`4Dfp#`!&qepq`jN;DmShE_~jZhU%xlj0Mfe6z!*F; zbydIj5eE8R?Fz#pk=2?8#l&czK_giE8kcRoL* zqJ2%J+h^Xh9~Y<*#0B?7{v|ft-P*%B%o)>i{woX%3-XotI{tVZV zz(0P~kKC5bNB%_QuVhqIFf_J((VE#1EhZ^1M&qXlr zbpaQSAoGBcg0MFK8CUDZsLn!A?#}2g-+tEu7UZ>N}Cl z{=g3$_b>JmHmb_diu*{ZVxZLCZiAb4nCJ10fGMwl=$jH0NF1A=Aj1$x=s2 z>v!jct|Rfic|NdIU^zM@Z~N!o4^#1M%Bag~=3ye^MVs1kc0?`g5Nl?uEgsQkK;;(n zQ3EAjP>-M)+JwJ$?t?z861kOrmNvK`ZtTaPaepC_DLk%k>$pTtiCJ6Tko0Z~+nMV8 zfLu0usQLG2J%CdSfJ*!ioh{(#<^Q36ZtBi#yhB}Y#Wq8UdMgH;c#TFU5y#RD3{D|1WA zYYW#SpR3<#KU1Mkx1m4euB$ust2C{#_OZgggz%mAXkfpl z{XAVe>T(9*cg==NF`lAw8(_-?+G*OK*A^KQ&>CBJsJv4|3J1}Fmiw(oj_R{(WN7Qr zlFv*NZD=~C`_lPUPXqOl-p(pDAq?;5urHjGx{Mbv(}lkX?Z^z7ssjBNuI0f&p>Z46 zngGrQZ8E(&+G=pPXf#x6-ZRZ}pJvW_^7gY+nur-~=y(zZ?XD|9rrm4Og4o@gc0t`Q zA?_ijNnUuadC^X)?AU;7112*dc#YrKcuEhdQuc!C7hys(RpGJ-0<5cbLG^4PoM)?G zS}bZS_wwQ@%AbL9;5p#~m$L~%j$^*DzUqWoRbTV+5@yXDyqdes z-4tBj18;t-!N=rB|GCC%Ui92Um#?-C??12OC8EQA_YwJxHRxDx1CjUVo0~hn!9r_F zl205H*1Oj#saKSdd;*W&xlRAvE}T{3Y27S(&?e2^%BU?~0PRdiui(HjY_%A&x=l~R zo&bDhxQ8{I`y~SRPOBS1&)u~Pi7XqL-!P;75F^FppkE)pL&3mL9pqfQt?wxvc4VFB zWf8!8!h|_(Aw8)P&kEO-P&mC_fOt>?6&V2ec#I^xUmkomuX&M@1GNHWKFW-M48cFo z)Mhgx!Qp~<%|ti_;h8QH)k01_A)gD~U89{?@;mf8%hf9PdKDuC@R>9A14b#sD@)5w z@x*dd2$|`t^9OX!F#X7ir|<#HBVo(E(3a;-Fo=F9C*}RgqEKDDr;Fmrn$J9JljwGG zFaG%+Qkt}eBo)*~HK4i`_z#p|gDZIk;$pYpTm!^MV3V)i(FaI9IHUU@yfNoU*KBbN zj3?`q@(hoJQT`!(?Bz9R)Ck-6fyr?C9Dz`v!F7c8VS(Dn(=Pb^fmjoxb;ySNpWbN_ zly7|~SHie1M1|+GxJ9o+48eGUiN!&s+nu6nVZkzyM;m^5?U5i#JOpPfO5`X-x?_1s z)8X%>vDDN4x<;Dzh~+w$ipmnU9?Q}to-V?IC*T^AFX0NMpl2HPU%=uL|B0S%e82mS zYy1nYjp9<(2P`U(NqkU3vyo6fp9e&B2ajY0x&UcIV_Uz6^4$aFTq$ZoqK9&-!1;sy zYmFOcs4y{hjNz(Vf$@1fCoX7y!&CcLPsFiZtbPubU(+Mi*HIqE2NeSuEVou$UBC7Y z(WPqkXr3m=hf`w(-maex*FWCxe;n>lf4ooY`@Z)J2)vygo)PeW{L1Y1eZF|SU38O_ z-nL_?5g^8C8%@=Jf7Zand^+7*N9_LC|7f-E|Ni-0UxT+qFDpDUwdUjTiNJ{=M2|W* zT0zTwGu!*uW^R|q)AeyT3E2e@%ZYbv5JymIO&njLy2R0t(WIe)6l(EQ0GR-tR(G72 zhZBw`hE-?5MsxW0*}k zMq`}n(iT@#k|Ghs)H19-T;Sy!1?p1_^(cK2@M!KeWFwUo|dLoVo}Q=1L7!YNfN`faX^@ z-YGH5$c$e4N+C=;;!UWt9??@#<3dJ=1Z((B4Q^WaD@+6YwL`+ z*3xTgCkO*|BC~Wcu~n+z1==8&1^3UbRtu(*yUc<*xECdq{n{5y2?rLQ4P~uY*r8W~ zX(a!9JTVT3L3@1u=+CW4+T8tAxS+fOSYL3d?AI~DnU(OK6!gMi*t?tpb;zUVf>(E- z7TGiyAOT%pN|lT%%g5!nzB^H7Q(;wd(N2gy>dh_5C5;4&mZeL&KYHTJ3si|(4AP^J zN-&gU<`&^S{v`n$wSb9ejSY$N+hD{SKZA&^p0@9=bK7vAyjF>-7*+<$WX@|zRPE`2 z;rT}CFI#7B@?fr>#3vIO*|T$HZn4==^fl9YUM-9S|4UfzyR8-{;*%1Jz^TgBCtzH- zU}PTT`$IKNM9d?RKZI=@`-iaFri@q7JQRTrp2S!a89`c3I-o?Z#3$nw3CQ#lPSQ#Z zpe|f=<;fCx}oqq_?7G<&u8h{zsak@2a-J>TnXgt z+k}Sv2y5a|_|e8OuV7-_Ex5uE=M5ja@?+=rDN{Hs@;*yu;XJh6qu3LwO>QJYP~dZn zq@ic~JVczMt1uEfYVZXR)v`feREA%j9r$AZ_ZwHlo!rNbkj>3!~Q1o`~$2Pq+^L2 zVM!;b;g#SD57Hw7=?V|l_%oSrNUqFpk(*2P@dK8iwUAFr&M+Sl59B`tKCt+oxzs%LJKw_y&xxSCpoo)h zX3}fFS#!NPzPUvDXgA=Du9v;ovW1<&{OnF?=jHlx_%a4`G+9Z>62|0&b>R+A*#Uu8 zs9%UzlNh`#HTR==KE@5RuN@Zqp2vJRsQx;SHprKuu9Hf^WDGT3Pu}F+ttgd3#?SOe zP3jzh!dl&s>QdTRx74gK4+hJak+{}`c|M-N*D=I`+n~~9*NKj?iHeDiHS=M*>W#fI zy6R}xD6(%cW4=ks3Z{1=tFMZuWeX}E^VJ;|8h=n#6&*`ze^9NZ9r&t$P>J6uDb(Ugyv!k~$-NE~$+-;oK?-96YEgnKflLF`!40BgB4p#BCYu`t09H zQ7sl74>FH!3(}tHhubS87*tsv$L^m$x~MVZhnAZMn>K9$L81>p97zzbH}2#{<psJJMKGu%Tn_yyNUaToAa<#- zW5zQ%G#11jr#~v}jPTs#wNM16ytNh+$nlO}?y&8YrB_o|F=An{YlO)n$y3H;4)I<` z1wKI^SxX$?K9MNsbqEH>c=Y9q^a%T3M}&9%e{gxbX>qdN4AFfV^Os$O;5VPa&{s00@W86bg=~ z3@EcQvLceIRFK{*gor7)5&}FBpTY}MW-$C_xwNDbJB7yBA=H$bx`&zO6Q`6(U@zQw z!Eit(Wgy8H*HO$ylCPqQX?$SnL@j9O@ZQ-dNY#uP3HXqu-=dB*#yXrf*wH>S{^&L=Z^d^BQ1&RiuEZ5)pa^zY@;v6IOf$ zg3h=88sECEZ+aK>0aZa5!#6{igkN||1O_EZBV4MvF9yX}h)-xTEHw@8m*sLt$v5Rm zf1W9$P8SLk1)V;OLn{bBsQUnhB&h&2Uho2rL@NpT4fMv-H7UosHt(MF1Yo)DuegXE zI0P~*K4)0*m1aeT-7+z%p2WMT)HEq4>4HXcDS`O>Gy5+kPY{1Xz$B3L*VLTt;YQB# zS0vpLfrqz*MJWSIxD$%+FC(mz&f_9z7!t&0^+-+d@*^_m?2HqTGFurzq*)+=Ljto%OvPJOqU( zHi))$w)D2%pWo*XH?O++0p#QM$JL3BkvG&9FfGc=L9^Ot)KV7(uT_ z`R!q<-)p~_u$BkM&EN`g%6{axr?R)Rns4+spj44b5yNX}ei_O3dQq z$XU(%&C%_1zrv@^Ns)0ktbpqx`zMU%TD2+?=Q*zX`uzhO#Ywypdv3Fi!uFbT>)c`{ z)P}ta%ko4QXQg1Lj#+HR&_P8|!I{ zdJ~UtRf4H+w*1@|_Sd1H!Aer{HCK4QsnB`?tpv#55xBf1?|GRcNq2UT`i4$(Vk+%K4-*TqT z^GUL+k8i|k#WbXu?hjaJrTx7(QVeDuE4&1Gk$-2vi}|DfC0=nxmFk|lPyOu2=>wHm z6d3yhM(K*4QC_Gl?eMJLsfKsn{?)$+=BQ(%ifzG_(h*87WFjVYvouem@0iSdtY$pY!(rET*WdI*9F6J>|-HSK*_&(Is zKS$r{_w4!Ng|xQaYi+0C#Y7^I88pK`wWT+GsWBd0%Lysfski;u42Ji6RIF4M@L~oz z@-lc*8u*|tXqq&ZHq$~@af2Tn9v|hsyY*NM9S{;cJNZKn9fAjbPkoz+wqb`q`frUW zJiAiK6X3Vv>%kbF-ib$;d6hW%lZyWFxor7t-d)l6Z@({~4S+Wu@M7RTpb0VKhD)$_ z!}bft>3rC&nsU5a*e*F`x7HZ=@9H|a7b1bva+5vF zassTNrZr%JH5V+~O#293a%j2D*K+0;y_p#Lja}=$j}6C>he}PnV<{5s-Nn|cmZ%!k zL-2!L%^tXF^A$rx>~}<&PjQpprFzSm`poU@jfC~Dx*{AKIp-L$D{~R3RmByoN}fO8 z`-g|kAXZ=@sF&b;V&3K}UpF~oul&qujxnVb(w~c~3`f3*@CtP261dqdHN$_mSq!kn z?oC$UJ_r!`#6^3Iiy>f7NfOprc#k$;^M2QVWs~dLO&2th#2Dk)N}ep%KGUO~We^A1 zW)TcLiR-)R$|+gFEK9@x!#+;kG)>)+p7&8ZusozKhA_p!9ifKZ*13YfhQGt${d25M zi{&TxD3Mqj@fowMzE(?O=9}$*e|bv*Jbi(RB6pYBTMNJxyzg z$BahT0X-HZ?CkhPcoPmLoVdj3mT()s&pbx`n)MFUtDMOLYcM#k@zJOJA0KVD&C~4U zMmVT-(cvq;2xE^D@Sn(-+6N5KPyFiNtzQa z%RYIEs$f>~ba{f^YrV6H~#o#Gc8XlUT*zX?}BAC%Qdj$S6v!@ae z&r;nNDQqJy-WHGC4jqC1Z3M^^U*c4A#0F z=4J39A$S^&*ptH_$7BrNljO=vh`U@|o4_{#uskJ|s9)C?UuA1x9cp5R+Pe(TW8Biu z+jJwQ@7vmam0~|2C-YBV{w@6F{J(;B{zveai}7D9%KsYvaxwo|!Tg`K!uDrZ>;H@e zUlPCS1hK+7B+^~f8GE9(ELA5|Njcjv;Gs!vvP6$mA!Jd_IL~_2SNu! z?MI%#$--waI8dti= zV5XI5rM2K9SU@I-$_@o*0|wN+LKS`Th=c)s6lGlT7@rLs)2AiD6?09{{2r+)vef42 zSY|MKB%DN_gF=}68zm<$MGMqa5@R`bs14f|L?ux4zLO9-c-Ldu7JsgwoM*@IEV!dS z-Oy!6IRMe*z?{}f6zEq^s0LOs39<}hROh}zBUy_ALtv^=%ZCI5mPV*4C>0+2DKRt_ z34!2+Twk5_LVpwNen!2h?p9adsBr z?x`&n{<1$KCT9U4Ch~PTGBVjn%cqdU_`z`40rmylCupc~aWp7cBZ-|x?K0SKb($v*kaw&Y1WIe#bCnHDclg7eWQH7cS z3yxy6fMtbc$!9HqAwi^mL>kC})!9hP=u12Dy<{2?5Dv3l!5-b9mM=Dn1xt{Xn5h_H zs3cfpxscDAHz)Hj$3+gw?ThbwTY)!5LbK)YQ5}hTO~`m+O4G6jeIj9!uQL_&Gf)FKlhG%gBeO&C+gufv-W4$q8QdHh_!!3c`d+^Q^b^sahZ z`u)2SWMmWTsez{q$=xMl%c2Tik!<){oc-3zNQuFt;r_gMxUDeO4pC=VvWPGYtg~15 zdZ2Y6sW%K>>CS5uH_T7{5uHy0BuNG!7Ej-pE1{8NP)?rTfp+JQ zb^oGse^6LZdc)wr3yKkwc(7CLCeKcF)|>N@u|u!F$ga?%g zdjjwz5Zc6k>z%37TXh3{*0J%g>L05wX0!zjag<2ltz=w*L7bLDIgjo;=6gGh)&ICW zTM(4XP}D*#jIs{j*Ny!Wmp#h5@{mT(-%48F8!yo{N|VRj@OakMn96Ky52w;z?Z1}M zXi+>?9RVse@9FHBQV!)I;E|o{WmB0K+>4F~pO3ra zS@7jxt<;Zt^E+#!(JkuiQfg#`8Cv7{4;k zu!3TghKmaKI`rCxQur0Sh5Z>Ru=Xau(h){+dLb- zTsS=&ojd-TNQ@F?iC3aVigoB|`EdBk@_jgbQM}W)H(j0KP(^c$0<30$UGoqd`|9KM z*9#5^P|UKa!gj0N74LI|(0ykPX*7^eH^sBI$oD(iH8u>NZHl$<6zAI$JTjWxM`W?> zm+;3QqQBE#Kq{rwN%qMtbynl(SrgO<98E*e0z64W&=g!%L(m4ClqToWfe|+1 zjdO6`Q3G<>X?=l0sMYl{ai;OIS|=}2t-wcz*R zR_oGjwLmx0+f#@t-TGSi;q*(4(zq`j&EadEcn=I^wf`IpWsUzBOex@B3L~j5IDP0{ zmj0#SS@%W-V2w`jNRW!pR93gan$n0zx0aJ!eE0o<>X}{e-p2oA9cZ>0xIou$w)*2e zQ33sxYCuJ@Bu*heOPDX@3%*isZty$lJ&k~u=gp8Vq(xfZqto}*3X1W87 zqB-)$w>Alg;RD=gmX#uwyV}WAPG(N>67!s1^6Yd8o35d@UM4P)GdOk+F++%rS`0q0 zTf0*chNjqMFCPI5+41y(&$W2u7JK(Hz)YNG%T>NH+dC7HG6K_I)VryiAjZ%8OijK` zFzASDPhE6j?E8{hGx%uqU;A2afyj-&jCy==I~Q6|R(|5pdhk2Xh(GCbTS zKLVyqjI94P%4TBxzw9{v!*)3TteF1Kc$ogx!Skc9@C6##WS>uxz;dan61jl&rRHV zUxEhhX9bQdS*byPX3z#A@WI7A5Wp=O1#0rgd#T>LA0F?e9&aG%-cK9$T(b?zOJgYus$m z{=5}CXAk3)9K)_F&{V5q3lYs|`({>0E7BM|&;-*MiWZGj|6Ph)y&{Yh>2Qx&eb$Z) znX17vg|t}5rHR}r$vi8WOPVEkLW!7;2s0pwOJ9dH!v!7fgI?-T~sgTquwaIvqYOv-Qu5OY}a)B@t z70zU*qHv|S#6pT+XF2sy8NjYMxK4MoiSzW z$``66VloueLW!o5Z8p_>rU(40e zW!S=sDl=$nwf9kqp>0nE@r3I@j@#1GHA1Y}mAJ(I-NJoEYI~S3yhEK?# zk1vU&6tLhlMViKs_1~LgC(NBFJqRXiVTk8S>O7cKFc^-Qu*>seMyj4RYecF_mjV*< z)5&_8@s-RaNazR8X4wp&Qr5__$|VrAc~)KY*?NjwThNH`W_|;=WY zZY~TCoua9&+%9U^5t#7IPrftQ5p45!yge-E3UvFt9s)KG!wi1UH+S9JU2kaaPoLdi zu7gyIW1gSSw%?CXB8nAxLn2g4lRLN%u&Q4cBR+oJ{S@eQ%KvH!+65n3z|Z$q6_yvK zgda+|(NBnlH32>3WFInXa36-eOVOubf@P1j%SaprHI1A@!aLk`w4=RNTfI2?z;VO4 z3cBEC=QpEM<%d66E-@@YeEmI(!>ZY-QerCXSb*SVoi6OSxPNlnkM|ZetVQ7cIJX<0 zXx@3JrqW@9F&8o?jFaJ-8SfWOYbVgH$BxU_I}kfi1pK+qX@B!{;b`eIEH>&Y<0O#{ z;4z{LphJ5be@AzAL9TnOyy8+Jm5m)_ju>#XQiO$)2h0;~C1~bcMPumGoV-lzb+J%? zGfJr;*Z5tEeudv}jQxha=ioW8JUpY+S5(ipIY`2u@-5b?1>NK_eqVAUC+SIYGM(w! zSqD6f`sV|>>9dZDb0G1Gs4=oNGfF%5r>;0{?1y2#W*5*5SvOagZyn@#0T)fJd}%t930_T&JV4Y7gr({~w# z6zynUwh+RSA{&CeSCC!Cf&0Y>!HftFpy0VsugSG~KsO12xjPUrT@rfA*Is|`WC@8I z+AH~3{y7_Xcetabt6Z<{LLJ8ZSL_Pz#?uOwpbTf#FA5Z-cBYCnJiQMayr9ktqlQ-y zC+M(TxcFgRfV~WdRgS!{+n6D!bMj(YIBb5mt)U)RkP4qyrZ54)S&4KM;CU>4-WoSH1jBoO)>*Gflz`OA7Dri!Gda3`ZuF1p6cFwAL_=&hrl94$Iq_EFDM;d>yI8}Ri zII%(fFjbM>)CU6Xi=YKW(icHf2-PowHbBpz)0`?zSw!{_d@h~k-dKbX8GXSy-1$7R zCuOKX1}6e28E3&q-1)8Y=GCbGmQ(@Z1&)~l%hwS3!G&dbK$Rmf?^Z%~RbZ_^cB}9z zI?YRL)v>AM8WRq2JpEShX2`Mexfi-W?cD{?+9x z&i4adgq)myyMUAIp$+b^Z4tmseZ}=fJdAtX<9fv(+g)u;d6ip0V>6Gy;oS=*$s=*B zglS{{5xbg9h->brvbGW3NmKf(L(Tcrqj{avc5cUf8o`f4@Td2A*%jygvdwIyf%EsD ztgphuTl3ovCp9n4n7szuMhb(&d|o-!OgYqb5>=G~UJmLaSGo4zL|c@Jb*PZ5lb|%D zgK5b6l2LZ0!vWdgQS|evL@ z>`Lh00!)LY!eg@q6ek$K#1H{Y58P*YPFxNbKn}GPASbt+A%mJRqnzrdz^$J5O1VXxr@2)nL}rys4@ z9abx0oEo}Y$-9Rm`e!2!^NXk$0?WdaP>t ztkku4Z~ORT`B#m(M;uDuyOgi!Uql8wt&qejLAyHECR<7kHWU~yDX@N`%B~2`l$&)x zPMN1Lw`E0DQx*D*nCr1@-I%hTVCh_Py6oy zIagj=_%nwb51+k+6$J8t51l=ATyS0CvG5_<4;wY;+f7e4YEa1A2O(UG?$mtWXnzur zAp5ZT_uB_%Kme5g8q%`;|A4{&{aFAL3*&ze>sgrpdsxo`2psa?jsXiGfXiR-$lKWh z0*3rC?0=ZQGqG{}S)TtVtp6X)J{$Az044v=NF)GL_*j4`{BJv*83A*tqAs9*K{zn` zdWeo|0IVmHk0K1;2bjWNcO#CTF3)eO(7IS4He^xrB_#ZkL}#Na!7!5KdQdEX7Z8@F z6;3JXER7RBDiTIObFnTK92~OWSy7`5uu{(tO;A;^&1c2g5Se6m4_ubt4PKRTHAGCwC}45+*7sSTYeanOzX4B32Vw zAZ%b2MJ+=}4z2v6R0%gqcE;ksi}@KwYfxvgQAfr@3v5N zvr=z~`W7aMqIb0}KS=YHRC8%5?1;#A2S&}P1XkF|#+R5^c})t_GKjIX824!|`&ONC?Gj^>0%t6!wAoU8%}+kA@ZaBeSh_E0S8dZYXSGv$<>>1Cpd$!op$nZ$% ziYjHn8O{Qd>|Mo1c9}?$QISQe%vSY$YUrdW8S1N~$;zc!=rp2Ll{8Y!Z*3lAa8)i| zG#O`%mFBkW`ecCE@ndsa4^=bY5i)CTS;Z6UB`3F(5U2t9uc21yjJ}T&f{|vfo8G95EEEc<& z&<6!Fvl#d7EM5JUTgF$tz&1z$(RRbefvYy9HLsH&#jGaoZakczdnBJ5?Ll3i8>@qxR`8?Rxq zd?q?{io$3(m6Xkplqw{&wJN1zG9w9p#&nq%tE9G+Cep>0indhaAjV)R{zL|SqJoEB z!Btv^QgQL2Xf+8UNW#p%PLXZ$i&hob;cRVM7U`Psb@jC9rg&Dw3T$gCjp`NAYE~&pS`9%9h&~w$+RI?( zH+1NtRb-83WWjVS*g-2OhP3QU|HyG=um5&z*L_LU9wsaJZir}h42NBt%_4fe5M?|(jCRbG zv&XO6=Pu&AA@+?-RZn;pB_dVP6k07+QU1G}qI?nH<&Rra{HksEmsA<&OjK{fHW{L3myTi(>O|T5?*lm*u36!8Xvd}n9jCukNI5N= z)Nb)gsHU8OiEgZb!;IT@en0&m$ksamT{z zG0)P&)}{w7Ft9(nQg2SngJV|{^DP$=GBn@s*dJ2udRmen7afRR;mz<-axuLIp2a5j zDm7Hi2b>|`UHaRaxp3Y9^2jFc@^IU8It#8LoOSgJH1+;?(tmau)z1lqx&3k6{dzAS zLU;f>E$$7444E66v4q46KUlEKI9JOBPZ1D`vL)2^H_&buB(w+|1FuOi!;<%U5kHmx`sJ->Kkio7iw$oYiA@}T(^JFPQV^4cfC&cbZNPCX0J(~2xW@6?Hp}`Fbg2V}?N@!oy z&Xi&r@U$SZVsP(C?I4eyvR1LRYwvOjTbv8hgxw zu!Ex47JcMgBOpp{y7@$A>+-DW=rb-?`bjuJbVh$Y+nrZ(7H9T&U_39F2Hy3 z!?3na|*Ai)|B+^+zqPHp)RA~JHoIayYy0MS+oE+SQw<{br)62V> zRysw@1$lyPJ)X6m+{?dee<9X#FemWVV!WAXwzvK?ZFn^=-r`BVe8vhXf2oP#?FWOc zF z37o_kRSH%~XkB4pw`^`@a!>nUcAor6dGm((5t)#0UT3a4n!GCx<1c8xR|^{>mr>2n z!VlP%6;tcc6Ta`}&HnC`k_s?oo0bJCxH%vTi!4usSWY_~EIw;b6!adRW*Q&>2dK#_ zu(?k}b4kck6gQtJ=9177VeApuO+#2(sTjz~cF<_O9DbfIPqmKrYI~ZW?20GZBTKhH zk?91_T@X9#w2mCpy>$D!ZmgycbNSB zAXKiB0UJlA^qxOUA-i5do~}wvG9z^4hUtaW`V+~pABD@(2CHnA)8k|Fz1_ntw%@l` zB`Y3*k22`}rGQz}FB`Iqmqb`Uk)phyhWNnt@dF(Yd$D0yP_VUIqcCXqBLZhPOz%0c z-O!_4uUcP|6}B{{48ow#asNC*WDA;^D|7*!yYGkuP}gz)9UHvszQNO=FSJYi-2m&*uz5{0bx8IeM+-qE>T5eM;C6O5n&7ghxk zHg(xAELMYzX|(!>*dqXrnKi7_HqBI(z3c>@3K<+xbC&H}kDH`(1it33wkToMcAY$k znA@CnZo}0IlHpBO#p%D+vrd_$f;`;#6fVDCAd1xMMBIPT4FY++3FX;20LKwpcc!ykvy76e)~&>3zEWuD7f3R#f6<-QdRZs z+p4Ogdya@RpU|e2#Dm9nJ>$jUnQiI-BLiS^WD=fx?sOw8 zX6fM=HhW0_-+LGz=l{I2`Ok!i{Qr)bc>i-9^1pEdE=n#wE&+jm(#!uNKjLXOVt}sP ziiEhwbbI>5|Ska&|ZTHMMzZ= zP5?b+@_TWEDZk?gR`DANXAlwX;kmMC*e8A&(Qk4uN7YSgsEaZIqCqe4g!jhKS76Nit?dB>Fi$9G9~E>YgB=@?0r(oxeP8 zF|NK4?09vH@D_zx{D8Qv_-)Eme;7qW*8Q=P#X5NXoChlS>943~QcRS)%2LyXZ z|7P^bD<#n0DDi$w<6mVA0pr7iW`v!zt^3FozRbX z;AwTw%yO^2FmSM>4+e6GJn?OlFT5$QOv8Ne)+ijxtiLAh?s1~3irHmag9MNBIw5Sm zk3q0w9Cea%3?;qMBR3*yr20WZRpfZV=xnd055)GS&>cTa!wl8DRU1%R#x|kN{K&3< z#dmCKE<7ur_t!`5Pip4e$GcuRG8$TExft139rLS6#O{RyfgA?Y`j+UTpxSM zg{1AIB>YkTn|@6Fwv$I;%yFS`$G}3<8SE+SBXONjbz`wdzzfHX~pf-*HA0H>2mCzG!Sk+KwNvZdDZkwJ@`aetyv_x8;8}cS1x7YV!ur7KeeAXHdsu$YK0G6J14Yt?B#c;p zbZ~t&3Yq$-%6+8lNaTDe?yG?!Dn?--+4uHtV4I%K$uwB^$4(EQxFPwrFQ_eU5{t{$9A zm}IvL8R4NwJXa^!Tf?CMs7ze`&xx?s2{S1O7~i z`rqCjC;rI5f4}+gf&F6~4P2lD?-Pyg3;|N9vJJqZ#<6MxNj?*EUX?OswiC``q&-mu{# zs_(<5pLUXnss0cs_T~3S+T%)bbG2f?Yr<#6XU&>76FJGX7QH~oZ~w^`#flQ;v8vaW zFKC}vURMUl=MNv;>b~f`@IUzl5WH}xf4i#SWPJaPx3D8aRnY`(Z-A0KkO(H?Vkq?Iml3RR(k=D3#MUuZw&-e_OWhafQe zUY`(2p}3_*F+MtkmT6te?#MFChi)QxlESO^Jh7=zC2EcrY>|XoYh5~oT5DdaN;Wb5 ztK%UQg1seyXb9-X@z;>=PuZ+uE&nto!o;9~gcGW#@rgtxC^8939=R|EJNiAv)IAH1 zvR6l+tslA~NwR0^$E#MqW#y(eZDNp0s^p4@DvX^)F5F!05w_wNYba~LLk3;wUN&3k zZM7846MmNv_814vWGV#N7F3VMsm|PrA!(@)M0A2?*F~Ux!uZZ?DbkQEnGPi!BB1C6 zU5{!@08ihmv8);j_GK^aYbt$#=CoUNM^OoqI>$v(nNut6vpl8U(v<|);nczf!9sL# zeOVxjxQ{Re4p0TCkJ6PAPytMkJKRUV0ushc@q%(_ewbjW!=vWSN1}pkM$RW=$Q16- zN^uQt(PFPI%v?J|OxQOH0yL`;hQ0r)752#-0qmUx%C+KFC$ ztyy7FcWVmQQkzc{q0Z2KM!05cfi_xO524P8w~`%bhjJlt!<#lz?-NXLka7?KlO?3A zI2vYp z(BUej?4iB8CWL<1WHXh+)$P2pz?9j<((E|C7{$OWGpFo2frZ~J5nLWY{YTw9R+Vl$G9|c_yaW8B+qn zHgN9V6zM$D9`fJa&5P?uQ*Ept?ZbLDHuVt$-`YxhkROc~`>jncu#)nruB8=$hm<=H zGRUU!76vVK1g%f@eh%tierwO`q2JxvEu@5{bSz{NRjAiM>%khi7`l21(%7IUUFAz~b1YKO4@cr=UNrt`^`-#1I~5`!$7E``7d{XF+2JSfZuP z*kQ*h4*S)l_-THL(y0>YEX!)1(4U{zQzcP6M)@ru7IBTZdBJko{;*dJv!Jpv>yQr@ zj$L(RcYJz&_p4n*N}@AR)j8OuglK4q)bZG!z8IJHzN{Cs^(M{-S6OQF$HWwON*;?A zsE2-fN+4x649=9T3$A*6I}Gc)GB6pdhWUZ-tAP2REp{!8f%qy!>VWYQraf%+ShcL3 zdx00bM*>xMWvArQTV{m?tB8m~{@IsT%XwSpxdKm9RsFkYgdbHp^n4msXM1OR(X1sT zGRSm9(@dw>`7k^LbAlD}D%8b?mv=>fddkf7>xGbnaWmItpXDvtez>gXm>CBurwFbj zr%jUK6)(lv{UmtW=8khskwkPDbmsqQ9?(cg5vwM2ey!szq`0y;KmRA{5w~dkT%47= zQHg;6VH!mM(LX&RJZNru5-3hL_k8e6HLTqb^)LJ9RdP6+u3zQd!LBdKc|D3HHeRZ$ zjanH5V*Qo5V*Ns@`_2tl=&E1Vv&XupDlnF&YQm}nbruPR4wfF|E}uLMv&gAYe?NI- zo0I;fZ_(v@pc`x{iwf9si>V}4qKl#3p~2G9hLr`G2R+DaWjYbmp_qpeUL1}ps%SUz z0)?N2vaCx4P+|mPLkL!9IUp=pXEF-cqnKnwM)R4dfQ>ytDuH%hBTmgBK=MwHf5OYWt*DtTgi&Klk|q@K8|(^ zeh&3(H-m5fTzjUA*jeSr*Uy}6qBO^1*O61gB6-t5HfV-ZygH8$CxgaQhTP7T>mXV= zwHm@JJ9Nh>qaCBzpn80Q@m$SgolW_WPEuw^)tj8`rBNo{4Xz%!|= zM`fA0QXNLDqlKPWtj8+zmjw41%Gd!jmX$XAXnA98m6Tq<$#8>pTHk^r3!C*UHOe-( z@l(5|w?~3d1_Log#>p}021!$D6_P`rweydQ^D`4gsW39l2X0$SAv@uCj5K4yvq7WN z4nVLRK(#<8eU`>fJ;x?4SFHU|)mR|?$k0U}w@hjfThyM(ZvxC^unO@f@#ljSL69^7 z@RGu=cFcCDulb0obO!mfiwh6M-?xs;gq4bivv6J8_0zdq$n*pZO<4d0PA2> zjc-g|GCC@ITEb&hP$0&f3YQ+@MjeFmJ2##|>S5}$O#BGE2xTfLg{Y{b-3KrJ6eGyq zpCYywu!^rNeWOZT>I31#XEbFl;S8~EWd((FbU6p)J|Y!xkvN=Z2AwLwcm0LOjy<(48rn}ak%-67V{q*(h$)!894is*b^{jI$!W3=$YTgh=Q*H8bu zf-dq6O!&2=T!~2cs?EzvR-n^X*3L71?w=kx0gCnf`=m3Laq2yJ(GHSm zs}ap9vufnlz4Y8`AJ0?NC9{Cva;Rf^dn2+J*E$UJY^@mIvG_1W%aX zu(fbwloz|MXWkW9G!#D5CaJLM;a6+@8BIhU_!hr-{;G^PT1@JVIDVb99&t3EBmxTM za*+^u5L@tbT8mly=CVe&(BrYjv(V$VhPNmJ3Z-(Db6N{oq;Xj@S#%K14`-;2cyd}J zTdWYxk7Nu34TduGMp!K;VMdxc%QCrCftfQI-+*?OlSU(xUsYf&j){1(xta)hQn+{s zd2+eDfSDs1mB7q_3^1_LN(J4biijtMOBa|qmVso!Or+hPfed7_Q6aJb5NQu&n2+Fc zS&Ler5NY>i1dQx)(Wi3>0m0TP_!itmDg7Co79(8rxm;Jo7UY(b;v=V4ljQ#fJU^OYG9ucS@j~Q5VR3FX={&MFn6b(E_uq9mLxji!(Zbng zvX1D6Wn^t6;|q}os)e)lq$;pIiA#X7-o^I7#$&m7kog*q;Hq#$jFcH^` zEM@tqXiA7<$sR9&AL4Lg=SW89V7HT%QI0ZZ575(WOtvQK z0F-=K8;BJN;=Q!yq`=sK6(+l4OD?)N+jc$TFN$CofFYw@SxHRt6KJxyBq_NaG+9^@ zn(PO#*5-~&&IC;sSPIj5fmGt!%V9DBU{HoXaUvMBFtX+)X>WdhBw59jDXWCn&7YJO zr=g`Zp{v0in(Us{1WeX4?21S>2gEWGsVh;{{0vDBFjOX|YX|K?#v7TyMf==L-~w6| zupnTLNvW7NRgbKQHu86-ic(@SRLzQdOhVd?R0Xnx?$=L98*BKuCpA04qFl7rO%4105 zzXB2!FDdEVxKPOp8Z1DhrF#l~XNbfvdC9?A*JN~?BcvXo0XQC$(ASv6FCuiN+Shp9 z_jK`rQeZ5Ac=^)1JlKZ!styzY05gCBRGI>0Ehy%e5qa+k02tcW;@$V;bQg0&K8)Y8 zlUo_TrC5IpA9+^+pEN`~NxtJMXCUtJ0WfBVB($!X>4FRP@Ur%;047B-z2$py0F#2f zZ&~|7fFK2&{L(!lKwjA%C0%c+P<~MZ1Cx*>80U6n7bGf=Ls7bi1t2fmqXInJO~3Kp zQ_{UK{!s?!WpraJvRa!$l_Vsa0LTmWf&k~mdnN#HZFluajCQvRM6SR&J%ftocNGm_<+=WCj+ zP?-!QMb@ROoy!F5i!8;R&PDx-+B$WauiJ`egtm%9*@S3pi@`#$wp}1+R zr{K7Att*Qy4JT28pz{D0+KibhI1U!So&LG>@0$>v(VsRjnYc~Ph+23&OE8&=N)gEb z0JFLE=gliPVwQx=tWc1q7BLUjB4c5Rpmi2n38S?=47a$oJ+zi$9iB!q1&COF;j8{x?y9*R!3KxM5s+ zGOgjXj1o1SGr$NWXfdKk`6I&(D={L&jq8&L9Y5eF=rbeNJPf^IpCS%A=#Xhvv#3;v zkGDLFzKT&(tEfO$&12kFEtLKmdCp=#7Aryh_JQP!_b72Vu%Qpd z0c#R=(i_!G;KkC#0reqzIRpJ6vd*+&<2BJebC~um|2Nwmc|>DxDA2g=z^yNm~pS^DN zreXg&>uR4?>+A>eJ{Kq-*mIaQ_9LF7c^t8ZQaf_yTqp*0qTl z2$uMNhmdL%am}WWktlt!rk5^GB+=h*qd9+AH*JUCJNKe+y|E6TIN6y)R}-~M!>M!6 zJL(z&laO+Vv_;d175`4WbRY0XHl;^OQ({91|BlXI7hnA}_uYq@{Do6~87V?vIQmIL*SpLi*&;Aim)n)dyn} z1$haF9&z^Q!gW7rIKqWD$Y-Tcj!dh(@7D~&N2<4pS@@cGjbycjD*21Rla*qH`TmL$ zN4bM11pO05UMGV)5<^*62-xT;I@i6kQ1ejQ(ArQb&@Cavl6+>^1t^?YpP+SMn4xf> z_CvTOnF`=E&=_HWh`2B)P){MElI)a-iRfc6mN483{6a7a;BBGoLr@Cf7@^!l&?r?% zBlOAppgExm)zIt&F$keZVM+hbD0V5fl^=2ewF%P${R(^O)3+2-2W1M=14RlQfbmGO z#nbnn0SxUC>GD5=7xV?}25c9qFXAQt*1ybLAp%gr|8^B0aklvSsQM_N>tNoYeBm#- zx9IvVpgCYnphPi!F)l^=nnG-#)L}7Tf>3=?E@`)*wvhXFLq?$zV923G(R`60n9G>H zpXxE|3F;9){kNzDb&j}(*hWxK;)=N?5Yh?l1APv+2Hi$>>CjgP)e7wlzXsDr3a&fff9i}D4LF0 z<(dpeyP+6-9p(J^e`wahhoJYF!E!D`q47h7|9@%zS1&v$2G>S8AGjt1(f%*yhx+RF z$A00H#CpibK6K3&fdMX>{svzx>DX+nSkqAX?|%+)n=zcCdUI_FI$*>?H>8yz7+bY6 ztwkcUE*czu*kVy83LoKALEjzW=dNFpNDV#_zq(y2zN$&~sz^}pqeL6PZMu#ZxLwBW z&hm*o`?eD5cccScMPob;pj|#G2h_9)y-U8G>&EubL$~AzD{|q)of7SzToy0Ivh+rWcK9iz`xx=@Z5E)T#7zg zD$br|E8y8%(M@!Z8%wHAD6)ZwdrJ60i7}2h!j{O>4eZUajl1%VnW5ggjz;5aKRJ;m z|K>jwIr@^YFh5WAc8W!(ma?blejbw3j4zB)l2$XSw4-$hyC3B*YoQ}h1a->oDU@xBf*$m^-W@zeI$%e3*#Bc( zYsjz0ht3(R4+ZOoCXXb472H7^3FkNpwFGyCge&3q1B&9&_r*b6Z>Gi~2G8V7V*H@% zPkw}AFvQn_!cb{{nI0{e5~Nmew2q~?;z#nOdm{zGauzcMHvQ6K2_}*pMd`EipZt{q z-pGbbr0R+!ik2EM+9V2k2Tq{;qk($&%201jC^3@A>U4#dM zai6QQ$~Qp|mr`>A!Gl!T3ydz1*yTBvhtfS(&fE014<<=(5LhQUH~0~_nbozQvaL zKH58RtH6LfTdaS5-58k)er>U*V;I|iQ^GiC~l+86_^UX~YpH9b;IR>2kr)2yUIga1pj1dO!e5-7h#CF(!nc zLtIh^DyrA<9!HT=k7BP2aGhT`E>UVw(uec4k95NRahOrL;!VIefN<-jK5NKde=Kay zLoaNUV)I*d>ec9p6V4qXlj6{>!>!@MNCFDQSkdnZCGCz_ZO(ChUfHTCQrtF)lSH&0 z2;iK5rYM@fEw8T`#U&#MbGI4M9p=qGL8?eNDX3L}WlsIU7HJ=dwO*42ORTmFc%v84 zPhus1T_U)(P|Y`IuM*W_n$Ez^S@-*l`)#9;(`pP2DP1E^g|dZ3;4Yg{=PRw(X*}@> zUP;<#+^WzRZ6wCoQEgY#~u$4ldn5di4_CQwiV@P$ImEq}D$@i=2Or{j|n&6|+#xf*7HRRR|0Wkd!Z3 zX;!ktVk%f!mAF`yunrGoV*(HK@k>4Fapa znFU~wQT6@NF&dE|gNwO)B6}0`S6^^JzS{+MYfj`y7g8jw;;`xLCo*VgG9rhG5Ykf~ z+b>Qie8y;3ZKNFao0Yn^(e1O1> zpL|V!&yHD{Puo2EfnIm;2$6=<7XreQehz+B{^w_=o1Uu;i1;f3yK8=N6OO9Q6G*s;oUp~e_}PyL zOcXax8(3U560gNKj5OR~xj|;SPV^zIQw{2r=&lSh?XU9p7KgO%=e5wS-T6>-7l$%K zUQL7j)~^E(R79++mfvY@QEqcKVZ>%6A5wxI+O_D!lv4dtneUi&k9DgSsuzN$aWyMh z#p5uA4~|F2qn-VcD3G@Gr3G=5MZhV7#(~U<;!lt@2jeFEj$AfF&SGA~nEQw!6kbh; zpa^EEmzpM8ho4X-C4MTVdgpMQAszgVT86Jw?~!2ICUu3^cqmJ>S(|gI8dFNYve6F< zK)pj4%3~&}-toeKWz*`<5^1fhb-kw55@3E2H@)E`doguhHE%n3vcu<6A&7m91@G+B zerdhpb>shxkgoe9QATia2>DsV=bY=HoL>wY7qoHV&B-{0XdjW-00x^J6JxYESRjfx}-0YxIkK z3MjeK^x*{CLDXoNxBmTG1OrFh6jibpkf)>!Ti3*=ZOWTLsnb@O8amS3MJZ32s655t zo&`nwFUJ7>_CCALm| z*hWD^_Tt~UNM&JwD22`-xDGDlzf^c}gM# z$x2@OtX+KlF&tOhFBfme<0rwVPCoGS#?VTzk$<*kEsGPtil;S`!%{W0CjWtw2ty_0 zmSo=+OEYYoWIoG1-v7c-qum&BRtPo!XI~opYjfW1BSx4dO_*<@@B~PKpK9rV4k5!_ zH0FW@!*#X|-pzHe+HZ<<-*xXk5n(G;MwJIt`_Hr?u(46d8D`wA>;{m!73nu-vLD|n z-jz*+qt6ktOzIiFVWiJgkuJmLq*S!c5xWY$>Cp+u==g0JaegjXHKfz$y2Ra$6d)3~ zq+zh>qIFt>oBLJhO?~#3irj=vuDF#%>q?7Essy8u-1pDCxVR;jkjaH+B78EKGp;uNowJ<98A%7zZ5yi>do<$_l zN!Sv#3@v4@R;RDIH3NOmI@!Q+tgm=>+sLbs`}--~i|EVmsDmFlX9z=1gRZ9HDnCsY z6F-CSAdHrznANRwM3dJD?g8>EN^vMl)5{yl)!Z4)hAH!oQ8gj`j+|DD>U%EqV)Qq_ zKU)`ttxvX{ws9)$Lx+2x-lphtOxfap7#{ch7qV0kYuH-)>-alJfP+DPbYHThvL zmFeZE4Sw#)^Z9J_5y{;9epb)lW7ai{qzs44W%+96y5*NHXE<{r$L;KW8=?%U6MBJP9Hk$ohXn0Iht(T4W!=aYn zq3%DAP)+M_Q;A6ApROBztqz1c`esXB*qf*O&U+!&H=( zFoHgs?@qT~GDki?lz(^3t&RS@@u83Ru-Cy)P&L&31y-?z>Cj%|Dj`PGQ#z&QQ`BLY ztBYQ)NnWlgT25IoF!&~W`V9m2TPX0GJli&R%sahm{q1~i#7;tmP=D!c9KC+ zNF?8J@OBi>Rgo@3rIPXMGyIwNsuEn*5W`-S{9$>$s*T4{tWjlu0b9?c09VqkVCnFQ ztMAk}ntnLL;tAKb*34s<5h6kzWXEeI(0bp}p~#@}YOmD&BHfWK+x@QD;)5_N@u38M z0r_YnbQ90Bxy5>BMJ&#r^nPmVb6Dk$#^@H-wst0kiam2j%z0vsth`=PmR@6JeX?rg zqSSB(h31n6#tKH~39ZtjQt~u|5{7p29w(jBfVv;tF9-WQxQ8)L2F1U%jvI$lawibd za~?sthfz)ieBAQJ|0o-dP9b%3;WFo-4-h_!^{MN6Z9%OrH-0)#O($K^ZQ}6iZ>iQd z?GzMSaGzS?TjBuh*7h8I-rRZe3GzAdk`S-=-5~pToEjfx&k=ekQb?;6bKM5Er;9S5 zH}`o5jPyemn_jZ_;pqg2wu#{!GIlkFTuwtrS^rrt0{7qlGb~8! zy1zmPq%u*6gJpfH^~CxPck~A*+4m@dw%@#UH%!Bxap=CDxSdZ3yx(dc5&vs4w%zI^ z!|1EJ1334v>Wcsm-{+S4A^pTmYvVfo5yUDR5tbW{&d!eFan$daqHuT_Ics50sr{h> z-}lh{35n`h@>=cZhDw_NHP5b3lWUKNVDk61qX`_`>qpPvKaTYwDToP|WSsitJG>q4 zYNW58b^X!h>YyPZP3#+4@VhE#NVp+?B0A!R8lNREj{sVoS%^bO{lq)5(Yf)pEnfZ_ zMsCgWa1GO=-4cCe7oV&F);|ZkMeDgBv~6wWr-Capb6C7OV-eR=tgEJM@$kIr-kYWU z0A6OS%DsD|RL)^q=}g1mLfT((v?VN@KVPE;Yes0~i(UuC+cHfE`BCHy_RxDZaUA2N zUy99Zj!IVEG#gBaDt*UvB#-KK?&@bh$qNO*%V2C>MG3q2Sj>&A8Zy*onWhy$+o)B} zIrX^t#|v}{u@pQ)eEJO@_9IVN!2`IYeLBLcQDwPc}i_kv)h|TOQa`yKgF!?wL9QqiMbpi`FMh^0a3{YrdjhshE2$fzuCSJ>}wzAio(N*Q|7Y5&!~jYI24-76j!kUvNT}CMVhjtPH~92 zWxDLw{~5shcfs*Ji53QL?#w5pzLt4v)+4 zFX~2Cd2XZ1=FKXWB5)Swe#rtk6$Cq`9un7n`W-X*Nw!@5^E}?JZ^~! zRnWUsE&xzOe?zRE)I`%WmF^hCNXl)t6JevUU8~5-sd6?xEo6wImtm1it&tW%e=n7!%y` zX%hf{Mn%aL4$|CyZcOHrd*p2~k&^#|5tN1X{8so0h9ybfzh@>Xu?qd@S%_4VE+QbY z7P<1JoqPE_LQ8a4tC!)x(D<)aqt#qHq0q0PX~)sR!TQ83Wup-vMwxpNdB#H3H*sMj zd0|wVgOp+&s>M3Ow?y?%6xUZS%)S<57wQenPfu5h;RU~F8T`Wh)MC<64HfK@c@8-p zK(Bh|&|S@IYR!hVx@1q;0A-+5QGBprvHoR7djD~kSS|hLyFW?StKp^6%u|P4z8L5O zX_N;2+WlT^Ps&6>0Q$Mwt@NGl-|oeALj%vpm*KgjnNB?u^;Es47A^~ z|K<9cceFY$5?V~?{qi~YqW=m0#{L>cJ|Vw%{Q_CXM@6NEeQJSaRMmc92~m0e^on6E zbN{NtRX2?$s8h^H$}?zqOaB#v3K6eJI|kPr1GF-uE4yI$GV7>b8g&Er+(4Am;(YFJ z>a50|o;{m@`hq(FmNGoSx`H=4k=b+m6HfjzTQN$Duc4s2-oExQYXlFbh?5T8%>%^? zyS!I2SiNGDR-4&7X!3en|09@Pi@z!f77>>POV8=@wy}WbHlHe%NZ=4rB(~N zTJn2k4=%F0hM&m|{2fQ2&O`rfEY&v~FhDQr+ z|De{B3PE659)pk0Lm6KlLHFt0dF~WZ&O;G_k6H+uJ~$C8j6? zMv6kv#|REXcL8J!QJgApYZ4_M1{focrg2UG18A{nwh<0&a2AU-LI0C;XahOxZ9UVbS@ zdv{;h;|VNX*UP{R6q+c-qPCE+LHn$Dt;kU1hR_=y3lC6=>7JcCC)J|IpE8&piS^Z& zxT9ncJT*_bp>7Wo#&@*8G9ANZ?oSj69KQV~b_Op;MzCPhQXVut@`>Zu3y}WfwEbpo zCg8lNvWY#=`KF{LUQUlMIBD2P$4^UizuaiCYwx%;(wjsrY@0@=>e6?YOfO;Jw9&TA z^mek0$F##UZR(`Ox3mFXK>|)(CQk5|6x-8Uuyo`1fKFTh;Zmv!TEuY#ovbMLL@`a5 zjZr#(=1LMydVKJ~6Y@vL976F)6Z4MJ4pVV{j`|CkTE1?~M^XLr&@k^;MdFzuWulpn zK*br6OI2XHU-U^q6hDad2^qrE(x7~b3S>J9A$$QVP%E)N0}n z*29eGT-&g2mv18r!#ZqyC|Nb2u(>0}Sji6A{u6=Fl>W}oZ!G_as=R*jzcbA088UGV z!>2(;_}d$V_M(g7#*lII=ICGCV=ZS>lg$JN64R<7-BsV4s716q$gs#7%e~-v%ZAwJ z6U8AoI=f5XqME?WENY;nOf_EnB^ z8zKk)#Y^{LA zVt@b0xU_Ys^b)+b(Ix|{)eP;}=c5j|Wa2m!D7Z;95-=jSb-sgURKktF06FNQUaKe3In69NMH zw`daJ5m4GT>Eb=?0-&w)d&01oWai~w_5@Nc$`x_lpRZ60VqhCU2QZ2-)c<0yqdwNOT9f^Q+4OL=|Hh zUFQ290a?Aiy6DZUYWBSgd)>KXr_ zgI}Ab!cBe$Jn6i~SZoPDJBot(7g@%u^i1Vmc?lb|CBwzGYGz7$I$p8r$?0tagwQgX z?!IKIWMAjjXm>j9Z42JuTUOTh4fJsBcUENVAN&{uht`_!F|h{&q(I?mVCPE=&9W=?v<$`8pvL_fc7g6ltnJD1Cy zEwm?jjNp?BQN?wH!@^1CDT$}ChceA@q-VwH>I9NzhCRRdBj68%(AzT}{xb;++tW#= zUD(KS^@Wq&U{d1YN=X5AOx9+)KaKP{2sp{rGr?aEei4|_&iLQwC}pcVDNSeDrj)yS zsp{8;Xm$tO4>%O<>sHq#%HPQoE(Tnd2v<7kc>L;aAE~bl2?*D!Q1L`TkNG-3YGs8? zx0xiQP=mc1N;Xa7U!N=yGZ8LiWc@6NA{0osDOcLXATgva2Bvz4II}{_a+@oRY*sXv z(ssP@^GVDk=I}I_G0nrc5*Rxju#a8gs?B)Wls(2z*$*H5%IO%>CD5Oo^f1IV1Nx?# z+&s7~{;7TZNmb+9e}TNno~w9oFCQ<#kbJM7p5ia?ncREi!pA!0qBCFk5#9&wwiqK< zW?ySK^C1#N8r~1{X@Ic=QM)v*0>B(}sgfMo*&mQierw>)ngf5@p_bFP^A}B)rl(vJ z7yAzJ88Fn?VXM@(6IJnfO?q6}B?!`R6qraJM}hVM>b>Mp8)~<(S|^wRn~HWrDiYmD zAE&b>SMIMTkK{I7os=CW_T1o6TUCgbIGOZ0O!S#_j&O*twP}cc0Ksf=hV(XD3w9?q zRvGIt^6|6Q&3-?b)gcz@9H^!0V`@a{rt{)ljRA%ov**0FDj3D^_de_i6KTm8$oiJ0 zW&64u)ZXG)x79GW6Hx%U>`*w3axw34vj{%#gih^l72##^$GiDG(J!tksQ$$}soOV> zPwEsl`h>SvgUn5vN7sg_SA&i$LxF&itYDVm;M3DW&CN32e&;bKEyhFtb7w3cEUJ22 ztd5&oH~jh$@97S8vSV)V_9#_1I-cQ|F?jc%qK=WlM-AK`!x5~TMS_{vh zbr|x9{!vwOIUeA#1CHTH93!diRl~|B*i%H!-Jj|5&}YM`u5@faAa}bzzN@=aGLr|? z;4UCjxtQh1unf5*qJFo`7qHd66ik3kkhDVg6%EQQP%Lse`0emie&(F}=zU?)dWE_u zeDs;HxTv3EAH~*RNLWU6R>!Kkr9zZJA$uvIH@0G;1sTH_z*&KQ>v10qE@V32$5(~Q`5=RN+)oZm`>{=Uoe;KKxFMwX}w(zxw%Wura|`CC9jeGlNm5{>1WP> zht+^{sw{y7CrsY>Uai6q3M8f2RKhXt8<+sW#6XH(romUmhines#?7Lqp|F+7!LKMa zazQXS$t_v6w}8)EiFeehgeKXa+QOV4cG&D2+P&m$=_(Bt9z_ z)mpT2UTM(A{T$L8YRqn<(wpQr*c03q?)QH3o>GOvVAZ7?Y&NH5AU8lftA&F{_)7kH z(Wm%MoZmh}mA5Lpir1(T3ba~0qkudmEFcdE3ykE+RzW}hXGD)uQw<1f5qXY?N~LGv zrP6zYN~L4|QuZ{gw4YN(tfqvgQGv05D?3ntQ2{O}$eK8=AH&ptC4d6~!Sh+xv&ex1*$9NA`$!kBjg1ZKeAVIhiJfg(Dok{6fjelTrk6QBcqo+fI&=_)24< z+vU}lT~O+Lp@Nl-llz(^pSRsV$gY=!Vr=X>=N#9#_y~$!Od*_h3S1WqR$Ls%jXc>tKvt zldVDH&;<0L__P76soFnYdZ;p9ddMWB*2)Z+{Nf(+ao*@K~J?povY5@7peGsLA71|p$k=)GCPl5chIr{zMVU_=$A zMP;NcsPzoG*n+eZN=B@>skRfBUTVGBPDo+0+eJ6>wfv4tTfX-h7gpLV~kU|z&m5vfV7-ZH78smO^x+3?6YwWd&M`bs4|tyId2*`{vb zqx9mSapsQR4K-(XPB4$F%8Oq&XMTCdX5wA6fQ)_obEpvgPV{{e#rI;+M_KPnkFY-7 zOCDXF4{ElMicM=DW~T4GVv4C;o8PYh1} z;Tk!0I_0At82C7u!dYI|l-+)HSK-7p*ENUhs|y_}IcL@xQp+1lH=gN_w3e65s|;(& zI|+Yfa+-9`6puNwdC!J(pV(ApbOjuGi^H7i^{4sw-#>pxQ#d&sR9ZY#s`9sFr=tz% zkhp7Gy14!n@+I*(MfE7LAOEl?HFdG|5&Q#Eg2%3jxE6~|oRJ3?qI?y@389eWRL9}1yp9(KY6W+gq+E_ z6`O06;<1lKsRwNUg7$&8$-4r`2dOy2j78PSO^pK=vJ~M}j`NP6l3qC@M{jbOQoTvZ zUOL7>ag1$7r&;SvNffo=oX1WtQ7958WmK)5n=4aj^g3x~$@hT{Y(#I0Ixuf$q?zb| zHx#k2f1FE2T}TTWU`O3t^ug73_?xMIgsTVFJ{MHNJF`n8J9Vn-$fC)W>9f+goU%w6 zmtK}$Ha_c9|C}jc;^h0L&M-}vO&7PhBlVzC+WQ}tK4)b7I`4hs2$e_?YhL6!5?wUe zknTaMr&u{%p`3Ii3bzu^_dql9M(YQ$5ktcYKAbeB^XC`HiSPWzK6;9aZznTa-vNsQ_6XTJ~1`VJ-H*2w9#M|R64~* zXJ%D;T2+=aDMuya%vxPa@sROghJNI-0LnAV7UuW5tHV{R8nUwHoz=KVVRBiLeet9< zi&bisOz$u!1#~)%BBgHK68xht+2S%Orj^exawq21jw`Ou)0>?mRfjGS){%<|s7|q* z_@r&H7T+jafkLPRJu3R7-pVqpahDKJw1m80t%SUnvV{0BCB&sEAxj8C*>t7OmKNx2 zX@Sm`ywhxHfzBpw4{T;?H6^KTK|hW-ERJd5)(U&{GekRbM09#8kNadM^?D*|R?tC8 z?u|O8=}FnWQL!*N1`(Z}QD^!iJxiGB!-ot*HbNZPBK}5&DbY$k!9MxA1sxa7Ps>|! z+2UC{A_}XQcs{B-CvB~+1V0D-o{9bmk=j%zb8|M%m^Wib-;(u@oHMy*5~pGBOdqHL z4`<1iNcGuW;PFh#1?jeebgu)CKa2{{XQFh+Wsk2MziK>hAwHtTM?Su2@n?{Cs%8-B z(vM|}zCU;xKkTax-yY`32Z;9(AF@D@93(;VgT%N-q}2Hrh`jy&jAyqCmkQhg0ly+( zK}gJgJ2cJlS(|>fp3|#7OPnDc!3}>tl)9SlgsDR$el}YifPj$kZ1gm-j!^d7;CJdB zpGA@0sOJp4K2h~qG?98j;wQ&Qxz?el+&?*kAf7s2918`1U8-{+mQ=gCKGHcgTdUB> zc@AvX_<3t0{~v4b0T{C~!cQw{cV=ha z%zW*A-}~C3Pake-nR|TuzK6EPKSf@DZR_SXA3+dd@4$8I6God+rnTxcdRDEnTJ&u< zEZlJPOSg1)9r?(F{??O;!JV)bHWplbowyUshAr6LXeG$RK?M^jmUc;xw-@zyyQJXT zCBn7Cit1Gr!G*=|WOXnjFR0Ad_u4}Fs+?z#%b^Ld2I@bt3#r#c9Wn*OOtO5vGB1E5 zt3r7}Iu=c3HJQtN0jUD%J=ss zn(|$_+QC4M8$4QW)F40=ZJP@zq%Wpkt`VJeFv#G%INA&v&L+U|`dxVejM&wb7m8!j zN0(bW2&7jtdKl)NLE0?o0aq}Rm?j_~ppn!ak?Ww~;AND8QKYJ>&21wI{!8Li@THZA zsn~Gml&vupHET&+#(Qk=yJ&x|FTCyE4Ux~Api$M@-W~2d(bYE5xSCN#eVrr$@~pLE z4OhhG)~P$!MJbs~rj#qy%D1w>5WeNd=<6{Z_Bi%Ogzu9l4?Pa?eD=haE&Y?*;ip6T zLz$QgDhG;wPyZqCI)N<^j;y=x&YMp>o_j3+zMk3bC-QgZt{L1rIGO7n%&3$xs!9vd z)HFncxARrNl3t{U8qu?yk~Bu7Af(ZMF_1DklWu|*)`0Df&xNE?{NYNwQF{RB&Vro0X5Euap3d4y}t1Pl)nkJ z36h_CtxxCEVd+#tp5NFzo*T|*di;k*FPPABt1>3qu)ePoLBR}oSF5SG15yQya(;N1Z5t065 z3-76=OJ;`Xa4THx1ZbrrT6Ukc-znhID>D0XnQS^;%(}-?cg;VgKL#e_YFs9 zPv-8+-`ulf!)*SB+`hr7!J(YlmL3caRsqzUxApTqy?MGQyrCQ5N}~I6!Rc*ZS4q{5o4dlSOQ4gdhV|`WSXl^Lq((9?r*RyneE;MLG%>Uv=E?=aPmur6Z+KVs0 z04c&Wnrj)#3*h+r%Dlj4i)TPCf6;a^RFoj*tuvw`z zhn=plNuj$67JBz~nJNQzB|{Ma6}&Cz=x!opHY@dQM+lA(ayWukg~A$qqxx#_6lYJl zLaE{`yvHGv%Yb~gTSSP`uOWz@z)mAR9T|yV2jMthIaMhDwd&A0WhHo}-B8q?*c?am zUT16ix*SW>ok#QAdpGAM@_jvVPdeY3OAQu*U7GiRV7*ubd2to)1;m%4$j$n}P+2h6 z_M>?Lj@CDk7vOlE>AX-HaoJ1=PPAQo+c>!jdZ<P2n%H{msos#}nWrg^J@iot={@l=^sIAKCJbc(U-I#FHPy zzK(eE)?24Pum$qpejmWqA%LqgoukuYe|g)e!4?I9kJxgW4itwnB@m7FG#CnhvOc9Y3 zNEsjn*6g)8<1Y3caJMu;uB3?Xtd8Y32XjS2VRbAd6h_7XN~t49-Z86-x)%L1(2);` z6+7m;x{__Vui$^j)?!8?gfUnEXj{qsN!bD+oa2+=wbs8tjAb3x>4~+C`5nEvwfX7X zn!&bQ#UK+?_Qml|#^;*r#Wn{9WF)x5&rq||$%LlS7jZ|E1TCFHf z$*RTwA>ElAg=m6)4U5le@tL4s<4gFgS}E5f?+MEk?kFOYkjqq6bycRf)}ZUck_JuB z!M$&OZxw%rVpYe%u0MEb8U>TIgZ}q-a!XwSW{4 zsa31H*xuEu#WGm{2x+B$zAB}P6h=M)WX1@#2gwY#+ux&vbIgd<52qDFI+Yyg(dRS0 zesMv=nxl(~T}g+2u_OVE13ejiUI0fI7ckKAmXe{o%tn54e2J0* zL}~jAz?;{KRco?}@$ssp+pR)yJG(WRY&n3|C9d641p(>o$+jE@fZWx)CATR**i+?i z$@k>y2g@M3#C#>Nii;8exV)q#dk**P0sw}i3~tH`aGai&yihihWjU9<6M(;azM_9o zWFAsv9^*gAJOE*lGNab||ByRYSws|9D*ixy9{Cs^MEY>HA1*_vcl!NU?arO*o{1C& zC9R25uYnqmam!FPm&!FYnc{gzZ$GBan{o_t7}kjDa3&+pmH>|zAR2YW1k6)g&;T}} zG=d|Z7vLBsbzVTDSR@3B!^Duh-QW{seQ7OHL7cKvOT z#VRxhG&b-G--K1i!q?}7+>s;IyYlOL*W_~fhMwE(+Hk%)=N&W*-UY1}Suv=sX30d& zh$}~BQ301P9R;M3*X_y+aO?&!(V@|+!+Aj*Uv?L=Y-FX#x0)rBwV2gNy+aFiH5|V) z)HAu|V7vjX z<9?0k!vN@mp*EEx^y<7iwkok~n4Y?8LsYAkc7qep?(J8mAy}iJ4%oN%kl)1Gur=5g z+=L{wQ5WxpaRR+^HTdV@^!Q+JDzmWoH|SW+ND%_y{g>z9R~gwb_?XqOI(%^0PO(*F zN+yH;Yz}#0pUrB(hj>b6x64v-3VLp{wa|4t0WUG(;lODV6~U|uya(AT8QIwXWA*rN zjmE8wfsyKNi$Rw~YSI z6SXLAzh+=(o1HxBcLz2k*IYMV=``sQE`Neh65iIy=C;{&)xqp!t+%Z)Wwj1gwr&jt zr#gmiSQ}T!y@l5{@AfqIMJ9K-8*-PXn=*vl8jnVd?VZl5HWXI^=;JZ+-?3Jp`P_xP z?=`LwC`~Y}7VCjg3Yv%$8*A*VX&Z4-{&v^~Hr@|xUGl7d(DEuRqD}M|BHQ`p3rI$w z=pjwnnQ?gPyb$mA!;`ZL!9Pe_UKMBwDWd;Rw2y8*NO z>(0TQ(R6?vy6wqrN1nc|mk%~a4=BWh9Yx`JOt}6BYbUDOMeJRUr4y`FMYzr{vH9 z98{`HD+VT~#gf9-IP&8tgwo-nGOBwEcg@NLee&^TE9xh@#5qwfD@G#s-q*MB>h6^C z@Z+L~guw1td>tR9lb8|nVxJZ(3j2rshy0{TilARsT}zMNf4QOxmsoY{8Db7|V8$zz zbCtku1fV>pbi=7 zvP+j;5fCd$0nCPUk3=>vfVcIoHUK9i4Ult61*F0D zHkZGvZ_7A@+T>88FTGM4yi@~>BGiIoNg%xVGAEWkQI!T5f+L(0;1K@wszTwpnpkn5 zw~`B&rL8qA0iz5jblGR}y|sHjwx@b}xY{fu2#QuRifH$auFU3Em#@30KQwu5ud6tt z8)6+vd%CqNTvP!seG}lZBG%koL3F|Ya7z>#yn$!61}$#~Lc@%N#hyl zmBIEakjR4&bul$29amOrN~HZ#%_)ddrPYenBp@Fo06xw{+hWkbUY*t9L)8n5-$CfAmcj|EAwJdU z9fcECKSP8uAEuVDdga>oVA8Oe;&BWjS)4pfJ{2A5bM%y!ywEb&1u$JCITR;X^UI>_ zg9X^ikG4pMzwM$KQjzZyOG`|*uar*sTDcT=tw}ur7loFlj@1`(in0?x)QF9i z>e3%Vb?H|xySBs=NXGUQW$aQN`kr?uXqWC)yes-UK+hV%T?o&19jwQWdZvU><-jm1 z8#p_L_gvl|L#(b^)<@%&lAhplnPBZ>SB+T78`bni<-C!)09UZikHDIhBW;(rDG`Ug ztewd-_}_rS!r{#6f&KuB@^0^M>xnn^#Rsir)KXqbIW5)01(u;ypAKprsOz@<)BsdG z=7oX&b~Kt+SUy~loTO?HS5rln4Fw!@PmDglU-F@d~~2Uu;H3M_mb}7Pp{BjF5j~>pI*Ce*p_UMRCiVAfl@PA z)c*k1Yp?}`bymbW{3oe`D=~Y84k<8c&86bFqDF`sRFw6m!2fn$QVNllr;PVkSOa}U zbU~|XsapZJ3`6!)qGG5L%FYp86mN--<>0@vYFGmFBSUYY8ZHAS0OD4t8NxiYp93hu zsw2-MI65*>Jfg#+Jghq!QsW^x9+Ke|sAT0T^}&C+YJG5M+_;iTTv=9l+_Sv!_|t?E z)+0X8Vnee4oz?{$Kh5_07jQy~nuWP(5?GU^a^h3PAF=ESJ}02T69xa?CzYm}XGbK+IGbO$Ct8{)4<=|2a2xx{F#Ux3TE{WLO*Yu@-(B;sxAk(qT7RLfD7C5I6-~SAE83#Q!P}oa)_u#47Co@-3LhSy zXxVWB+0Q4D{S2XdUX<(rylzztvT01IE+&{FaU6p=85LMcB*e0=ZLdgO+lt-Xie1~3 zS*0=9r)rJ4DJ}uwW9x5(IT_p#R9{xl$tb2|6wk9IQ0%R(pKC-Z8R*<)DH%(pAKt!= zt$>{FHpogL(ly)f-xBHR?yZ1*1`Vs3)P?yXWbup9w4W{JW-Pa&|12hFh#{{fE1LK; z%EuPtPG{@z5G#@GQhOwcd|8RESxCORvZBq9jxigc>R?t8>kqL;PoHrRlcqAH`oxy( zm(jv`LE3yMtlZS{f8RF9fqmawZ&VbQcRoCQSDGh_|O=+jb8*r*A5+}Er zT)aY|kQ)+%4VRv}Tpr$5-xX#_xl*an!g^ezi+SP&0FyqP6ZOXAKxSZg;HH5m2k5f0 z?0=EUu_Hojhv~ce73JDdnRfiAS+`i59aUwAWGj_shbb0NGTNWU|AN|sD4`0e&Z?v$ zwIMKGM*XCkP$z!YpnR1d;kWX$JSmo7{|T&<-f#M?C=g1;*QL_yQ?TH5S?TpMYdafk zNc>FTm9GjI&+#6f)RI#9^`D^H>;1Ipw?$D=D!dMJTi#9Wb>fB8^sQ^EHgs2+loYJ3 z9?Pt6tmvw-hqEK=Mzi7Q*zvJIt|@AiktB+T@YVMvE3#2zBs;clJR8Qf-2$Kzv(*rA z>w%JQ_t3?Ru8gx9_BeZo!6*=iK>Y zJ&l|9^$ff^HZrz#Y<7%Hj3vf4q@EA$>)-I(o}oL~yft?Zw0acctW}==$H4{HG;+4R zctIzwwCcnVf9~h7{FPW-qxN|2m^&|s7aAJ?m>J{7JYxVe=vw<5lrnmNR;V<$wABLCMta2=dmrjFTuAG}9eo7)vhHacFc|3gVIz09M-h195=*0@j4x zgXCuv<&--&uP2QZVUUC`bFG9hYk}?4=UO=h& zVCcL6jx}e^n!I4n$*Rj;KrtJ4F|(|8?`1BYD`1T{Am=>Mgt=!&)_J3dv-cEDuHQh9 zH-L6SuQ}i_$Y}+=+}$F=`YMhR1S9GV`Z{a}b`t4GW9{uVJ5uoBt!o^i8mz_#UYdzD zJ95+0Oe(Y{Kap#I-b-a}sB+MeGv%3HN$G)pH0a&}khvgv&n`+C4#;iBN<&Pn$qN%X zaTJXp4#Sx80@GX6fS|h!js#`eaz~dm9bdtBef2cjB9O@@f9^n^uM_5?Avb5N3VE@f z7k!)mUYxE9u`;k;83*L~rBpTKw$iDtkl0r4iCod7cGFx>DZbH6sN4|&^W*gtBbA0*5ulA&CQ-%RgTC_Xk+=hoDMQ- zaAAT{$m$;xn#7dl|q9QpUO>tAiZ>YH`61Ws2*xzp3vndG083k`POl)gR?=D zg+jN6Mmy?4CR3=cW0c1BOdmgZ{NNsC{_fseaz}HWVcT?m53B@2ot_wiVZ>)!hDv#_ zBK~SbuMof-lt|+IUgpv-V$y~NzFV0WN<;6N&I@~T6TJwP6GJU<{BweI0kQ5wOmyjI zr1H{lCv$dn)_L0uRfhhO_g}V^q7{tHi2U$wwv>CT^NODR$}()qcyD+W>X38Zx1KoWD<8M?URt8%Ba~ zU(G)4zNx8wTGGA-MqzbS!*$NnLHjtIcg#D6a)WKT>Rc@5X{>4_8iz4^KA5AR2rx>j zq9gz^;#?0UC!!%lJgA%O4m6ZYSQ-m!^Z=8P1Q0>+{yxFiEgQ9bV* z`)@-a<2%by%)753ahFg`bUMu_f(zFAPL`3)l29QNSBTQN8WOK8(aXbp03J`mIuGQ( zmR1binOa;GhE`b^T4iC_aVLxx6T%!?#Kr%9PPA{`k|yVtG&%78H)IjR4`)!LdC5d} zOLm_dWt-{aePI=C?F%g6^ir{h@>ZWEGfiAsP)H|e188Aksl>yIO4_9g4=Y@A^-G>P z@-dmtX*4@|X6RwGG+1=EnUlGyw&UG0gBv>A6r~lzYuBx5*?rG8!dLR6{qOLW&fvs4 z;@FZ`6Ll;ij{_)H;u@)H_~PHPX1KuaM*Vt%Zrmk)aN#Bi8b;~eu(a%s-gTuOaf^S< zHoyjRJRailFo#EI+!p~mT77uHhkN12j291haSz(-!2=#V%;ML0aW5=Spx});uLs!6 zUf2go0hDYntSbSxAilhCd^K#+8tL<@Y<;T1rJgU~2a8RimBpC&i+baT*nu5`V)nC` z7w2enAr-h#X$-M0U<|OEB%EcXMw?|TJ;e%$E`mIc6C_c%h-yW;B33O`c!8o}$49f% zuUAk7ihP4m>b-Wei!kgoGOC`>EjQ9{I1p&bKtP+qv=K&*dth5`xqeeO`+|9Q4q2nOfGu$wDh`WiS zxU9~U<5GRWzNY&s@k;nzC0yCy^rqbI%4;i$Zm`!pi1f$rLzqup$Yd@8n2VTMYFH(< ztP+0^O0v%OK9+NH@KTgoyiOKfXrvM+(M5FNBB9FqN`e5SN{N>N82dgfloQ(muLShZ z=_zrQjwzw8SjSQ<`nd`g%RbV#Q*`04q{bX^xht${^2-GAB&o4QUG6a0D*PSDHlUw6 zd_eL15kY)|Q0M^9xpi{l2L%2Sq0oD67AM5C%)l<;nRvfKap}ks)>(s0p#n&kX#mm{ z3V?JN90$AcT8dkQTnQ*33OI8BP(TuULZpCd00kaapn;Mt0cBcq0=EEOI0vgMT5z)@ zy-dYjCR_nIr2_iy;5jWA-ss2cRk+Fn-6IgsDphq=v=6q7>f=i;5V6BpveaD+GLFbQ zu#0i|;mb;g77JgKs}>F|D;wG=*N5FMzfnc~@CTI2=yN!OJg&ekg}=&iec0pl81ft_kq2DUH_ z;O0rQT9@0Es#%lk9lZj$4pB(SnDx^;#mVz-@4uuE~a58zES&xVz7))b}X| zs9|hCa^u0?V=+;jK(PW#>y;lQIp-iKyrc+;20d)*9I7pq*VT(@Xa*UPx{j%?v3Yoc zIicXl!dK;7z~%B86f};Le`9!`#}VL}!dZ@|)dnq|rgTbjv(ciZNja;zlptQxt7teU zLP;@+VZ;x}^H@x*ZT=;U15av#z2ict-)9mWQ>*Aw5Q-qbfD>n|IW~;kG6SU|qf-~B zV2^71>7W%Ja#jGx&|%RHGw=>8jJgQo2aH@Rzx0yP4k;dgf8i!h54$-Nl!{l&;J(5! z{8MsZ5A?vIq7JW5Ycg3mVxKn%3pO)a6YtSl%r@@Q!!pi}5m*=Tbs|gKu{hR*y$|VZ zGGo&MzJ4Bqk=6_NWY) z=v~kgd`JK%Cye(CSb|IZF+r+HaDK%8kPw+uHasYxF(f~LRQ+?Q_l@t0l|Ppj*UAfj z5?Q;;YYR>_RSwjua*a;gyrZ>iDs8)SEYcj()l^ny0>po-)hbO@ zFlwsIR3y6NCcnMHq0t$6ze8_uS)BDl$(z+Ck0~4ugaNDs0IQEOdMt!BV4D%Fl4Gn~y}uyJ(FWGcI{(e?q2yCx9qNk)33 z{u(z&{uP zu_|m#>Z}!908h*+jgL5eA7baoM=K+b$&QL0=~10_v5i*Nn5jP!NZ)+9C)f57#_&6 zIO)dLKnyQuCie{DcdP?*gcZmlq>She2fuxix``hkaf=GIh1 zdZz37o&j^D)&*sHfcO^vG~>YPvGr&jTBpObrUiT=%U6Va@`tMq`W`VoQgO&}M0*IW zU*yHak=JT2hzSRVD*3}g)xiqiBSM7<{E0`Rg@|&OdTDLcv|1ij{ZcLg{xm@`Boi}3 zYwws^t5IFcXzd0gK=v9HkWXvO)%`W*YNLWC=>OE}l!QiYuW&Y698OCi15i&v{NrD< zI31SyhOs)ETp`yOFcPc4|4QrxJllc|Vwp!Jpa;EJ}s4eeetKTvZq+;^JP>qJX@WnP72@x#?g}kX5_#n z)au;*0=mjC(N*fR_Y3ekfTTRQhAg{~1sM`j1vzl3828*%EM2O_bM+Yd`pZJ-!Jq8% z5PF7@wuqe?#eh!hZChXGZqz9?AQs5 z+|*!?+BHqJj+kAOs7v1Ew+wW}n*1#F6RSxdvm|mgHjP?o=5!W*n22AMsI@WIn~WD8DsGq0KNXQc+jtsCsu{qi z1pNkz#LkM;Yr=mF9u5PK2#br@=B?Z;daj=@b@+h+(zbJgHH*Fik7IiQ(uMxAdv7R< z{QNV`+Kk0JHriNPanrI;zItG-3vpzwKPeIcs>7z6Q!qbe|W*8x2)1K+RYPWu3FM;ZcD`bS>TPlJmG; z^ext}e&aZ%i|6W12@|+Km7GzqMm`vjv35Ot7_~2%^!gJ?FY$cUntB%_ld1Kb!%Wg- zJWbSI_B0|j%>Zhu#U|miw5zac{JpTd834EmJlI*FB`Wa+*y9XFV$M1a@I|_k$V%*T zhT^Nsk0^`PEU7l+D&*9#6ssxIn@q%vOy@9}9K3@5-b$L9r<6Jy3a3$MpZJzaUPfH; z!hfzpSiT=IN`{0_EH~($D!i&=#V5x82Rw0Eg!_hhC3gTlRWZW-fcONfQqljcysxGE zSh}{vspKnQ-tEB-B2KOMgUR-EqJ@Wq;=p>q%xh3;Pqoi^PNnBs>Z3KY(Ie(E=t^;p z$(PgM7XsMa4*0fxF6}ubEI(mIB;!@Mc;z;vC^3xARLbpr1w0s{rrJ7BXM|yGdZV3{ z)ztYqN^EZR`^`1e)qU$M_Ea)yXG$b7%t18es)+kZpaR9AK zsYh0TUy^HD%%OcMJQpx~W{Ut4BMYHaL!i-ywND9UN0h}8UIiLUPY)&9afnboc+~nv ze{ZA+1gqa`t=XDt9;;p^&HCUYoxJRk(8B;p)(v#7Pk^V<1FcKy&1%5!f&I#WmZ?x$ zA7PwEPqZ?$u7r!rZJo?? ztF5vkVlEOOtu=8zTWY3d$=1omBR!Eo3felobHg!(-f1XYqG1;+2Ix_F$esX2)m6#i z{m9md)qXjifVK{>3c&NtLWx~O*Cf;im%>%Di1?*mE9wod@;rPt zjD==_+NQh^p7XIr*R1i#QoP!07sQI~ny~VMu=M@gh*A^TO>B*ge-{{cv|I(IFBWK1 zrgF(*sR;S?TCYh4tdZ~W7OjkCXq6@6EPQ4;zxBE!W;rEiw6NDt2k~`051t|;*7E%l zmd4kf^;CK))z$@kUDk=IEAIbg^&hK=>iP$)X*xKky#HDLJ3PUg9-xnwcO08q-f}D( ztgg6U5SvE_>mLx%xxDgz6d(qqB~P0kkSJU%a*P^}O|2deR$o_J+N73Qy#ONlKxVSe z)0}Xt8IqP!N@t`#7;md+>&rwv>CqZjDr{5H;2WAT1(NO>V0!dtD#&YN9dV0_Wz}Y* zMz5wh9qS7_yk>JGTNiGLnG|Y`5`4p}X$_}|+FX8%DTq2}`vJV3q(6bxh&Is~%c?a0CY65L$ks!va=J;CcIxkMrX~l zo~KGCeyKfy*#1g7K<#;|%(yS9Gs|uJGAEO1nU9IM(dyTkHFVX^RP$)Hi2?eu!OAfW zX>TrCoN7wOd<~j9@IgjoUZ(KP-o9iU7mC~9ncT#;fpurV!cyNdofjy+chBp+axc&< zHfB{akJqcQ&1#Ndv*HwqTaz{mwAxF3%Szvi6QooE2q<60RedrPTE3`HxD9qzPEt>k zN`ueg@EeunGc>K>90rp^$B+*Y*b$hy);K3R5a+3vzD+XiMt=43pRqQM>Tr^Oyw-fZ1A+uz(k4R;d^8 z_syGBNtJQ|KM!m}k6#s?^{Z&-EMHQh5E#E+MkFPh9clFC$Co)LaFaBFhh?H~qP9UF z4oP4$ODergMvTxn=doE_dO303dq@S)>}?*7`NAg|ob}kOPF_wPJwnP^yV2%m3FhO( zs|vM@A^svs~p|EURU65_p*RAm9qSQtF%bN z-NNxo_LaY*HlT9Wpplu37A4DaDtypp*Me=G*{XLK3iGta0Ch-=Jdd)dRhSx!6#IJ5 z%`*xT)?fblMbWgHSCCm$PuceKi%Tp1qG5}V7L$|I5y?M2k1MNk9{o~ zd&i2gcU)oYfy#7aMJ(MIE1ac+4Y6oLBN+PvM&QcDzu-Tmr-7;)#eygTlMdR4I9PV= zXRs{kIXaj{+i+pwXD^g1aAc^IQo3A4$G;4$SfkOQlkvFR=y%xtM!8mDjkw)Wi$Y(n#@#N``lZ_KVz*<)UB+^SMp;}Ej>#XSBbwFTW_qsZ+hVh85I zj70jJimL$kyB7mD%Uvj166fH~tR42)w88z$jPTkk-Sk5;z=;^Ty-cAn z1)PqMS)nk89L|7Af!D!qBqaDpEUGyrO{-Y-n;vJ_qEcDHPG`ibR9Yi|rYj0R$B$sY z#O#<8%~dM11LIzVH8akrvfwk2*0zh13rr>xWp9JNbSp=IPRHLvYxGte9V$z} zW(}BCA9U9y;?@@+`#>izuD{vtftI)jYVn0%;O{3N0ybAtgwv^j;Td8WX!RIz{H)R) ztD;#fc@f+Of)lKbc^2*jqS2DH!TqaPTm0%b_QwcFz>G8$kd;HQ6dW3Jwl`;wmIKK1<;2EA-{Hyc~VXQ{%`)XJqj-OY$ z{MJF51)Ov-a}k9@K{UgCSr)Mq*nNe&Uxwq$?tA6-<@X!$iaP*F+SF=W9ANhmaF+)G zc2!tZyhmnX@!4}~d$R_BDuVMV1^yHzze1FR|mnWLrxD{vGH|Cc42Nl!F!I zG5iR99iSPzL^Hi$EQw@#i{s$$kYebNJC%%EUXZC#Tz~@C-(>UX7)IxTQEe6E_rNv3 zPcY;rYzo{1Uib~Eq`v}q&5WLmqcIdb4L?{=n4wv^w3K8l`wXQqIE_}Xj$()@N~3of ztsWgkzoud3luV=7Fvm5l0$kXD`fs@xYl$<|_us+z&yp%IzQw~+B>qP*WjMgKc#{4c zYzoUjy?z+AhXoP@j^B;X6A7Xf1GBx@$4REjQy6sKKtRq@s=NR@FP6M9B1Vv#IiceV z(>m~j|C3w;tjE8HUG7lG#qc%&r*5JPjC+xgk%xg6eIJGcshOt;;zn?#kl006ruq`@ zz?Lp{ic&4$j#F2<9!2Q&Z)Ws5ou2%ff&~_OeaP<*1^o)%zPPyf7h)2O{tCd$QA_|= z`+MO*3R|>b8mtn@XiTR39R(BV#cO3%n37WxW>T4@h7qL{!;Z?XX`(QWf3ua>>3H(r zIKJ?b-{bQ8d}vkuj>4z$|DoTD`9-eF8c7%sLc#!5dXuLsV$pmTf0|4b($=*LQ#Tv$?sS{^)zVDTW~#CDIaZ0C)HsaED&3Q=9>HV$_&U%BO(u zXW^adV6#LRu!7l?;vL6oq+5nNq+5nuRE#UB*VWY$CH>8$!++yw9IYqSdYjJX)Zp~y z>FH^T;2dV7gO?M#j}g|npZ)N=yJ$H>&?;X2@A#*G@Dl#%=M|h1+$}?0EDVGDU0?VL z(M8{k4U7F{vzkoC`AxlEUi*_!|4-zAN|It5^j73y(`Pbz=QjoLeW>;)LP*~K6G0B? zCMmW*Z!HD*N=6q93n;?5zP_&L*Qt?`c4WvAXFwg%jc6eSenoUq3N@p%>pR!i=y-oa z7^<64CiM5|Q|mhPRvpkSDN3P{M=d_1ii>vD)^QnW&&;BESj^)-43OQ^>X4V+0U!>QEB_8fu+LCQ4}G;~z}8vRFi)+e2y}Uh`oJd( zpLz0B;a~n)$t!7ScdY&VlV>(h%|G=oYiU3(v=Uauy8+zY)9CJML~eBB?>TK`v1bS! zro(8k!P=DQ_Q1_?;{AagmgHM7pNqtwHdl635-Olc*jyT%>hH@9QY7m%1KU$hRCFXP z_{*EmJo$NWGl2cTJwAc2KlLO&@kxbNNs|<~-G6y%9!Tsv7AYXnehVb%jo1{}z5#6i z25sMjw%0G(0e}7sY~PBukAdx-X!|xa6Ml?%jNCxq4RomnM4?(rqWWh}=iRelJ1 zU`r$GW5pL1^bN8S85zTb!+H~(`5W{yCKL{Z8XCgzsq4*VG6Z!28QD;80epMo$7CdKV>q);XJHw$(g1J3puh`vE!$TWT6stCQ=xkKJ`T($6oxJS zo_5py*jj84b^?13CLk;;`;OGQuCs2Gu?Jyor8Ps*D4T|DJ-dc>{2#Wb7!iWfztOx~ zI(`j2;kh zdZTayD!EY%4I_)m;RzBPfD5kd?!HJm$W=@|uxH|yb+ORe+opUY8#YxMJQlT#b6ZVr zgF^4EcEvlBZlzME0(_+Q*bG(Kb?J(!y+=ATb6W@NoOqaZ$K8F~TkOU}Pjy{i(sb0{ zwW~9_rZ;P^-Mw`(SkoER6<)^IHEf^SP+31Q*zIqd+mH(NY;SGews})cbaLZ{h`oDg zBpOhHX@!un8f&AldpZ)Ra;XWq#cFl2O1akGlJGS}&8BGE@HUdLH@5b~qTShSz*!fy z*yAmiBDL!?e%={1$7i<9Bs`f+mb^p4AGJu`f(>9>usQ5-vCc=wo&z+cY;7I2Iuca< z;8%zSOo|DS# zr+fESFW_~jTK9_CST90+1N=c>HcGa_I z`U9?>!|OUewAmG)d8ftfHpuJa<1>1o!Z0{NsRL$xv~{v8v}NDn#+e7V)!=?;yLWA< z*0H{HMYOHLc-Y-M**tiAs&>n|;b6SkqbYnJkHyD^2SdJ&)&^^bFjNs}pQwus4-Q59 z?&t~cZSVu-oF?R2wQKx+nbvAtVX^3~oI;^exEhk4+MuC&-BIEejX&P#^EOt+O}3=Z zV2adVI$xQqchy89Ljyw*drfsU@l6TmvIS-lVEcCLVeAp?H8BH!*UiT_P;2+D9k`Y~ zvOpxy&pbdY+o*vLK10N?y+9tt&fKwa2C(ECSv5Pe_YRi5WA6+#V1EXG1&d>~xIAky z9He(WKps5aro5Tj5C*S}_x|bNBcs>;E3UvcV(qvZhzY2ZKth1)P7rzKG$#f(h?!l0 z8qyL?z>j>9Fish27r-T)g5h9x-aLFDS20+Lma0KEi=b6 zmAeidYi`(-32gep>mR@2>mQ!$^Be6Zjlp6uFe<&@YpvdT-~acg`@f1;y*L-?-_<(t zc-9`a>*df>g#(4s8LM-Se)s6USFi0nzISblx1wh{mFV4NNyl+Q$g-MpW@x@Q{U9+KH3EkJg ztWc+CZe8b&^2?D4XmfiJE7H5GNr6gyJ0-qGqqc&+3?Y8duu0;-geJT zv*AMvclPsoUdEbvt&UYI4F>JR6TkjI?Ol(4{6lx`Y#P4rKc3BYMcc>LkGlIucz-%f zjzNkjTw?C0{n#|N4cm_W2hw@A_4Z6}#TM`rSxwJOu5azut>Y~|A8f?A^o)2*8osoWW0v_zFHR@w z2dhlkJHB)OUC-Y?)nGEG#&39HfA_J;G{iHoYZ$I=<~^NXDg6D3K4;IhXW#hr6F7cq zI=bopeg23^PGt&rW=Mwj+FV`@LE~XkV~KhKF`Jq^LEMK&-uO3M-L~y`+im~(&`9Ue zM?Zgleg8ez&U6PkJtxyzc#Tf0Q5p2wZD0K32X_7F+h^|?p8R6r(q|^V_}&eaOr!k7 zXBj0!F={)q(EU?bJPVzUw{LK_>c_Y1LP%tq(b7S8x1azuv z(=UV-=UU26j-hj5b@rm(>?g%&V)&`JFz79PDkXF3i;if0G1AE^eS(e<6Ad=O6Dc&Z z+agCV82!rUa25x)?v25ttdJ|Ex$8*J*(HVcSms>t z(PRo=DgW%=TA0TNp`GCbIQU;Ggbf2m`T@kjIos$+JC(IB;NLnQ3?-5cRIqUY|MvN; zhNcFo0WI8bv5t**P?k>cIU65H1+$g`g<`;x4W<~ZqG#t|L;J5rlGI3o9{rUqq_K^F zm#2BBXODi*l~9N$i`m`D;{0F!4`CP%JktIv0gY@M{gtp{=&N9uDIyqrC@%aqcuSv3 zSS@~N5F;pMGH+3k%ZljzUmbhWcL&7S!)~16A!>CD?kfBSY;jI;%Y7%S)3J~E?uCba z*yT-{9RT5O-0CFUNwbrqaL4Ve?$U>SxXnxa+~+9#(c$%ZUoYbD^`%cQ{a0=pR&cr%?A!1r&rz#CQ9a{QSaZ#{oa1AM<_;hKiifx+v>hmH(K0)y9%4;>wj z5c&h(_|V3&2fuMlfbS1{rlze<4V5_+hhwZ9FhEB65S zwqZxbbs7_~_gpFnURZj8xP4yb@uUH_q_c`f-b6Bq%^c8^n@%xPD47e!wDZX7S@O2d zgEJE76qQgshk+-Z7Qk63xeLap^T@W5GQ6Zh?!hHPMM4i#vUp^0O`N=kRu%qav~?Ysc$KJ@vr0Orv+IBk=&~3+ zR=whtmaQY*-f%Wy^MpM>f|;}?PQwL!mhj-Ap4x4Duj%=!LhR}~S}2g$1NdyjJ}AN` zMf7DgBkLj~9g&fdNC&BPE)aXqV_JQyzSRO`i6yHXSeIDz`RIYomId5;ik=ZmY$fw) zPAu$%!l%SkeO(&C>>N6K0G+N8*7*{P0vdpZBLLE!k?LtBV^T$}E7e?v&|At4Tbh+G zho{j+lGisM{@kJNBO4mkGMa==ZB^~qq3(|DUB1fk>j!U8vkHoqv#QySy?tR@-AG;Y zw*DG03(F{ik{g@X9ms6Fdt=Zduoi8b+BL(p$dtUcD#x_7KmP0%%C2Ladn7L`;DklPhl zLW(y`c)10FnGaJG7GEIf^QIW*-ITD07jW}gZc4e8n!=>^G_cG%AV=r|gj{uAJdlG& zo)e@)EmHp(sl+;vo26ukx)L=OtK{;~A?L@vRE=KuZ8=PX_v&Sr7F0S70~@2^f1?fF zxZ7Xt(tevY74{H?IR5=!U+^WFT29k)wd^H0MH<`=2S>ImpestwD&BmbpA5cP5G#yf zHIU8P(?UUEahS;Z?QHIVzd-}8mt>0P6B1|EG0lmZGb`mayRz(~1g%)ovaOj`*rq1sFPfU-0?ql!W-J;Oyc&ANgtb#j8hlidp+g@AZmdg+j3M@%VHh*NK=hx% z%rw7%x16zURBc6Ff20I8NGGRh8~kowKwqL}KFf*_AhlfN1d$BL8%bKh6sj4m#c%h9 zIGn+Md+8zQmo(^zKWL3AhI~oqwAr+8T!dmn1{0m=QIsSL5{71RCYi>f4wdPhE<`g(mWvUbHJOY(cIhd;G%`^V>6qeBOJ zTBfqz>Yb17+V;VzgtvXVxp#IT^5Y}>_8+mQH?;0N81r}U?#^t@xbM2-raSS$b+>Jd zM@O$4Zr!zhz~}BB*<9ZV49?`}fwuZBYjbXY|GF*2%-Wf4>%yI_X;gT;9NLc@cCr*kO3;;RAW3PE0+pV z&M~5YU$y`y6d4o=fc`5t%PffgWiu=3pIRvr8kQFxT@hPPE*PrEkAH49I?`3GR|3OG zu86da*Uh|dW1O(H53a8|aB^d~R`}GB>mT11dD7Q8lWm`Faafx+bqu~A|MvLjKmNX5 zElN(WciLeF1+c*eZv50{)@jl-?Rwwn`p2&A+4xWYee~uhg=E$6&f4ag&LE2S$pK3G z#!8*A8|j4INGCLlI-z-0ozPs=3C-_FCnUd7Eqvj|TRyuZT6N$HH{Sf&ozbT(t$RoN z_q01LE$H1v=mbe8Jn$UU3BP&c#3P3?P5U04klq2uei5+3$Ehfo*G5H-jS{vj%e#0L zcwrX3&c7)NIMYznuzm*A!(y>I_z36qx-2+^fyXQS)ee=g|c1ri)s0gpT@ zfJ2$OWvXL&7yIRUW2j8cp;oAkkI_IU>SsAHh)wrd9V>LIky>$@E*U^o6q84a9D^ z0Kj0Ps4Z3#{aMYL@z9!VXw8~XmehhdeIL*koB3wmRFAa9zVXUMkB9EtYt?19o@F z?Q2_?s-Ij^6n)vrhG?$d?E{J;Yd7&`omv|R*q0PVS?%b4C<{Db2K+BcQ=DGX6wQ*R zi2oUAic0UMuss1epMv@ymxtxl8FUZG^fIJ=LK}$ z<#tE8y|$Xs;bX3-G(OyO^C_W4SX;-z1O>TDrmX1Qo9mn%O@v2JtZ$tNA*HbuT4@Gd z!Rha-I`pYS>C<~Yai~dWwP-ZFjn~rSnZ!+{nb3IT>`@4ZsnwidIr`w$PC)a)a`sGR~ zt5a!My%wpZyms*B&q`|PJzJZ$bOfMUddnC0#;Znm0-$XNJozM`ROfQ7)CjcF-DfZ( zt%F*rWmT=zqC;A#<*Hg~DMXHZ5-Ft#nl%S(z7S6^_$!wl)a!vt`ll(@fDWoJe z2B_s}q>naWy|`5Ks2&z#@Q2gGASd zR~3(`DwcRF--BAkR4oAQ*J_BMD7pwLASZqHfNvuUge7Z(x-kGZY<>X$K`prv9n%P_ ziW!~wP$N1~+6hl=e46OQu*Db8K(bvT<7dwpq<2nw7dx*!I}ZcmI$-@KB^;xp3Jls& zyy=eOO?OB)-2s`0SHdbr%DPrM4pj8+Wh%NBPykFk?f8OUW25aZeow;}BoHOTqr`$RH*KUdA^R7-xl z|4|O#8w_3p07$7;r|CTUxoz%P_1KBtfsY<&g<;h#pK1ksAB(OViPsD@1r;V2vg%{d zH-EAm;g@5CUyc#J`jloAAiVk{Gk!6`R|CQyMF?LF`gHvLBmAFKPCqia?=z{=s;Nh& z(C-sDZ9`Sf$tGX8ZKxXkQkG-ixwE_By7MQFedmtu#C6}kXZGW}a;o;+w+()CtM}Z8 zT#;OOhx~~sOn8Z^%&f2ev=`6%Hk@`O8MI8W@C~H)5EoA=(WGy~nH0W*blx{EG3P6s z1VH{oZtz&lZlmUEi{#S3DfDK$&f;bz7Ad!lTT1UbCZ|+RGizp*qK`^s+$U2| zzioii^F_r(4KXR;^ufg$-{ZoJZ~UnelQ=Sprh7|IipRL=-pWf)_r?>l6juUG_Lc%- zALA!`D_5TEEx-I^uL&wCRY@0aQX5rbMy^wRuX$66!CcrBDe14zm!ZSgD3O#cTRT`f zaCL94tzmZS=gFVw*jCo2lZgQ{8eLYi>ZRt%E!|#Ub%Dk1vq@NoL1kc7T9?yU&^1yS zADOv%sN`)e?aeHmm<{Fo$dAxNR4eUg6l{6LK zSnt#4HAYJ|wG^U*@DV|^9UpG+SOJFFqK!Fu zEfK3&Z8f0vd0VU{*HfNrvH5I_+N#$WwJMFvVemH%)fI1ODwNYqUgKuy)u9XT($|Xu z08nH6tZvM!IY(YN6J{79dX9WJp)rN+vA0EqUaeN{P0DxUkE)}(N`%*!fc1nHkb3Ox zR904tkQV^Euq<|YwCW;L~5p_X&UDjt+*tyIs#&k<%HyzqP40!XNlm=eCZ zelUaCt2oSFagNj`lm&Ia0--1vv1G~9CEz+PpiOz|ewD&S7|RklTGaO|AobA2)4Qlo zviu37mX?_Z24VwEg(|TK>kE0fvZthRSHgYb23wBbtu-5LHuASpybD|@OYc{iZBE^` zJBLfjfsNO1iz--yT*2D(Xv;EdVm%e>3U_Ux8QS6|zu>S-@kD}Nmi{eClVtw7DUgYY z3%{dxgElG#yO`qUdBGeSgn3>=LQg2mUXMidjN6?EysaNi{DoKfyvzAzQ@!R$+3P7j zyFT!CN*&A8{tald=-?6P@e_xef%jUO^-?7uxP?fKhQewGO?k#G} zTRYk2r;O!Io#9PKd&7?mjyY?q<3?Bc`gnY8v4!mKzHVo^w|>ji4V`VbAD`-rNfa8b z)q*~GmMi5|gGZW`CRQHpo$c8+CSy(N;p^A?eAR1_97Qj@L#vk}>INQB*CIsCg2p{< z8By$B0a2rSfT+>Ul@N7&DWX;*hXd(3k=o?9dc!P3es1AymepygJJH7%^pA87t6BN( z;|lyqjaEUAhXMh#mV;(^yMUMDz)OUvyNEe%hBro0c!rnCn&GW@mNJ4dZ=_6sAuAed zOJg}=CjS-dXxl41bA@9gmQV8+fyUQUIJ?C5c1p66#t<#n7)z&rvk)TZ(5qV= zZW{m4NZ#7Iuv#ppL=rh83stU(b?xg6Ql^T=j^O5N`oghYckXJP?5hc~54$RRisNhI z)}f@UwkA$h*57#T+@?~cR;!R}bSk4wEmEH!+90~(<{U}1cCjpBQRrdp zn|R8f%w^x=@fO+}FprHM+8&@!_)(68JOz2g>{}Uxm9nnga%#Uzlz4tHI{y#q;9G=2vhw zzY5#@NZl`eJ|;3^dF#Dwex!=C`M$berf?C)^49yd`75pIVx!N`&lOhhdtk6;XKS7U z9TX}8qwlNP+EBHnozIF{?;Kn>^$>F#7-qSi4S^{vAc-_e>#q807mdvikVc*pvBS_31Nc zHV&*lkx4qel3&5LfB?TK{69bxOx z4ZVS2%^GCocR(*`Sh|{<;8%0&_|@Ff)3z0@yp6N+w#!=itkv8GXbh8{VN_t|ePOMb z{OrOXfwLl3O?_C!$}@)kQH4^%8+y6kuH#HSO{@q0tpWb|i6Wvwu=IK41wuyzfO~R> z%I(lWkQP5n(V&uRC_2GPi)+fGc>ysUe#Jam|0?|+mR`th4!@EzkJ9z8rs!psUc92A z7hir&cg;7xviZcWVt3v4y0V^9d;Z27wr#nlH@s(G-Hv+qH@EEAzSS7%DjOK^*eeFA zOS_9KdnWhpA&qx_*xNYL6kFd`YqwN3bQe?)x95eLx0McDA9K_+uO)v|zh+IsRT9lN zhlbKde`RsZW{wtD`?}Wm@V2Usm-hi~_6NjVcS=pvB57BL8-L~VNh)417`41E$rkos zyj;mky07t9cnP=S^;E&A#PYgez~BGkt!Vk;ZJjo^W$!&hxgFIZt&9>Y(1yUSqV?15 ze$o)H@66kIbd9%g`|X3BQ~l*W^+R@`SH;>QqdwYI(K<<0Hr{%CcA!|M)~c*dgH;1k zqN*CarUil6NdHW0$1&UwCa)_R2Fo3+S({VXQR46md-@nJf`vpUCp$(e3S#1>qNfPC z?HnmTrRfX6&q-#0x8L)>;P$s@(A_gBO&{9%AwQLZ440bUFQjx%k_;iea$aX%ZOw@Xh zf>yfBI=r0^##bbAeJAYZ1IpGBR|#`FTNmecu6bI)R#bA+I}tp+(}$*aa!!i-v!{2K zug5;k6+)9d5q^@V4^Q&soJv8->`9)L7H9SEV^bemovjcy^}VxcyqtBwsHtjKdsGf> zW+<_Yts0o9+i~0Wh^g(meJ@f`v_RXbbLeFft;=L^nawIvzU}TShVt{*RQY^iuatEf z)n-<$4F+tb+pcV>JACI8`(Ksmcn_WQA)r#$DsB9t*`6&~tF#KdO8aLtYtv_fOI|GB z?<%c=Tc!Oop7!ZOtF(%Y;Qpg$ehyXce{_Gt)W%9y%FrscBHlC6Ds1RGB&^a-W;XN< zc9y94nIC=W#>s}QH!p7JBloPoWvtrZ@~Bk?m&tE;FW=9nk@ymu%F%v4U#=G&NTxFD zG&*m<9_^oPs~ulosi2tRer`YCJ0cNd!1!-;5&x+K{P*|MCcHumgywNwuYAKLA>e6l zl~$2Zq_T3agaWg?5M6RtpU9wlL2AIOwbF&xGrRg;U<}@f%U|SHzo6HnU42{0&y&Y; z-07boJ1IhEt9a3tXuaEEXQ{WODjB!2?}uLM)rBrz%Jwj7z<~#Zxu5wA4lK^h{S+i* zk-9%4P`BQ)RJ1Mu1#uZAK*2v_D7YT2)h?B%4~z!Ii!(rYhhP1kbx}3?lpC~)Jf|ty zc9}hXtlJZ`pk03CXZC((vQld{E0lVNL2K1Y%?^vNX-{X}j#{?}Z}ii6Ju)3$v%Qa^ zNV0V3CKxO5JN+mz{T#u2qM?rf-Lg>71|9{KA`}E;pu*F(^@1FOz+T#LTCvQ>dx;J;0CzK_f@%2^o}#%Gb#$0(*XfE4h|iB7F|8>JxH8URYq~Fi0>9gCHL@ zc>NN&rqTX_bMd5Ibd8*!b)JNG0Y%AmAbcPBP#i{dO{7BLh|vxur3axtKdTF!>@?a(U2~0Z`tZEW8}!`>^^t9yUD*PJb|6A;A&aCy$|9t8iZHc{5VecI;3VV-7Ou7E z$u$Y&8!iM{LdX$W1}RFlf**EV(vC{n`R)KPvhXZ+g@rZ{ok7|~&5OO7?@4OJZapwh zU7di->I8P7R88V;!FLaCN5%&Lqu7BK_JQ_tX72^YrVzpKR8U#yNbPD;L4Q!Fy6Cg+ z|C2q1lvt{-+Ax{O-cv|UZ@y!++~{5}zT%LozKFPtG3eg9= zdXSVz{~V82C8a%RuSN_I$oDz4O5)Q=5>?3YT_G7RAOm4C5F&#PGGr(HSbYX9WYA28 zOk~JNh72UY2oRD0Lk2`-zMaInRLAMkLX!m|CZu9bycnS0r-Az>Mcj4WH6LM%# zw@2r-z#rr{4;eu%I&Mq*EX5LGLd0oO5g0Jk?M2wZ9^4j*V$sXPXx`6SKJOVEedqlm z{$1?(%l`Yvf^GWyXltZ_b6>siA4;u?L1$``-(&Qy0++YQrM;Uqra#4j?I~|4{RhFl zBni;NWznNGeOiZ(Qepsczxxe8_3sN+-0sLX==%UQ))DV=IyGEQhRYDn2+>%lKE(DX2ic!VescGxC#zViMXh9QIu>ovblN=4 zW0?(_i(sGMpb2=H-=PV3`2~#ihoPrEiLw5lIGxObj+L`svYXX%7~wa(62x$WA!tZVbN`IT+Rutc$ALK_Szs5a8pBo|b7%~@o@5~F4AvxKMl$8gOq!~=2 zO0b5`D~rg=qK=~RB09f_1hWWZRzj`z5NH7(D>812;ThBus*&x3qSXk`=}_^xYO<`l zwR*Ig4pfuX=cxRIIvON{i9dNflCn4R(4a`l4~qC%PrPXsx&@Gs-#1&F-8Z0jBs3lv zDxn>3Flx%f!zF2ExOCYm(aUXlD-(9S<*#ojFv!r3H$_fuZ^`@E@z!;MdZz!ePu#k@ zTA|hH+%}U<&1iHQ^gW9^Ry}&6@1p%~rPV{t!9v8Vc50sb5%X(GB4Pj;eiTyt)Om7_ z`8P-r^C?}_OVk+7BjHmTpwwoZBIQ$p)OqSG^D{`1@hL5kr=R%|q{#V{t&s8nE~Vg8 zilNjloJW~?*F1GU&ZFW}njz&noTBDa*3)WuP8+0X_>_(G5$cfWHArFklwDLOIV_%n z6dj+k2~xJ<6g^786h^XavJ*qIfeXyd`)x6|25|DMSeiOmeL$z{9jAK zEn#RCym)A}Wcru-QMmW&felyngmTuS-*w>+*`mz_#VvVyd#pLXxH(_<#clWOsVp74 zcjuOS_f(aQ-J9&2Y;uO%cQ?SVBh0N;j8X15MJ_$GkEg%9H~F;xPrNg z|Eimt0Or5y)}Kk?TbZxAnal0)o0ID7=y-q0y=t8ttx8Isp%s8^4OW%toCF<%A(ly~ z*&YccN1xEDMx-kFM~Z8G z@B^3Mqy zq3+B}m~8ENPkz_+a~I`uF|n^U95Ox63luiS`IRf|*RyxJ@}5i)F0G3)(NL@*_SICw zA;$E4M&Nk6TNzv7+nTcFFt{vh=T!y+ixC8-Hs`OKX^nQ5d(bSbTq*VxH|2KsT8i3Z z?dSw#bQ(fS-=><{Kz)%HhMg46C=06FLv`D0oom7g8 za%a?|6{}$+WKfD5t0QH4v)w# z-0X3*HgAc1l}CS9$gjHG+Pp;@`D!XF>oTDD{=T81OQ^F-)d8s%cLH(xadh4;#Yn`Y z6F3{NI&!Sa0}6Heb?TjW%{IqJ1RoF|5kdPjR--{qJ}s6&ngon!j)(kc8qbBafYkI; z^?(t#318406L#Z~FC{dD+V^Gjo%Ih24_dyuC?d<;o#?B4Uq;_o7nc1XRd|rGd^KAn z@?#(D8yVi857l4TH`D5GC=Dq^A{zO}l2~)=qv3{##gN}t5{lb&8oh~}0jw-itI|K# zM=Y(oTYN={p(ejn&C2C4j0OxK(dg6~Us;YP=2lB}CUTA0AXS^yPR|*NbXRXcIAAN# z-~s445hB6O#Gee8pCkYIjND?8N6(Q@Cd`DKh->52AL3;EiM%|<_Z)ku<||p$*uH<+ z8hl>-i4+2lLqm{}DwQT9Yg92( zsU+C2vB=;IBsSOjO8t6^p=C>%*%T}R$tZ?CunQ!^&3V;B9tQrz?XM%>1gvAEbw98j zR9v-u#yKIQZMq+%@U6@3t>aN0wTq^uqV&&cbO^S?qoK)2`Zkr47R$xt?*Z8{lt^vV z=@bhemdeDS^i@)7*6jebFJ)9_yuU7&x*vGwCJKle;wWb=L*(Oxmhg~|C*(GT)24+W zEqsjE6K;?keg+6yMGuP z-L;`1AXcd5a-~M$GbxnvU}B(H#;TJ{PKVsxtV z5qzrhHRx1j^3l^qx8gdYetz*-{ox~ir^L@F#sjZq_` z{H1u7*XAkW7jq}Uw7yE#303uK~hN?e$>^k6N z#f3joN$S2uG@sBJ2$x)IC9O|tj=DhuJ;@x04hBjGI@ecU{wj~=pG;|vGX5u1aP$3s ztwSY!t$W)$b~n1c&3il6?M>KDXuV}Yf849pLpyRx+$yqd&5_N;k&RdPbR6CiFWY)$ zN5#e}r=y~;qIqkn(N*0C6fL^&4tXtgH=y|n0nI;|kYhOiuHz_kYzdZ6$Pt)-H-&Fp z_I#!clD}5U+KtHVJVNp!5CC`e*>8Q$rNOw z<4>j_PX^NmKM1C`spRQlr3M}Otx#MaEOx2NBEHhF4aT1g&8Wkr4St}koz3ki-$^>v zs#1p)Fuh)5)M;c_`s0xTYq(geN3fJN7_#c8EQ`mzseIdw>7TUU=xJ$tF zrxU97HG%f3Kzn#Y1xevKD8iU)-G#zytNW-JNcwx*L z)xNPG{ufr!mwk}~Picxhl5*!hloFo67#ndvTDO1#B+Zov53oc7T= zUwu5N5zAy!M_x^yzsRl8h3g6$C34PTUqf4GywVxZb&5qW5Flwr9w=)HRrHqI_5Ko9 zPHnE~3x%C=r%cUitv0((!>YAbFKZ6iRE*M~*60dbL8Ml*;w2%9>vr zbQb42r6OAn-dAq8@D5c=-G;IL$RgIiLBRS)6FO7a?v9X=M|cc>M1E`$?(bi5FYY6$ zti10N@9VShK8^5xty0m&J4}|O{}0+?L5d{e-_mNc-{J^cev7>zvK8AMIB` z4!`z`Ks#woI<1`CBa(0~9n-UBvL*dJ0%N*AQhMq}qJrB&{{^CmJbE@z5GYXE&w*rF z2qo$>pNGMn7UbiJ+^gLt()371Js||Je;M+3#Xp~d{JGI5Qn^<%rbjaR>au4lg_Zz+ z(-PdT&+QsdXr5Xci)3X+*(|#*ST4U`5UdQ+&RR}!_p+)X1f?x?6*vU;M zIWYTCpn)89qz7|y7_Eo&d>&ME1zGX%N;Jrzpq$u)Dafz!d>-lSiia;jgUk%uifBKS z4fYFtjXP_achx#w9anBOgeJj&p5AO?i6Ky|%Enx5RvFw8q`w(6|a6&V0N2 zmBPOIV1CbR$C~ShDjA7F!D_VzrAQ(XyW%Y&oxxq&SyWo7*A#a~%{os$k_aD2zXl{? z@hckg`#j2jHK8Poj8;eLp0Hf4Kq3#qz69wr7Tpsmd~XTT7f#X4{)h%%LP?poX@wr0 z6QZR=B$NK8LZwoWXJsl0P4%e^tWKU*BK0qlDW&8Eo6}{X6-L1LLEu?2@C@y&Z4!Lf z<&oDB1|mRShrXfla^KJtKTAG}cGi-QC3Nz_az+~_!=JMrbvKX=4`wm&61W};Si_%7 zS&uRe4`y+&av1|JiR{tY&r3d^DWi%#jU&yCg9(o@RN;5Ud^&sej;4mK6}I-8mcEZg zYO0D#YYaiVmeu-7eC8ZCD{~a*G?qS=(^Bj(YIIcDIgonbr9q<$j=;2Pl>YQqGNNt@-E3$IcK+B~gl` z-0XG3aOXjXgF(XnPzW1}hn5R@Hqv)gJ(z;*q1Z#I5EzArmdp4>uE>|qD_`V;*yC=$ zVv{4D=TO3kRA%u}%Ln-?X#VaYF0Pci8fr8ih5-laR_(FM6>^a5u+HEtZO@Bv!e3e588xt;e49PjsbbMwas_n-m1LZhM1-8q-3Tc~ z)G_i}#tJD$KBb1bk+R`DCO)MQN@;P5nNKlL$EaGy04Wwer5N()84!7ql~0L5N+B*~ z<5PT4N`v#*`II2!DaLsme2O1ZJUGRPQV8-w*M*P2YnKBWKX+ zXG*HG>vfO@F_nx#a|3W!X9xM;K~~Tor#tZIsgCn$1%oHW7fCrGB3SslbO?pLPRY-p zK@^L2H@)9+6#a3tWZQ;PQd3&Zv?5$3Hp3!u8r7Ee^?X(UF*fC zpPMySVBL$@!`&IUNHEx^+{?V@GjS+P^3a(q!$%cMNYX{aBjg&zyT6qy(NrGInps++ zQZ5{(u2E^E^rx+E6(uHbXF>t3L#Lw16ADYz=`$+C>940>kSL6PyfRGepwEfCFyiHE zqH}1)nVP^wLcCZLZt^CB;z<(ezp^runFQ5$P9&C#-~GKpi+ok671Z?$N1+y=!L%Wh#h5ZeM7^K?C(z zAHn7*=82clkwzLrJ7NBo?}t9hhY#Q|wEH52_SO9DFa8w%fmQnHJo<_iI~q1CL|_^y znlF{m_}o6q$Yd3?K*^muw%efa&h5C7AtH>tb(YsrxM4`M<2HvQR9Sf$QJ#@s=FIi! z-`*w>GkQRsI<=U(699*1VM?slS+%U55le0(4cGr2ZAk}_R7$AFuO?+DBwB-&)v`1r zUf8d)npnGbVZWH6A<1gcKndB^Xmhp^Isl<1Mu{z=t)jJrgwPOX;87U)(;@1KHewyI zk=RL$5tGD0;wagTX*JQaJJp}6xZ-fl;hd@2f?3b5k-&(wy<6E$B$`Fd+F0BWPaU2e z=|+yJx<_UYrzDO|+boXG=>uyIG+ue6^+@raiLwdXmL0Agy50fP0992du9N3Q)R6;6 zCUy+eMIvjybTc}F?Zx8D{~=Kc-3KXwm{{>&t6w67CHDhX z5sSIsR~j!V4)ecy{@2X^3il<;u9yEVzb`Q@y$&vWzVJT!&dU9h19>e@`+g(qV1;^F{V6pt5?-$Xal+tA;)QSN(CjJ~fJ4LgcT z(m#}a1yEhhvnPb$!6mr6%SA5kB)A24cXtUEEV#S71$UR=65QS0-S(32|LxniRa^D8 zI0t%Wx_i2R-FOEt z>9X0+CizWQ)CXnfqwceTv{hstVkk`kn-m+}*>bZkP4}ucXgBDeaxV`(;AXXJ>d4w( z?iT|Wc*>>9qZZKXUsFtF<6USD=pv!w)pMn?^PYHR@_Q|fCB^t^9rkmJB{FqRSY0*M zLuSz|*QV@`5Ln`sNmNoe)muegP^LD`gc?_WRE+B_E+f`j=)NM*q3&s=$rJ0$Nce{_ zFis*56f(>L*E&g>6FK9@Aw6c&a-_W$@PK;A~qy zMt-iPiNE!u#rsh7C8E-Pm$>k0kD_8K@w;^STxoGd6M{_96(;DbI_fLvqAONUTP|+1f-F7dMIbPiqBZ%x~axI%9vbz;(O>I$l*CO$IWPu7RFjxIAwh z_m8Fb?(jE^wdoJ|n%?2#-WgneX7^5>Z79ExHjZp`Q|kR%zcF_}4|8>8=i%5-EeObG zeKFz|Urmxjp^*+L=+$(q?(5qo$!5(oG;X37k59Hy;$$STS^r9$#@ldd_><8#fjLu( zx#s!0|1wfR$dwCi5bqWkzoQf7@Dt`4c{?ig!DT|}o3?m$vvG@XdF+I7fON5KkipoY zvqMoYfoTQeN8EUOw0x_?KL*Eu`hoUeOSEFU-XJC+?gw;WIB6= zoSKBXdkc7Ao5%GO8>emF z^|6&|=o#nmnO@TbdisG>ZjWjrlowlj<5>3f!HO$ zGJ($f40|mNKrdkSB7u-wd=$r$zh+TymX|ZmJ1_wHzNw!!k+#EIn_5L+yw-eYGtxUP zx`bY=L5Er~z0in)wiemys;1DJJUY}&%!)Y*cL34<+wVW90e}|{1qyH`20xYqlg9e? zFVaF9ZN2JY3tcR2fy?d%94!d z)y933=Z^}VIavYBKp-?+klcC!x)PT3%NmI6UeL%js;}Pt_;}i z(2&CXEa`uRqjVMHc5uB}09RYM8J@TX7C)wchsmX3XUZpv9!r7q)70;ZT4}$m_T%yL zwJ0vlc^|!C1tb5)sEr7POb1pzU-sSSxmpZQS%bRb@j9D|n<6WqvaD#tPAH9sulJUW zY=kt%1muvtGojti)AjYBfR^1r!K6kJqsH}Z%&($cvb72UZpHzL-0_^}`myxH*BH{Z z;)j66ToZRTt*ooK%fri@XRN3LOD;g2-rB>IJwZf0m;<@ng79Bvq86=HGO^nXR3=VtOQc6N8rVV007FP|He$BTHh0})HAfJV~Na&TG;Kt^_z%KsxVP4qTEIQM9ET+ zh#<%tg3JVKTs_K^UHCgaXGzbn0(iz<0Tyvg+hu%XD;)J-u#PAara>CcQbNu_z z+_NaiPbsb6Or^|W=h#E~%4U)PF*aY~G3#b?Fgq9~QkXZpF>%G9@AI;z5QF;cBbM!d z4onbj=ZCR^HW@#=65Y9q9{|JI&8veL|DDW#r%vz>!CR zc(&+wiGZk6IedDW63}_BpxepGO`UnF;t#c`aS*V=p{&`gj5kX;^XdTr1gqsQl?;6PBxM0_>wt@8C(RzQ6R zc*@ldq&8T)z_y@q{3Mb>)<oYNtCgf`#C7IL2%=+&4qcQL)tQB@`Ll{GjYNzpBhzf6FaFT)FM^nQTWHEfG9L| zxw}R)vOrE9WYnxfNprgC@LIZx34LD7HH5RRDngV^uQAf1j)$^t?uv9h9|4%(G4fK~ zg|$8#4@y7O-QL2{EYA0kvzs(8w2~mnoex6@}Bl zUX{ot2ArXnS2#-UNQhZi1{^B{%1eyuaRfCn69im*;qb0cc~-M$jiUO5cRf_+-22rk z@MgfU-B-n~-PR6qb>R=mj8HaH(}&amBRs6cKe|QhFEpv61b>(hI#`!?=|hwZI0UAW z8h%Uo_gL0biz@v75W)lf<`Pgh$+u8$unHZ&*WS&8L@UV!SDhvLxy# z>cXC3ze?0%ewq2A`KVmeUxMKs`r0mHQhUg?#D!W zLu^N)8>(iUNz+HTFWkpL(NG?COIo!}Wav8R(uW)@SWZ72okK;hV%W1NC(`iuaYEHM z^=Usj=L%j>hxZs8fg_t)iqTIBp5>5^k(Dh8t!`T~1XqlIwK2*IUQq~iAJs=MEq}b0 zMBHx-AeXkjWEM0ACplhbd?w8iy6AuaGqrB^%gSre?!9=FXnTHt@;bje zV$0QX3$TdUsWaGjK{vqW86(3JVHmIQ!MY(zu=PWUN3+z`rh`J$6m}vzRlxl>QJj7I$t zAK@0*BAe~mCT>aKam&temk~otzV&(bd{%BQvuax;E88%!};6Yds0h_!AxQ!V(HHB`isAxjS85GB`S*rc!^U)j=Nlr{0$) zAHb1Xl_E!`y)ko#E99676N;E$8&jN-wxMdCs@ks3L_JEUFbPet80m;VPK{VKQ)2OL zxz7i-GDtw>?1!5z@pC2yGr=2+C^Uko1<&q}-WVbSD5rlIv=XIg4B+psh?C$IH^N-n;tM@)yEI7wHf!W)O0tUZg@P|%-d-GM^#%2qN!dA6&4s`JWif@T5m9FTzn%P2*HW(aGr}7T{tXSz`17fV{VO?$3G*>L3~XS{}_Gv!4Cj zfPe}`wgDh5{Y;7PhtRhTn~5q9x2N4vW`m>EC;G$l z4Q~z~p;_YHGG_hCRK2&?xJc;IN^?hpN%e29_^PbztUTg8W(+{Ljhu8_<5g~K9Y%2^ z!r9}#q4e+7$deW4+I}5?ZI;u~M25gbr(kcneRWs~a(<_0@_5mRvwGLJAAK0q5eZo- zh6$iUIXtKo#-v*}wdj=sB%-b3EvA1`X0V&>3|%Rt&R8_dW|IV!L;24b=Q*D!<18EJ zZo`C$Y{P#ObG3*n%WD>a1|M#bwJ^&hQ0x-_Y}|o|AX&ZEZn%ZnjLC%EU>AC*P&}oq zT*2;HU(1$wa(p?5`Cud#qMo2QlQ30Tx@twWFzJr#R+lcNb}ZH~T=ArNAfQp#Ry}OW z)@`at&5Xm=K6LtgzDVzpY8|K^_=RzXIE8{MI7LyE4YDz2ln?ir;+nb^4CChHTKW+y zGqQMs3CcHsQE!O&TdGdTG-NVD5G$d~kLPaZNu&Pwb9z=-LL^1}0551Rhb0<6RA6rG zql7xV%cqlM(CK#SqO#hOA;L$r2mv^f9~1&Usi$hpWO)3JpY?mxooHsEG%B7?fhoF% z3YlJ~n%21HMX<8CVGmtJXSiE{^MZ<<$*W10wl5ycBEbE`5f7CYH=r@;XE-B@so<4k zSD8gXV!K$N=qfj5M7?OHKt)C|2<$C1on@z*tZY=w|(J4>i&7Lz3vkSUrf&R2TX3_BY{WojXpJsXS_>d$7TI{H|?a%9Lw+cc|7NAn0N z`e4rS0ipcQ8gy329)$S_FE&Fr8&VMVY`Dc3OT47V>tu>U3mWS%Vd6^yXytKzMX5K5 z-nV86cM5KcSt=#eWFbqq1gJxfZ}a<|?R^R9@w3?MO6fXHqc$I`rSiwP|r5^gtxKSj!X_ZWD{G1`Ro*(2X(E*4g!ERA6 zg8eytE{^j}gqGR9P&l%e#iS_Fp^(i?bp2qQ>W3PQe?T0rP)@QoQIk_NYN9$nN^?<| z8OcS5*#e$kXF=pO4LXY`eSmmVL|e!>KA;B@vQ~h^(1J((*k{p*4@r(iqfD{!nL^ zs`u<<2bRw`4`o`K6P8pzE-Gl@QlQpDv|c&=l}^vM8%HR{?IMTXnDl z=T-)Km9vgO#vY$wfZfzqY+l>)2cz@~s^n^vVEPx==2xa(k4oMvAKoq8+-z=K5X$!p?OFZyi5VNnyLrkb((?6yf^A`g$bHCft4F78Lt99U=uUq$+X9MVY zCrTB^t+;i_kjwLsvE!yS_bB`x4=)=7TU@t+fJ^_Kg?5G+k~bNk$TiJ4i=vY=a?M8~ z^kdwVsz#;1ZAP-qSwalM_A|Opz%#1hnqMI3ShtaaYwbF*u2oIB1I4-7CJFmA1?94+ zd;OVJ&?5d)_KuoEFg1%ur;J%+2UBYX%Tj6mW79x}A#rCof@$4eH9a!aF7iUcfa ziXn7M?2@Z*;#xkjY^dVjzuBHVO8bwpgiEacY5uxHb>299wNZecvKKkyDlRrReP>OH zB-T8X28RGItipO}u&S!OlEsW&D;-}DC0xpS2%t#UrkSnz8GeMrQA~Y65j75Dmq1e( zRD}Rfj2n2}H{}QG5%>sBEcjg1(TXu;qEUrfvOH~5zYu;vNIQ*spp&0r8_}@lnDM-F zHVBcOns489Z5-Zns1VywgaH=uIM8!&R0*xLi83T$L#i)wZP*)#Awbss(H{5{I*Z}6 zq9>%JvzoASn8+NmCH^l2mAwV55LNoBA2i(-4Yvr*l5{wAGQ#ZG;RpO!`U%1+F)nd7 zMb3jt5-Ag@yb^WQ#VzfEIm|Icn@w)xa$EOLB>NlM`x{LncQeC3@AV}cHz_|I0L2iB(?Y0i;c9{9S>8=vtkxJ&Iv?}JiW^l zlPunT@{Nyqs^HU{$*5?JRnOWkwL3xI6%pQEURn^LuPAeS%ou(O51Np<$T1IUbXp&L zC8EPon$XT|i07)b4c#u6$D;fm0B?Ax;9HW@-hj35r|+q^VX2yul@}q2CDWZthgCZSGWAE!*6ZWA8)j8DiWbbe@O=Fm<82z zn=w>oV05FTbD>3S+8V3f!@;@Z|L`DgZN~b<{fS@mQ{ScJ4_PdJz02f`ZNDZCTF;+I zpOxVfP7*i*ba|~`nvgA5G%H&eu-lIs&6znXoL7$9$GtKO1K_nM;5JCxTb?T*31A3d zyjYg)>;}wQIkyiTZrmUr`ut}7bnLUwJ-7MLa|-px;j>LUkbjbME<4M+w%j37~qwsmJTakBOF?_bD9t^>tF6|C0Tc7`sN%|y7d_0X!3OrUQ1Mq z!%4Em=J+*|t$*&>?qs%3M~$QL^zFL#hUb!>KwE=R8=-WA5Sg6;mh#~|v(3Vtf5C$w zfDg*=usXZmMu);P?`+D8@#aMi=7ojN@_;{}J1`Jo4fh;TYRh(~(+?GJ zZ7_&1_*twWqN%^Yg`Xz_>#gu&?W9TH=5=+vKtl1Ydc6ItDP%RIpOQW{V=!&dJLRV| zZ;MXLTlT^JHU1QTa&p>e^2@d6g67IHuLB|XI`4U@zpQrE-k%9t4xMkd-=0f!G;hv= zGWnjDH*D}E;8i3mj4SE|&vmqHoepLibY5ymdBtDt9nU5>el=~T zT=fS=wAr=db%pqyL4ddRfp6BC2TR$I!SFGJX;l8<}xy3$H zyhul+`f-R_({vpCyu;Vt=^oX_6SMig+15j!U%Ju3z3l$X+e6>5>LujSZQt#n|JWN( z8Ijqz)4M`Rz zz1sG&!fow$-oxEO)atG>uEnu(liM=4>U9@1LfA~$ea3g);_-O)u+)Zs$7iqeYOeaf zrImZ$4&|C~lzaYG}WTXr}?jt#l$|E}o2v?3v=sJu_{h6^Ex91w>DBoPiOl7sS0fD4xm z`nE-j^W?4^I(BZC0u!9Ex0O@I^GOe-ZLI&d+5zgO57lUYz6gOsTI4WH5Rlb@Yee=`| zzxwkrgoj!Y(>Nj0!EtvJFTIIV+=PK)XsBl*ITWM{$mL)cF{YW8%ldh5f8_Unnwt6b zt`X;;0VFhnoTT8c4u#-y;=T|){gfm!5n7gMt=opX7YskXpb?nH3g*a!+6X1eJ2=H zp2$NoTXDbvHb3e;-|H1lD})JfC!uNV{v8S?t5UlMvax8g+b(XDeDQM~Bpp)X3h2Ud z-S!A!t&fNd^$;tW0qSAGgVd_@<8B?%9NuVSgRN)U`Vw1+ z8TStdhFQ)Q(O`3xb$iXyyKbkCcWai`ffrM^8IdNAfZ7+;s zU|VX}i+1qp(u|eokPY>KIwlXOX>rmzaV#lj!d*|3IBAgB zU4Zl*dW^ZmraMf-)tXkwv_9V813;L^iUfdrpurLEt{?r>%`ZV!#zQHvMhF z>63PKe%dhtLo|(yh18{Yld|0fa9M|wp54!Cm9xUPaW5;4+LD@qJ~yo|a~)W7@0cAF zW^37rZGbY1dB$YtMtyMj9u}DGbZSHdbUQsToHWP zx+nXB5M-#(TCNs%I=mn#NW*9akFw{^!fQeS-(dT^n@2R*5jwSv#(y_iMgE=TS`rUYiE&|PQT<8=BAhA1eh&1N2nO7T5ibk>v?;oI9-Gf=%fLQ20x=k>8zK_ zNopQHES*{FZ0*o5R#kI!>Lk8FkUyAWgh|;qxRS|<6 zYa1V-Mg+-cY_T>b=CL>-Ki(*)xxXom)}L$A*3geCBx~pO3QF~Ry@~R{&FUhOGDNTp zmf?i0ckHK!Ixau}18Xe%kBzRG3m?R7;Xj6|)QN;5b)!*M^{HW}%Ibnn&P_h9O4FrO zo}`wP9M#q8x-bv6xf^14IY-4yAFKTiC3*1iJJ(z&0|EJ)3b{a~&4~zndrO3AKxw!x zy@#Cybe@|)=xuj8c%ymXwDA{M;RwFh?^q7zr1iolQ8p0ucFU~p8)xc`t6@%>v>RP> z`z7#~6#*vM)%3j-&k>le>V#tpp_y$^3N0HA0pmdu0Kp-sMzIU_GRUU8@&JY9FS-5= zA)3-p#4E988p0-pG$2&k&YzuMts!_?Ao!7H2-`X^`sa)f7l!6)!KYw&v3YA? z&8NdFVbHHrZ>ty?)WtH$v@?qO_N5@`+@Ezanm;l<08$_^r&Q zi&ML`NH~7Nz#{#)`y>PUJSylH=gswh z>QfBjf$leP@i5*EG*cHubUE*9%w<1jUd zJ?@CA&ddjYhLu5mK5~rvaR?DfMi38Ufg>>mKhsZKX5>UtMtCfFo9=sOn2EVN>b;r=t7L*qL3C-v)2k8b?72>~ej+2|XNdtmZde2^ zpA^78IMnghYCx}v>)kp)i4KT=ARRH94^_w-^NqZ<8E#Pc04xfoDvM4*v;D_)&6Gds zpqKxYhdeivBx^Mg3O!S3uqXD;*e~6dm1ciLvi6mmDgbdN!ve)(PeN4kf5XLcyV0poe;N`G4AUmu5 zTl#}sOlFRWS{*(0IoUY;nyciV24Rsi(k?WA6&e}^QEL9G*X;jr0WF`DoK8TvYpCQ3 zjw!vNHk0%LxOI-XPw}NgDt8RP;$}<22IQ=cbN9z97MRZhcFLnCr>1}S%@iXtD&po$ zsi-JP4L1bWn>-wW#S+mnc6yO*SL7g)e;7m)DU*Zvqhutuxsw&Z3E`BUHb8~s3kz(e zBcmjN?!SwWB?tZIEotnOfxII|KpM9jTP*zXZ++huNcWK;cRO;gTV6hKj-d-LkzL-{ zKNKQ3``XlhoRXF$*(gbNP*;i-ZiseA)?YuKK%tUlqr(8@jPp8Kxe(luZ*cZg4gMI5 z7-V7CqW|=u2oiXcCd&Dwzd}E-@MHs7@@IWyWc&P{C?+y`Q16dET8)3&PkdQ$Bl|yS ziM6v+{j_Iidz(1nx{!kxdcQqYZ*sQj>}c12Bg|+wrsF^ZcUHqQ*hZ5XT_H|IiUJ_N zv_(edtdUU+OydDejX6#$&-b%|({3iOYtH2b4Ix;;%9|tUTg&chUFoSc+^P5*bt?4@ zW)bvS#ezAZDPV6t9SGyM_0q^nn?4_7ay5A_S|83m@w9Vni%~`Hp?uE@IqUXhTX+n; zkIb!IlSZU#47q?8H_os3QejmHd~0i6$<*M>BUq(_iAYmVJ;J`cGt58Vj1zIrtQamz zj~<2{YyHo5g)NhL)?6fU_axN5FRt}r*zu-2p3cZ;-Az2d`sgoigb*Z7IKT$K%rd(z z1%}&8ZJOEM3gKAqYr3V4(=LA5KgNRLNMq5HtS2|Bzm}0wMA1QvXrny(@+b%|Oi?gv zKx!;ayN@0Ejd5SZ2TF2c{R8Ca&^j+ zD$_;U`cVmvB&Y4=G{vud6FjzT>Y z$otr1RLnDumn4m-7QBXwt*ny<{xy7ewt+q9l(9R*9dXF8~S|qc2+Ugp8m3V1u@TCp^X4% zWNql+Xm6xv^_R5KH%EYDW@F+cVj}uWYY;JM5V0|FXb};yY7nuouoJOy06`6A4p27$ zK*Yw%3Tm+cG>F)l+1@Em4I%(1=R5m5#Reo|XJrPp0Ph?u@4NtzBnul0h++eAurj}E zV}GB7h3TDQ0ZIKsfkrvm*ofEx?4W)QHjq5~yAd1X?V!0p6f+a3 z6TtaC%*^yYC*WO%nHeO`#?C>+34EV~nT7dX2k<|PEboQ@{<_7&@jk-B2D0I=Uz{Lw zKuwSg3nx2>3Ha_A3lK!IGQIb*vcC6nynDzB0FnRjvI2l0A6eh0Vr2&@WMO?bjg|ec zm4C(9-$D3?fdhmq2N3wLDCb`T{^AV;jr>O;@ZElpSs=|IO@MbNS%H6XWqv1F-<1Mb z-;w!iECBEqd=?^(zd-@8z0b_b3c~1b1m59h1-{F00zeM3vb-bA$@U&#HYOq#cFuq9 zzd_<;d-sLy-4{-dcfUFRGQR`E%JdKUuKX`BAawtW1og5qvA*B$qQJkg27uxX05yT{ zR{tXdWCo3}urPz1VkTnee2*581!M^)@Gm192#$XkL6HTi1f}Bt{WbDklnL|$GWM_G|MBu)m47h= zLGzyE?`Zu`%>B#rFYf;_?XNzjcO2eJ?%!g2FSGXo`?s{-i|U`5K=&TKKmJ{`&Lo6G;BAcc5zcn{S{p_~$RE7nJeuss6VO%H8*@ z2I*vb&*Og+7&Hb74=7LnldJDZ`ktMC+W-(ApnUu{5#KZLJsm)E{!NPi6ME)%OaAlx zd58WV)BgR<0;-nx`=9nZ)F2h_uKv$*};T*fF6?U?4a9%03}FA)#&=8q z1@;}l_b|PK^4<&h>&rXud;7f-K)nFwzZ3@uzV}`>Q13r~L7swaUv zp#fk9B?U;1^}TTZ8<_7J|ANWG!zg8BZQ^JOVgjeB9lLbcS7FA|E5`4U2d zUaU7Xheb5n?A?B_{4F`+ z;lXE)A21k}+!XA1Y1MJ?hLu`yOS2eWphKE^jK;g!`AiHw_0PK2Fd~$DZdFhgi5CG? zdL^%kb+SZ&3oao)tJK1JDXEu-v0RvwapB;*zUkAd;^y(SW{hl7m2B{4>8CsOqt|(_ z57|ppKL%JeobeW)w`Glxh#jFdx61!S3`*mkHvPF06)Ah97BV_JU1nn5eHlGs4R&2e z_yM<~80&G{r*DdfQt<}WfV9zmkwTx@ZnVXZFkJc;HuB-eR4P9ocfgen;OzKeeXfQd z6@S|skv$;T(4|L>2VJ-qav~q;`-`uDV^o`r1dEwn_`}_PMHCpm2zpwf0ADTkqNnd2 zlqE`VfkTLAFA?|^HU(JX$fo__)BZ+u?uJToYn7)xyJ;Xb-%G0!!#ZPHEc#>w2=1vjXndXQ->KQ9+518igsMrQ}2u)49O!$(YErk?( z#`CbG z^B|EQx1Y=A_opbP4Lz5u`E;To*XQR!Ajr6U{jw@1lL0lOt@8Gv1VXzb;@32oxmKkY zc;1S*lq2HfhdRh`hPp_ko7N7|+>xi{@0`xQo>{Ms4tJ#D(LpYhmoVCb1do8Yv!97p z0}iZvSC2NQjnlo)pH8zoUJ35iuaS0-?n$<@wZ+3j$90zHTvtA$8f|`X-|kri>-W?v zc0W9YoKw5RGTr;EaOR?=ahX`KP~G2O5%46Mq2sDGk#D~F|?ZBqIJE^TL;Cu1?D7mI_P?(B)fzqu~_i3=<0erGw)|a z5&RCTHHY~J%?c}lJF=Pm?$vKge1a6rMaLzbh5;H#F9S1sX+q!)I)Fdr-v;;Su3rv+F)xHI@Xxa|wL4?dVMm_=7#5?Le> zL>;_UUVV<xS!n~l4wrL9 zLFysal$p?txGOSN;_1^c&FS+9=URCtkq5#JQ<2^624ImspB|wHG6SE-kAZ?wU$Li& z9n&U%S3E!{fjKQ?)`lO%$^3s@*KbtxEknHT@%VpUW(OiN+4eqyKDKzrVC7(SU`}8d zjn5&cRoHA`VPMzb*B@NL-NDqsyTPOzTdx-!be_rXWZs?opI+*Gqbt|mGkJu|=QvVYJPV%~bfa8NB_A3&UUOmE33EVLeNN9l z^)-(>N}B|_dVq33-5{3{uVGvNBlX@LU)J8dH<3SUITiHSbysqD5d=baGVUMe+Ytx& zv1JQh^ESdU5nBr8I}_7!i4ttXQQTuE%Q$Qkhtz?Nd?6)znx@0og}%&}XA{cr&L6Tf zS8f>DV1BBK6O&1u?M~u^$5J{2%F^;vZcOU8c{9?~3^4yz^c~ zUa*V7Ag~7lmZ=Ec19vAp)dk?qQ0NQDYvU472)ZR} zk#|J6H&NcY>M!^)-*WLRV=ufjN%?;)E+<w+OqX9wTKnXCeCM5`>w{Fs!Ikrd zX*77XmTM;vmb)Y7e2mI?>5!QYcbU5IHtU&geF#NOoytA)9@vkq6hZ7;T8fh(!)(A? zzc2}h*oDD`Mt_Zrutc1X4r(I)9LX~P&)I2!C*^(sRbrLxVh>|2o?-YyfzGe!MXj!Nu(X<$=?Z1)q(gR_^YC~frx(uoOU$hC&X^- z9#Ge99j`M~?iGH!!d~EoGEET+dcWq|fG@ghZ^=4XriIlem?Z8IIyAZ|0&VRCoK@Cp z5Z}DaeKq40Ln|Hs#A;(ULC!(ZK-jDDSA9WqNp((ZS#9qg{lK^# z5dYRPR4`X*AYVUPu5*tWAc{)Wu|R-RCDS5SV3yccR|jUZ#3ArIFz#ox8Ld(PCIPDz zz8+Ey0}l&~xV5&UVH7t@5>JerYN@=FV0+zyb$a`>VMDu6*#Y*C%NOa}nc0I<%cfZR zDF$a@I9$*&Fg+{wFb=iC5EP3mN7J|a;@xP9Mr|cJ^IDFG5V%WuC9=RAEQu-LZ824} zqGTl`OJNg>1c@*DnsbUhyA4+Q=_$6QHOrD^=>pgEfVM@-9OtM>h0)5-rLfaFu`3;Z zr!`u*TDx9S?7B#6RSr&RE1y^y`O!j|72fh|slCP20tckGWiTy*)UgH*HdznQA+Wcr z+X%sCeZ`d;vM<_48l@m7g*``qElg7y*R({IpIV2kYScgQ00zXX3e zo`cnyw@EM1B*o4u^?(sXfrwghMwd>scy;E zfdwYoh|^%8J_jRW$CinMx58tE%^dl`+qxbx#cHZ+#;1MewySC;Ny7QJ<0-c-H?D{H zE#3Z7PA(esR>oEOha)1h0%Zep!2q_8{I`MT^VwkbRjEli2s5*S-C?LfU0R#s>yv&* zolrZLmcLu5Jk1SC7wQ-L@^Jx!cs6KTX_$GMlHeGF>~?o*^=8WxjeS`*}8W`r?`D= zl54ko9v zp2weDz?0B^BHU*l$5^$sX)3|$GlCIG<*n^PEYRGa4piBVu;IZ#fRdGFiwslQw3zS7 zEj;!Dt(dMiYx5T$4Z0{-DoQs!v!NP*?wUfbL!PaG7hCr-U+srqB3Wxa7phCMMEqcb2?byg5Umgb<83n2tyGGE z$bf1rM4CXY-=JL!Rl%X7FxELyIK{tu-k>s(!H@;%z;}{$mV+T72kc=1-2={{GKm0Z zV!L$w;bUsA57Al)-jCUHm$`(Nb=8;qG0lJQL17GmlZ9cV*I$OmCGS$Cq7v?;S_r_ zzG+S;4e03+JlgMK|ImrUU<0$k!^yEl3)hBc)zFHLU)_qeVhH@aVw@a7Q0YnT-m(+0 zuRdG@^2CHBh+bCww1&rxed@BQ1|wlS!)yLBnH3^|_3nYbFxUg?G>0dFyBKr$#3B-D z`F8ojS7VLjBr8rG^l%Q6b)hut@pflySE%| z`s4JmR*Q%3xI+uHUyHc2>Z-I1;;}k6km+W5yOS)k($Zhd%4&gy>2*25ca%OC z!eBfcu?#C6kDQ~<5^w$w3kxzH@oe44r@2pMUe=?XKiOg}2EN%24JEw#`tChKKdQS! zxn~|>?{5Uq(W*B?HB%Ml*W`O;Z8hEc)+fyRo;#F7l;`zNPNL$#pb&(TYJiTO$E6D< z`8aLy(O3}5^-6I1%*;E0e{PA7eqWngIxWrlc4JLy22HPvf zPm8#4(sJ5CXvAJCYjTT_k(=R8Q={kfbZw`J2(@sD$3V(yc=O1c@!L#xle^<&p=Y+Y z)UKYRDHTlMVi}FmgD2#rxBbTB_Ed5?fESUb(JGDyn{MUCW8S@SQ2RNyk$3D4XZDJ} zUrMf`mjJ31i@AD%Fgr3Qc>v7ZOf{pM=re0<&YInWkFZBAiFRS6h z%h=E3zuQrtKD4MvC8EfJ5j=KQl|dI)6F#zo$*eltUfK=lgQbDqTvb3qTM{$_jHc0(s=>Bfm8U0y>ZFkb`^X!{+Tc# ziS0{hM#|H$rttAq&01Dk+{d&&4KSqsY^3siuiEH|tP`o%WpCsKhco7!rnSk2u{Lq^ zu@~@=BGPH&sK@mr`9vQ-^vzs2+oL7Fh!1>fZoj_Xwzk9ak?DB}3ZUhQ3dr4}63iGV z1s<7xc=&#KE4$jR1f8YyO$oU@^LhKEv~l~2`d9ZJW#UV~kI4cV5Z_`=z_p?m%i(cZ;2RJ;Ns#Hr^SQrNM-{o^fC zgnaYijUe|0Ie2Cs_G6B=#Vr*6%2Av;IeDBUnK`&lc}z3T> zZZNQ#hI}^7qge#7yoAAf0&|EK z6Ryp$DYSItkBmyGQ_l^P#ZPW?^+6v9Gq(ziTSxJh{5ox%KU9XP_|lshytXqmL-KPo zBqyS2k;(bIl1 z>f2lZt^CTdh6*$C&xVS2NO~u8!&Y>^t6Dp#&a&(o!{{VMTMskXuU9i&2>o1$-bbsq zr?TF62}2=HdaRig)TZHde_TLIIFdtBF0C?GrX5U;lG7-4i_EGdDC9jZtD#6byq_Hi zJ&nF3rrRV8%%CPKGYrrVA$T7?xvV)~WGGXyDBu^ITM*sccB{$}!wP1_Jnxn=8# z%^GCrJ<6}lG?)H3JJe7C?`llGwNwc~ZCrpl+4?M;dLpr`>27nT_;!1pHngLF^3&w| zZSpT}8br^VR~wzyD~lkDf&R?b3dUam?tN(dUAFP(!)UFwR-50@Yo+{dkOoMnGAF(* zd!#mUHujmHOUlh@QB#aH88Ym|7Pm4s?84=~-DeReHdZP3l0?@oDX918PZVe><=y@f zg7v<=YBbsg(;>++1Gm&6Zzo+J@>8Ww?n;C?P$(Ab+fyG*G&52Nk0UHym(0#fI5(~k z46!;}eo}(2okN&bzM9#~Po|=c<2D0pO`qO}zcIa-XzItxiq#BU5| zX1*A2#J604g;38247mO|WU0S}w)A%l6Cv%-U$D6l;YsP^*D=BUWQCjR5lLXcB9Bjl zU~FhOfUp;>@hWEbhbcB)Yojz>PlOf2D+PN^B1~>woP0?xf!Z#0OIoWlINwMj%wVL* z5<2U|5$OKWS}gJNA(1r0h@U9Xo=xB?lY7Hf6a-FZdE zvCh*7;~4@zJ_2^YwR5oy!@$MPC!Wg{FBi?`4*De-o^-t!vwY8tk)oe!pB69+<++}p z&j@&4bf$2nWFjXz^)eYC%>EYuML@d0wX@G8iSWxrY4%+*D^ccJ zOyCx4k>ac9yhzc@wh%^CYO@jzAj%Rq;mh?3d|S=+H^5vdockT|Ex2k9G6$vTe5TCa zEBuDqFvG-!4RGJpBsqBr#lmW!`I~*qSi8ByT%2zc^B52`BEG=nEV4OEvX!{gxD`Zk z>%o;ikz6Se$uu&#M$9PHN>%aNHtJkzYw#EjL2FD%7ZhpFBcZ%k8y~hXVy`Y3t4XY5 zz7Jt0nZ2TNC9q8V4v)%mnMRIB;@1;5`C#At=;JXk`l?ZTFh}b5>wP|v*I+Q6cN9t_ zqVvd6+9NjTr9MNUmuJc8u?!?QqD}?6B*5`RT%RZ_YJ36E9;t+|6P(6y6ZQq8l+_+Y z0P7L9`8viM-yT z^C+vlSLBtuX(N_CJdXYK6)8RSC3?tp%;j?1bsFsw-OHl%0ax)njp+4arB-Ov*en)x ztUSBfLJ;#(smNe88Rf)~t*X4t%!RpHNsug#?POrW-#XCJNH zzGXDf|J8o-JuZ})7996I>SmV(@kky{QwyE&hH?1>Me zBWwTqPoFvSm#>Vh`Qqt}2qk-o9AE(zHaTlp8kCm^4ZItj_n-A2ASIcV{TN1{6T}rrpkE(WfZ-k zsKu-Mmy=gjG@eEQVNwQMiv##FMO;x~n1Z z)IU5w-j1&nEH^{PsHAO+K>J0H4pkGHT70fJ^J|AW+?#1_|>AfuChw4Vtz=w zDKBMTJeGC(EQ;$VrB~~8RI$tLawW(EH#WiuR*2|BT7T0>&{KcjQRFC+nBPE>HoLjn`}H!>jM7?0 zlqt)Uy6Ty*uD;&P78C1No*XXHTWxxaUa6BY_FTKIc5P+#%KDO$+P zuud}_nbxwl-0GDLB_%a|c&-sCffKNwmW@n73F4hMD0!-x%=o}7B77HSFC`7Ec_p7< zXI95t!uDS5SVE=6jtRur?h^~BW2`mE+EpLyNs{V*K2(7H$LDOS8IVfrK(~3YZEQV{ zbmv8`UPZ4tj`X@z+jyZ}p;@eO>2-}qrYAOi;ZP$_u47rsxBAxZo?8cfNqzg{{jVIW zuRZkQJ}N)aplkoS;h_zMzL5t;C`*c6f&H=;XqN*lAq_Hu1~f{H`twqwrPsiyI4eU1 zYQX3-U=C3H1b$#xudj(;r^5~qLD4(`kG_&{kv_Pe-UEW1!Y&e~TsctgyR4U~}V ze30Y~ofyWm*lri+_S(hD%wFZZ*N0mi@EM@JY?Fa=;RkawG#*;XXrm^|R08e!8HaPe4EOu!aEqORVSf%;>zt z*=y#hdU**l_+~5E9^v>vl2zv04pK-TC@n2hCy9~8nM874>^?pzHff-}0{UASWf`QY zG~*&A0Ds?*B_a7lET&7a1@Rm5S8|nzZE0+x;&5%%!7AdhM0>GhRYPlEr0u{pIjA9M zHR#1>0hm=n8TO})TK%sRbU&L>A>o*_ygH)*sc2}2yDL@JY7u2V>aJaT~i8{*!Cv&|#;vG+Mn z(#WYFCwNWB?3n!pqR=$hng?lcx?n_>qvD|16}T+6T-IvE`B#wG3ap=TA)%w`>pVx$1=PHfR;TFegZliMjy1Kh@5ya8IiXy;x67@x7u)mN%WZ$7 zE9`81^wFNw zmxv)OaKx62AyBvSjm2%l8LjHS#j-d*x1y5baheD&~4rIL&01r z1NP{rwI-uIOWS(t+qWKj^Zs^Kro(75NYzrF)n%=m{QQ>9PwlL*x@|m}2J;i9#*cs+ ziP*svWV$RgT$GKPFEU$}jU5CQ#tx_-HQjms-d|w!zJGG&Snyc>(5H8Q;hCKej`+#U z6W=-6%ptP%#A^o!Pfyle`%3YS2w)8EO~&Bf@yNktp;c{FBcbUcjvQQ+j=C@MwtSMv z0bCrrbJtk1UrSi3u}L?e>`-eUWB5;dmq^xXU8 zyU<=cNNg>myqqBxn^A_Dxu{g?>5JA;{rJMzfiKRiyc-1%bmY4-S!@$=cd|`~a3~Nf z6KM4>Wism5CPVBbZVcP3N+3MQ3L%gBdyCP;^4)vXKhpUq2!4erD@$&;jB?~xO6(Vn z41D~eH!C-5-t=#cBa%fS%Yh&QmJb*t^{)=pAdk=aR0&Rn+wlan%-25AvF@R<(&}vw ztt{Q+jr|uJV1pl`TWOI>ZCyRRt|RA9ggQ=rb6?#=Uzu7+JtP5DZE;x|_CC3O>t9V) zm`p@N0^$11*iNO1ug=tpyY9QN|H$_qT%ohtRQfpPsh2?N#iIt7^$zi6q|Y03ym_6Z z`xsFJ>Lu{el-TE+{r3d!S%r?H1}cWFk@M6E#1n7FvXeyk3&WL|ST`}9D03|)a-qd+ z)Zns6F~+uVxu`*I;`2Yc`6 za;D5aW_Xj?%6acM5k@$qD;%gd6u8VFsY!|v@Pyh7x7p?~h@kIkH5h(`xqEY49$zdI zi$Rfsr_7TnWU8F{M)D5}`%G z7mF^V?2^#}otVmWjb@H3;z*ni6R0X`u$5)NVUbkl3CBYc7S|2pAv!Hn1Xxrk^?_ec7Wtb!F2)#uqj*hHj`RF4A8`gNN2Wb>r~cxCOvy?NFc_65bEh`n^Fao zSZh&V`vs*l*t9~UCC(!k0FzZHC#bQhE@jaEODLmsOq{330+ia4${mSe%)^R@3w&s} z5a!~JVC&0E&7+^XkfmxiTII2C=da2qATd&{g6l|^(x8+H2$Of%OR{@pTBTAaVahGW zj11D>^<&Icu~IDevuo4R~LI2%f&owwTE8Xci<~~%WDt6w13z0`>T&TdhQq=zO&b5@3~`S zT?c&{P0&)SWUUuj5_k22fA8L{_U~g!ENiD{#HFN zi|knUv6ne-t^kTlbO`uW(cUY3U_IH&Hj1o;r;c;2J*5>+r1fH zr%k?A#Q$H0lD^QhPc^M9GqYot5=cew=Z8zOVkN2c$_Z_%3=A|D$|d%q`kX%+_2jSJ z4SsX%-pt|<7vp#j?4W$qj$=CwmtDoKVp-;8B=f&nQTt|QBjedD`i`2@K-lDk?y*+y zb#V;d&Bigvcgr{4-Bq-%Js{&TB*_yAMERkS>Y{;KdwzImWGI~PU%96#XGMdb+YcHn zr>3vi6Dl+pgoic^g$sy`mdTD>wK+p3k|-sBAz`K?)8K3LcpC#bd4Z-4byb^Mauj-_ zOe9lDWIDOPY%v@1Ds2AdKwfTP<2u~$44|+FC~Re88T4hHoK{>kkBY_@#xi)zhcZ0C zY*(;M1*OV^QrzSt|CufQ+GM)6K1qnrvxX6EUDKo`j;B zeQbQP-Q{ebTu<&x(fUrn$_%tCn~h`WL2KzndhKPgK66aR#OY-%;QpTbFQb5ckKXmcf$3Aw$*}8 z{UNli8g&I-K9K}f`~8xl%heLSLF%;ICE1q^lCrV9F~40*rP`68SCb7k`mn2PP;g~c z1s9!+H=nXo$&M5+>=^SP)bOlLVE=j?dOQN=nsZ%Yqn~3C4ZvIlS9JPKv6hctzg|sBo zz(zn~V(}cJg>oYf=g>l;F7`bkDbLia4RQhfXSwt}3WsxGA0>!=FA>h+5vR4<*j8RV z5JLPL@ea2~$cx=>Fc8P^fZ>T%k{Eu}564Ja*%%3q=v#JDO5T+r8AjWDI-xy zvcw97Mt<#ACL9?UpZgtUqt3JXY{Sc^%fC=g7UGp7B_e5Sj=Ee;iqs}GDUcgrTc|IN zBDWhGc$Mdr^?A=`+cP8HlBab#Z(B`7(n)t<5n0C?`+s65fi4WO?lBA{&-x*}=7Ux1 zF6dy2UJsPSb$PsoW~CROQwuums!}$oR;4sZYaU+Fva2hvcK1^oA2gJ%tgRkt^@*@h z^TwL?$u?(K{#&|UH5G*lx`x6X7$08%e7wf&MtP_Ptq2AVRozoX9`fGfC7B#;4mmC)7)nc# z0+FpWs`Z>hT2X01qqRH{QD{=cu7_q}ATs+UaS(x4n5| zZ3gl4y|3OLQo1U0_i?g9#AlikN@(`G1vO4Z$L%ld>-f~pMvXUI8r#2iL*tH- zLbA@X!a^2W3N87Lh`KHR86k^`_(TUg)4{UD`XR7IS$tf-zJ|xy1H1*1F$+oaO*I{Z zzV)Bp7^vI%aDPE>bE#3tkV=s(H@LR$_WNBen}gNsnhL~NKs+u{%fzOfEOp&2FYdeZ z8wV?t84jaVp_XRq9UjNU*M=V$_PM++zMP$@hCcHyFbB~-v@+=5GTgH*>M!d-8Bw=; zSQ8aAoE!E;CR-})b&;acwhl+jGiy3g29@0*>o7*BHkQ;_gwFoFE&#y!0NCa$diyPQ ziVLI;CumaL8Mcf3`3jdSZUWIuV?etAPddHJ6~`E*rPsAR(!Tm|yNz|>^fJa&(p}no zsuMO@E|IvE4a2pWIfX2`B(9plnnmbZj9i0XuT^>1e`>^5>CF;T_TJ9w%_m1@f1F%R zVeH@9p1W~)_CRtf=6#aPuI}-+t}2nrHIhud&239XvurUz1cJ!qL)zNxvnuWvpsBztZ&J+dn2~Kwkk*I zGvQ8U2ZLo#k`8roZz2&2Q_L3qT#+QnQbCAMK!f?X1?Uj)QF*69kEk^!9LHO=h!C#8 zJRy!h@DT_>9OEmsMy1NA5J=^*)5JqkAvcYQXF*kWSTZ47)IVqE(!ahp)gr%0ZV zFH*~6Uy51fia3Rs7nuok3=Id1(SfZisAy~13Yj4qs0plq&jF2V&A9`;_EnL#BW!2 zrI3P-hdts7GO0msnttRett!87UpTz0Bjj)H#gXo!tfb1Gn~X;Yrm}qjC1VTXu*fB2Yn6y-^|& z@g3o*5z=Bb;^6(N#tk)@ma;By-P+2VBp>Lk?I5>r1KPO2%RUg4l;vo2sAGT8i6XK9 zRQZcK)LDQRe^zTz=l=W?`DBhl3kPg55kjp|O9~Z61t}1lE26UEJOhn<=hT(9khsEa zre%2%LtAk~*2!?1{VE%Z!iy916-mA38S=n48H-BQ>@ZH|y^-VyV`)+bEtYEJ3aymi z`uN(7r&i?@ZG3RJ_hdstza415w*zZ4tlb<>VXp3NbJcB7pXT8tJ_ zu$jM~PpZ|n{By`dc#7$Bwvzm(X*$CPx*a$>Cxcr*zq6uh=M%%59~|=BLY=y^ zX-kWXBKZz;|H%!-IAYSq)>=Gxt7u z1f*#-stdXUR)M5dr%-@D>qitaNB#0VBCpO#I7N}t7LzOD4_iAFVK!P(gf-aEg`vPK zzy&bc7R(!@4#s5Qaef4Hvj*f53I>osXDi6ct8~cU=8Ir#N#6!{hYh`-l!2`(=AX=N z9&gSL+Cb7U7MW5+!-z0f4K-}%#>lmACx}W_a06q@@QHqxR4!I%fvO(R7Dnjb7&?g7 z1&j0Yv<_diLbPrw+N0H0Y(9sYYAZy$rqnHx-(6E;PxDPi>`*uvhtxgkHO!WvvC78vXW8GQ}J-z}mQ z>ADeRH-1E3xt?!E@YNLp8V0LWuY-}j@AwEOmFQ{Uj}53JnA_5l-RFpUCAw&TwklhN zDgs_XWKBz7ctxZxWY_s372({Dj1CDam*N!1!s$Zb0;YI?oivD#(RpltB2wArtLbTx zSfIz)YkZpcd;`6*y>0`&$90)etI zO>|9GR--sNQBW4`Y-t=*8x@i9w&9RF($`Yf80iexbQFY*aT|GF>R}uCQhaxN?qjd*av@XaU=g zf^F4s^5mvRMx#@GeYKsdqMIJwR2;39)NX>$lqYIAym#u6@Pm=#q0v=Sk;CC_9YYG(nch%mhhaoAyAXR&hxjRniPy9*9lqxnPmI{;1j@TsswkE|<* zHr7-e49gj&ac^W(%ewGjBpfQRRzw=ZfsO>ylCm9y&!q(F5^notb|fr#EG$w;O1ISPhWKi8S8J1&K$#uG6 zDJpS#;$@)HB-#)xX=?J-wnqE4FYz2v-*zAWWu*^3{q~oP>j(SGBcm;?{gL(Iu8!Jp zUI))1$-=rfl$at&ItNKP#Y(B!qN_<6wQvOo7YWfW5oq~1N`$Jz(jJFEG$y6esKg$%9qsS;*4mMzy_Un24$STe-&(RE6k8vI`a zH6BC9gDrQx{J`*V)%NOWtH+~r`l3}ksvdsnPH|LsNLK})R?$nSx1;q=F>@+>EM$r7 zZrL8*5*Z9t`&uKt;f9Wq4rf@I)aS`DR96?*>GR42NVHI$_?B6P^RX4i(nBjnSuJ7; z{;wBOjU8PnRJ&=7v1q(;S}H+Q_Dtfafa4g2K!Q2uA*pETpxMW=aF-Z{3$)de92MsT z>M(FZH!2TiSuFODDB5kbM=Jup_K-SK*J9_)Ut^d_h{&W?c`H8LoS)n%qYmGA$Sh@j zC9um{Uz$&7WW^=a3vAqXZLp}X&+oHX#DIwrpRamC96d1XkA{NPy8$ViTZY4HBOM{X zy*d&Kmv*FJXP*0$DB{dnK$KGTk&yNAnVfkcfiQ|grtTARGT_>sVsG6fu0JlTa$NZy z{U94vSrN<&wnfM6c2qnzCJ7A&P*kUobVY_cgW*89vQk$N$!KXql87$MV*`Vj0D$Sb zI!;9Z4K833s1j>qZ-~~^2vY*F9~${3T9%3^IT|wnlPLixyMmZWuxldBTh)~e^YY~x zt~?D6^HQD5#GK?(jJnhi)!T`ww725{-Jfhp1a!3~xm3tF!c!e&fWs&|xAY*|9}L#k zn!3zU_quh`9kQrth3U{8QR#%#1RwXUsLrwBZXmG zho^lPJF}8#s;ktyh8vxtn3a2@%6-DSU^cF9Kuj-si?p4h**co%8iH=vW~FSmdS3O z+W57Hjj@NRBh-0Ri@MM-nh74wEvYCWC50Js;NNSBv_z^mVq-wgLB^szZ$6paO({eu*;1>k=W-~uffZu48IlN1%dz z{{_3agNsa-JSPj^T1U zWmJ5NI--(2kY_7gbELgyr$u85SN^$nqSs%z<*CVSj}ChjwnA&b@6XP(7Og(g=5Ed; z#7g>4lWE;jAjT-sA?8s5Gp_FoRKS@h^#{kuY0)U6ph&scfq!M^-#qoz39RZNP= ztg4lj)jRtNo%MqOdu@5K+0>R-JM40;sp~k@Um)b0V*j>fucNltJG#eF(=)rNAw&r? zihKq7whmiq2>UYIfrhsM4QoIj*9NnTvbv*4CPSffIhm-pJX}=UokiR0BL!{k5qqa0 z!fo0O8x^6Npv&be^@V&C@+o|zpv6OkRD?KMl&6ViH6oB{E6V&U%f3-;Am1w?~y-kZ;3~Y!P)&;{HUTKidYp zZR2oBWKmz^o)L(O;2ATwNhi_)fMYsZfXXB-5;ICf!YCO(d^L*96>N zN0hokE)rNiq>g4~6^Wvj?iJl6>L$8t-O(aNq`l1%sc)+d6_keyI*chOjxPzXcxz|~ zKZA3%f|a=OdBPiwi{%E2HojslP6;N;jTafCFKiFg-PXy4R%MKV-Aoxi+`{*+`s!lvBf7LOW6SVvM?06vRQeK42utNo-v z=fhHiDpiG4WFBBn9L4Yc%fjL!&*(_TqOr1KIZ?skXZ_7c4DE+YjChwH`!I>Ipj)iK zAlX$=7oj(JrT@BMaI5o>liY0EZzDIG_nXPB`a^p1ZWVD_N$`{>l%zmPoD>j3{ylt> zPZ0vmIs6{TtaG9qV?^F&e}veF ziZ;-1uR(wCinegjyS3_26**W%Z1o<(i`oc=B5b9i>lU+x6)Too%(ieX+Y*(k%0QKfRYN!})bu_njdD`!3Z{Ad!N&Ir}%i ziWFGHo@id+oVL~(7T0(zw89%PwUtK{omkB;Sn;sLI=&L+&8zmrU|mv^E96UQ^4Rl9 zb@J{_D{po*l4sc!oz9@zC65k6ok{eJr_CkTTEp576c z$?$nXgVm)s7gyA|7LPS|Lv=-#G}~>F&|tev%C%CyP$bj``fFxCd;Ms8pd#d!Q3A1$ zFJ_;)9GLqZ`E_V>7;O&L-rah-l{C2sv5U}>1Wgk4(+)>bk;ELuhf3PKkuuRU%8|0E zGO}A4f6GDyzha?H7w1^$-=bxQoU$wOU0uk&H~o$U^6UQ9N7{Y;O+K9ncSW36x2nS1 zQEthp?_1SZpW|rX*PY#1mZRlU>^l|&*5X#5uf?m+Y3N_o-vGm`eoL!Mt~Y72jQIUk z8MX{fPF-GJrN?H^tM0Gzt!>3dn?fv6N+fC-UuV+ka!RfF)%n@kxs^R}95H>&1bPS^ z2{x5akFAT=PemQM>RaxL%8l}g`mwQkwOp>Qr#f##owtN7k$s`^b=yMi&-8lXvnuek zYg^l@NT~BJdBhmLClX(sS;Q{NQpQ8NoZf<=enG{$3`IT_H?NN0PZ3`eo>C<`L? zaHce(4;RLx1y?WOLB4+I0;ZyGC~%csck6L3wS4YIBp}z$JM?#R1h{*FE3T9->xy%T zyMYtU_Lu$@gWqS_7tHUiuP+)6M7uIv(IQlo4Ik-X*JybCdS1ZQ6&VbdML;liWQ27Q zUQ1jz;g|@Hh7dk(Z2-rwT&x?U+rk(|TrMvY{JZfI!vv0~Dtq&mW@~+RB6Q&^W&;!{ zO9i+YBS8vQmPa9VZhmnS8+y=4mRSn5Or&Wsj_2kuPN~-!3+W=h2rR`Xoh1IN2kEPb zn45d4wLwmGdy3<{M!f*MR*#=$^VKV&o~$g7JW7>#>ca|8q^cyWi8woj-0HteAS?(U zJ3EK{U3St(r~Nnxyj!nG#)Tv|i6p(|+Wj9H74bgOFVg>j#!!FI>#LVVJzaxQX@fKa zKB&agkGjJ3;i@WYtG|_O9h7+@C1DkGdR<}^VgAC;F<`&r0uE}X@Yv!Qo9?=We@pd$ z{+V>;Qsa$&k*DC|l2ztdRtkCuiYGTamqrlrF82gG9+GU(`TeT-<*YCyWl~WbM=7Wi zOJ!1tWI5y!`~<#Z|F!hE2Kri3Hyip47%VYH{LA68^JmLMQsZgJd*d~E42I56t0u}VIC zZR9ee;3fx0Dt+gppPcmI8CmJ^5+^XDk z8yeasqs(2=hC&o|n)@Q7ovj_U;li-TV=ecWljSRrIpPe{5pCQ6i4QJz?tq*8XNk_e z6OWxd_~`mVddtZX(w+>({cHa=>~xd!;VS~=&b?2qgTCaWRl!oL zLZWQVvl90xh{FmZM?sw65&L+An@1>YmU9;Eq?Xj$csBbvw8BQ%a>6#TDJ2?b?};7N4~ok#jt`jD+onBo`lO+Po*g=BiO>z(ahJkqYJ!Nq$Elm@S=0D__RUW0lY6u)1(7 zj$<$IQ4ZkPhc*UFPxt@>#7RA&)f3t042~%G8Z*6Ea!x1qA-i2HI)~)qVKFJr4deHj zC6`ddpMvE$3FFSdJ_?(BVK|4nl&4{-rJjXNc@owlAY_?3tx+zd|MW*%s4!~qo2!LH zUhL-rLY@VCWCHq^zoi9Iy#~M2Oc;CDEm4XY_958Au@hJnFk+>I_!{v%)N@ameva74 zzPd!Dl*U%!-si?1rq)C69jG_x-)cN$B#CoYAt4mXkjWf%m_#PSIiKuS87Y&ShE1fv zWCaeJtUV+-MC=ciM*oRYNw4>uj0Y-T_ zX|$BJoR_#8E)E1E}|4jBSHxOhm!hB^VEtwk_@-$k9t&pE^2yZAkB?91qqcu$EB@i^qOognpaN87rp zJ5J<jDFL81Hh8gc&dBDafsKC}r8@p4{FN%sLp) zt^Oi!*LYQE*NVK{9HNTm(-Z|ivDJZqqq5DF+gauCRpDNAK`++B$Z#SrDi3CQ>9b~~ z((F2m%rs4%@p=upXRN!_XJo=NhB)rI=V-wTNI0DFw{9dKuhMB3&}9DMDssJ17Q0hj z&|2cCEwYIOe7U>8>o+{`psQtbed9fPVO) z=E=_7oaUioX;+^qztYA^TJj3<5-$^#VhX5KNTxfR=gJnG@$bw&qdSu~nXyMU$@(x? zxfL+8MHl85ttLYbx~0};mCmoeAYOt7QH6%+51>j3xFr~|D< z>wuEk)=z)*ZTyvI>I?tN>&pPST6_YtVXSA)Sy{C4r?R48okY;5Q`)NgiyT3X zSnjbu?gw!ZOb>5RjX}zu^skolCk6)bDhczC+3TNvNN7t z*%SIb%$~%wc*VlkFmWQ#b>k^y2q1kOT$vtq163O|=EKC82Tu0Zr8 z(&35fsf-C_0&Q`uy%m3VTvCTnOQ5W5euA2>*6GL)=eNj&^wq_9`wlIVYvl^9j3&>#bIv%?OJrn+aPzptuc~%*6fk1796LW1)vop=18OodRDpHg_I`b4vCpfo==5ur zXTrtXq*){ui&~4lm4#V3Cb6TYr#!(GFdB{z~}XWY9Sdh1l8xAEy>ZnpRa z{haR?9!2Ac9@W<6^b{mEG#MsMV7RcdXWVcgN09$BvNA*|w{_Wm}7VLYdcG>a6ULf{iS}gr@-C5 zqq$*ccYbdB_Et}4Wwy1v%UjS{VI60!F_7x_L0hmjRv0u}{Gzj3u*S656chP<7Md|n zDfTA~GVCH=UBVz+G?tQhyWSwHTVG@Hdh!ejHo!)`SywzaM>eR7w(n(Wi;R@eHGqSpc6SCOWNw7iLn&RN7nnONHxu7s{Q!GVnQcPyvnJ7J{ttU^0v=a! z<%{2?Z!h=uzOU-ryVPp6mX=y-tu3|oeX%6Vk{2zl#nxsm-Y~{E!G=Hr7z1(!nGhf> zAt3||flMX~WH1EmER)O<$RqRqnLK8Om&r^r$s@S^s_NcuwPe{ic{B5U^Zn&xbywHD zx9ZfXQ|J6@xmCXXPK7RGUbnb51AF;3^>t=oIW^|CX~y3K{b7Mvsx)YncBjvn-WE;S zKDS2UG>8Sb;2o)2Dg>5FYRPdV9$K%*9gZw;k66f{w?pcQH}UrXkLVPd$STVQ0#ef| zCiOp^-#miLA-B0)O?;EPZ| zTLD}PHDpIyqS+bYwp?4j#|S#QK*mC?BgmHIp)2H4W>vtzD3kyP(MpC=YLuBdcDKpk zt15Cwvh)(EjMgdvl%`}#S+33HGwa;tXlxRc?osOVSON6Rn9J^4)hHPIoNvX%tZ3%4 z5yFR4WN6j+YnNYpHx1)&1ZL~N8wC3>4u4cA)>$&-L+uDcRIScqEaQIq)kAVf0xK=USs>&rHv*r!+>>9*R z?QF6Mz)u^-)2|!FBlc;nay2c;kLN?gkU|yJ-tJ(M?H^lf1MupDyTPd)_En8T>~O7$91fXzUbcwMbJiMeuJ-QQZgB7&A>f~rgH53S zv3{(HFat(}1o=8CRvI-LvrxN8G}2+v5tIwZmu?G)uC0FX~m+73T@S@NE@Edt#Xe4O;P};_#_^w^5v>-XB(8`1)`3xaam^E6nN{ru(6N`jcWzuL( zpt#R~&Z11q755H;IDreL5dVV~^J#)Oj*H}6;U$b@t?>Ar43k)16NN-7Stp8AJ*Ixa z8VrCMEJgeN*GFB>b4K@SYP9T}p2=nCbC`?Cns+gjZC;gfzepYPJmLmfe+~frE*}Qs0lkK z7So1RhhC!Bo}=~Fd7VTtFIglHU{zP|Rfr54KjKwPriQyT$^GrLB0NB_tWqz<1?}%q z4B9bSL_R^BMQ7@03;@!}XbEKGJi$s86112x(M;gygD0%j60gpV8~!ZNyTv|5(I zq?qbO?7UDy!k6%W_BNjTL26WrTM>)rC0D>EzAw1QFL+J70DUQ)1Fohpz?1T|8|Ug61lQ2?$|$*6t1-%j zGLg!*_V%ewCBn@@uJsB@1Fet}a*gs+b}fnMQ>eyK9y9T6~~1Ec`a6fpuiLwbcmFB1s0AQe<4I zBW@GC&87V|gT0+f``t~_K0~7PbTR>n|4JZHfZmQlN(vsLr6Pi26f_luA&@Bz({9Eu z5Sc^(Q(*EJFcI^Z07FLr@FP8(j-Y|sOrIeMfZJsN&iT-$(_5{2N~*bX1+=Pu zkjmEy5xIb2*xeX@<-^2%8XVYyN%C*PDQ6R(@i zMzh%p_uD^{_#*xebvx#QyTF>C#gxwq$*=0{%xzc|DEj4}Ai?57fGE|5)Vx5DL`{?v z1^&13J)?UBxJ0XxY7{gX?uppgvYrsI={l7{!{F4!TZwHy`f;M~l0+sE5CCG1egAKM zwtxT6{`QCC06KtLM04J9KCl1i#kYQg{>!@cH_GfiwnqvhpqWlT3aH8b2L|9!^ zNcfW0SFgq|*&^LxP&FEjn(GBL96-A_OJ!qCw9uRPrYI>-_2+3pEPVoB_ z_T5B>p!VV1a%R zsJu+cpaUA=^dj6-nmqLcP0|LXOe3eMza#_%P6F%%IG8~v)&#Li*dNkg3V8rwksmND z8?n4mqSBMX;E*!%hLGF16^?_dBDtIF-pao$1q|YbeNBb@0t7-tp>3iM0c$R~TnDF` zAY*t=$7r#}T-+0>o@y^(D1hPs_*ItnPFHmt>knFD3;l`T61`%;c37&Fi-iC>DGX}4 z5XWNs23p;4(#MtUf_R=$%NV7{ZSpnG)D?~GJJ|S+SdMm=9!Mm}aZtt`SYy-^y42a5 z*;$j>*_l~G%59f0xu!x>VJvy0r8juN>7-hQjBfx-{{cF1BckLMiJ}f5w?G3Rrw^|2 z&J)_XJT-5XjM+>Sx(t#WkIXzWS-aR@0uQ)^&W2mcfI-Wb|VF z{?2S$q`$N>-daGz&31v!)RlIRmkxZQ&+mxtEU((%o4?$3$5_O`+G$2DI-iFbNoX&EmC)-0w^(tDakZQb6L*BNewD>M4C+Izb35crLyXg2jcsR*J5;+5nzmUihC`}H%!EKbitJEb<5|@8RFoa!0kRZUa z9NV^S+qP}nwr$(CZF|R_*|BZo?LYk6i+B-@OGTZ!qocC3GDF2KyC+}1=(tSO$`zN6 zAU%#k00Iu;#b}R?#OH#$ZaRY!dx5a$Pao>h`g0-46=;=Ijm-qj0+*d2lbg_`q$}^R z196`~Q}NVXtQJXIBfVd=zU_1dva=#|xO2d7B4!88n%LdmA{Qn!#0$lO)b_lLlCK*} z`+)4{$lW%B@xnK4TCyR5E}F!0A-J)b(D8C-ey94x&7x4bipT6qR+thOtX$gh&MNb3 zTp=g|Cu99hTBDD&G6Q8}peK?NlN-WrLhP*-*yiWz$HR&jDmRB)-ItT@&zzpxC@2AX zlX&d)IO1Wv9V0RNE)!H8C9T+`g#`d$2ca?k(QxS~3%Ai(idiM6!A%;hPr<)3eYR(o zKGfMjzUW3T^nS_Xo0PJAZ-bYj+VFSN7*FJ-pA*z9+j^7MUZ^=w&LZMp*FB(p7 zI3wj!5i`|ih#gy{BCeI&C1)z{fkrWl;ZR8 zAXU*#c;YyU#r^n-%QNAr6XS!kzQa=kmKSO`-4CMAOxt}F4P;CWr4IpvNgq+r`EBr5 zE8wVM`2$U(=jTr{?C|u_;YZNTaQyXSt5~oVq>e4&i>ga_86M6oacwJZaA7AiaGt?e z;%F%URUx@MXAEI2&N zjmOh(_wlSfJ`_6qOjz|xs~P&hy|%*e?pM43$`QNsE1&Pv34P4R{_6sL%zM1{1>E%o z_wp4(@h#eTECH0q<~=ZgB8Z^AcDAcxY9SCV7OL5Dh3-Ag3g}LJKXikr)y5kbKAw|J z5c7PJ?gJnpEvjA~I#WwRl7wi7FYj3bHKqs0cz?7BQk6hm;1VAeCl6{g%_fYm4-3VC zoIeMgM<4P;14>?MS%1nUPzdUGz``k%to>Vfim2q6r-Kc@0M58TWSj6vqJL%Y_!i!CTf2902@VILXJ(a5DSZFJGIGa2lgd)U zPrMM$K0l%Z4t3to*Up)bf2EE{B9oZXcE3h`2=;g=lNbp|hOs}Aok~pWak1_RAWm|c z%Zv)?zL<@_{LO-`du;j{^OcjBp@P|2Zsx3YAgp_vHbE#ZJ}9wkca61yu*Nzs@Mb); z#)Z2_O(HsLnKA4p<5@EZJp{oz02}vHxiIVlZtRER&4g6u-9s~k6~rh?A$o;J#XUs; z*6s*0(%0)hpCbWU;VrkQVJt;%0BitbhX5sG5QyR@pp%hN07Wpj8p0{vyHfd(f;G9A zPO>x?sCr0NxfQ(cMU(fZwgjL(!S&t3=4^89-votUWlu$M*vF{qu6zo7Q3Po z1K4{3h_ygFA;k!kkh@RlyJkS1oOb~-z=pBhf#Kx##E>_FKy!87B(2&-A^@%|Df**h zMLhs^tEIg$u!h8!v@@^~!XCttd!BfXsU-yQHk=4^Sm*6-Y6!-01&fm>w>d}WV~_zH zT$~e&KC}}9jLM)s#$`rWmv>1QF4TA~7Xa5Yif8OGYysR#Mf``!KLX)e&bSkUSTbxb zC!~;Ghy6tTF$m&}s{y|3AC=q}bF2KS@_9AB1uxL8CcdirsP`tEer-7Yy*T!CTZ&>n zgb};=BXef_sj@8HZXFRu)OF2XH6a60*-x5YL92&`pgRPY>4>C8+a$9{$T1l7VbLMI zAcBY;9QL>sl$|3$n#(#x*t$_g>{L`0H~@ARi`BXO7v85}A;~{!cU}JY;J!)Cw(7?D z^yLlmYfRz3Zh}|M#CvtP#|`ie7N+6$l7;!C0e%;{@H_rl zR*gdyoT2_a^Ab9D;(@>j@5vYu+#qR}2KwmWwb{3*I-sO#2nd_mD{83A5e4pPCaP|y zzyvAsVzaU&h6R%v|gmu2MSP6O=oLWimF_vwM|l5zDMY%%pc z-F`lzF3)dM(?+B?6lxJa0Od%Kff^Cfqg1VFf#KuUBHMRS5j~eJAqG!SnNn1UJaD?w zPO}amEK;=u0ja~A^0D<_2(k4#5a*$T_bm&l6XP*;DEj6uq9EXItw4<`KJS8Bg9<>6 zG7oZF8kK`MRkJYm2=9#o`qVT_F_N3V~n*J8ltw0>Ii1xmtvyXG2Ct;ZD%xMQ) z2H|}DVjfjMAHK$;z_FePPs=aK6xel8aVZ@-v|ritQlv;BIONjp=-w`YW($c5KMNKr zfW%}7l)$vZoV3!ld2SrE9&$e>b`skg02+V`DJtU$KPZX^ z%GfK~F`w)vm~f;>Z6TI(E@uafhS-?NohuMExT770X+(L0mJ-?5 zN1K3k%N?{d$P0w-M&2bsf_~%m7%_N<&8h&#?+=WoKH_SPB8zi;tZF%X$WW*vOr!S) zwR%X^FGh~FZaAo5ZGyW_=|QXrX~n@{E?ap}6)=A+zVA_wuN25VZKothYJC6fcJ8Wf z#w29#m;RLEhQ@kj>%i-pJ2I?=%3ZY?@FxI*g{Sg2s^7L~yaeNCMjG<|;Oiu&P_-mQ z0+7N?RjFXB;9Urum&rj%0OS7YSfByYP_0soK;9jd#DRC26`*!InyR0qn>T|F_ycD8 zhw2bap3Z3TF4RClc;i~}74(k>%lXn9?Q7Ds$l@Bep8w29H{5^=XxPm*>eiOxfl5{L z<=8DogG#CiwI~PhJ<*#p(Ut{3L{UjuQAIs6gsI7wsu(bbJ_#1Ypt; z%Lo;-4eGP*n>ehmn1AK8qEdqWWWGeix9VspW?a;wQg=1exXqmS6lFr z=^o^i4zLuASsXx+!v2s(^wKowD#y8#L&_j)q6nc=Tq64tD z%z)%i7$Ugdfqv`BdKFi;{)PG6`KTU+i|j$E4q)VOgAaWWZfSxW3fyKrNMKB9N|E+iDiP-H!KkzwWP)b$-_^Y*xlK2p7)8jPkP{#f9=J6#{_IOHi0ZX9f9&Z*H5+ z>IQe)*-dg3!P{0}aV1*UV^l@Jpys%alN_$NzS{OZtcZb*q% z@9JY`boUh7UofnedJ0@UDX^)H`N#w-IukN zE2lUaI?!?Ns@PTJd#9d=ja`IpgHr@w_2rtJzmd73aF7J-LIaqEYDbB|vAIwBw4W8X zcXzMmZT6d6?CQ-Oo%2wPi5e`?`y}eSk}Dor)YWa5dpilL7rKDC2LzC*gqGXct!t*R z^uG0?{>a7gIysdI?k4mMh2oOllv$bSKNV-$C__VBHQ!s++8?!Wl8(xIlU~WU)7bMO zcthr^{C6e!7gb!3tLf`XspRTTS{y#$_HZyz+gnWDtvd*Ke9%2Un#1j5ZSLya_rX2i zf3JP6$o^zTe;0G>XCU3#W8K^WI_{lz;?=3#_3mr#` z|LdQ^j{~yw><@6IiczUz_K#|x`-iTWDpDZsvbq6yt2m~oXa{X?@W*}e-P%pDT@#Q1 zlUIR|@xQKDHNMp(dcZPe0GzC*67MRPyXClmx|@+Jeneacl4g-A<%m$G`9G^vsYu%# z@9X5{j}IT!zI8O|5><&zRGljOZrQ`a;l`=#e?L=4cO&O5z5wn54+~OsxKRy$`OAjc~=~`arHmX=~W^?NCZ!JZKGq>@Z;)nt)V6kyP$jCD(}2Y zs^`tWZyIaY#-v>^;W>(Dscgl}msyARUs{ljQiTdlcGe$9{ z-LVGZ9ZnbZ#h*`qq02%dpMLha+`KeG)Xr1AQySJbozB+#&ZIav$zi0Z1e+Rz7xgM< zhBHU@_7U?HEwuj?AJLtrBeK(OLxgSf!){#j7?J2H8IvEZWp!+X$xpybLDCQIwmxvM z{{v_gMbJ_|1k1LeejWhoK_fq9Ov=8#-RXGclYFl#m<5fTunTkZxkx)5Kjs|dz5nVl z>j;{y-`?x-RK``@>{(fER>B7%u#8*o|F})zqW}7X=Id|ylxWONZNts~neJVP|JW{v z*U8Iy3B#j_&^H`n>PtRsHxlaxW}ZT&Q>y4cypmh$lj%;>P~P%r>#}pO_4}?o2Xt%J zcMI>mzs$`481uE;X31b}5rV(C=U*ki-Pwltgujo;E~g+ZmQKz3 z@({RK)tClEiDM3CyQt7(+mrDalb`W!UiA2pmzZ6eMrEp0yJWg~hWQFC%NxdXXuDub z{)vA^p7wbU?AuWR&%f?jl}uqb%3Iq}pt>bhgL2@GF^2^S9QluHSN->F0QOyx#)FA*Dv%C=fLV0#I<{A?J~Wp1cK7QeH@2g6i@yzXzRJaZG_414?>Z2J z_q$3^z}3M^d-0Vm4i*?6+nB+$_e&{r&jk6^s?`=vM90qk7G&4>-+|eXzo?#2Z#n;T z4>unSMv+nJRTES|e+=G{kLgpB-J9NW&At*a(UCmv+fSL}&5^dx80WL7K2R-w^&wM$ z#&b@$4|Ck1=1bnqZa6s&VO}}D4Gte#_$_~WB;>vkA5Y&dMo!I$v63ap0{^=D0rfs} zA)gJvKQRAW`XU{hNAQ#6iGE{j*)pbX*PLoK4WiN{>(2c&fpeC_nFk5<{m3wmKGDYh zi2Ow9?0?_Nw7i=@;>~H!5{7Vk@HF6b&AqylOU7w&b zCz_5a<82{F_sujF-A(_bbj#tweQ9kj4(eK?K8?#7h9xs+1jbF#w1U_s+)&@r^#o$h zu=f9MUjC+3M#AQb86OJY57SryukH;s(;>au* zx4NSLTl13eg3ON%!?mMQ)+{)Ai)N4bj=_nO;VWJ`6^RA=%a%n6diUUsE9WItxN+oM z5Rot}dZ83)kVp=R!^aiqXxEoi1_sD8gwbB5m^b}!!qK2GoHVRCGrTm^e3BT$e;Ws! z7=eBWHn~5W-agp5f22Sq4I&coC-Bel{h}BB63TSVlxg5Bq+}sgbIGbUqlR7b@e|ul zOgzKG+yxDg7G#IY#7KM!3`?3el(nl^t^(9{hN9{6Bra*~M%_nWWmhoT(+Nw(AGHBr z?kn}AOEL3`%L%=<;jG(uR^X**5F$v1hc63R8SP|8AP`Xml$Hf7Cjbaj zn}5?Z^-~I|u4vsSmZ=g!07P0vi`Pb|a6;``70S|vUV*ZW3!Q2utC<&}DmAR;Cu$45 z{GD~=654{WSdz2Fd1RN%p5xUOe?3%hnZf2B_&yPQms&r@*}F_)J+cyW5sGpTN>vV= z9g=nD^Goi4l&YGoT-`7kkTs7oX0QqyVS<(1MJPj2*XPX^VzczA$$DX=AmC-Bjy(tl%17|xksI|@vL4c5) z=-J+@AHSaotNH4Q5B@M$9%0e;fve@nq`g_Y=2bdYttO)5);UTYQEAbvOpri{RV-7e z?o8pxuUDc}yL!k}BTBBsthz-G;2!gyT?N@3;1y&F(m?&|!s8Rij&-@=jG@!H|D-(C zT-kr9o*sR#WLa{4=D98-J|5xy=b$2ct*nZsDQ5WT5=?hyj>%~AMwCp>UtCnb9>o2x z__?BFzE$^{0xrCk>+PSyuehsh66U`A-cQ`>h9Y};Qt1*D2U|vAzz1TaowdTDTW#90 z@UJYVQMPAn8Jm_R_8_x(Zap-sVu!(!Hja}_y$P`xw<4v#e#J%>si;>}z3v3}DMMiFH4l}{07@-`gr z^YT_~!LlG>w|hr z=r_{8^p-IHg&go4jTwT<{<)vxHVY(a=ZNkA2!+W|{-7)AXn_Jm-r#BmIh<`~A7tG0c>C7b(ZtX7N2 zJG<^-YtxctYCU$DHBL>-Y-KO%W|pa5J5BWpI<4c>(|3Jx{l3vV?uBK)iAaUTv#7$Q za@?S96VC!C9#ePbW(NYlE1z@XIE5La?6ay}p}pidWmdha#9`VmQI|aY2Ma%)iUcSp zh(lC{8uLsBg)*lI2PM%cHAa!zB0w1eha3cDgp!c}$e{3(G;Are zeF928d3+5Rb++;sQ6e;DG18RLr!W&K`t}Z;`}mm9-LXvaUsX?<;QcUt6?z?NmfBzG zf%7_@0l)w?P(8^4m3h`tPorW0okGznWsqV*)hbkNw70+$XQ3;;6M%W4I+*G|><{~P zI|Nqb$!U(YwH;e}GbZLvNy(Z!SRyK_=~-@UYpYp)J73u7N-1hR%%2~m$ew8;Ugu%+K^?UuSJ{rH!uP=uzcMok}-MZBbIXU%uzD zx&C}cJW1muB4B~a#414kzIaPip_+8D{&9tm`;8vAVLx0|^exe!ko7ARbY1VB&hMoP) z`B>Akcr@?d0a%1* zmakuVKwcCK_l%(g^t4`6GvgitdcScujdzTidw8r}<5S~r0x=My>jp4k`j|Zr%1x7RPTjfpmYJF+x`J26f@;5cOU}!jb-jraqM+o?7 z2}Gzm9W+1^;Yhkn8JHIS0MtO=yYW;H#4gz?Av`Gv(vel8?v_kb7sNTAThMIR#w5b zqq1KCBo+C_Vlz>&V$FflP4i04E~=$WS&Y>pCTO)r8Iv|_nzYnN$#Nv6mYp{#K8Z)} z5kjBFgTw8@9hB@SOecDM@5|QpmCGI_1hg>i(FYAJbA&;#Q`#}kTMAJ+CBbjJwUf(O zrb0!G_wQVRJJ-t09hps@-)x5De)KnFd@U3EQ_c21xrL}^2jEVP8avq?m_&JW2i_x( z%k+Z&r2J6pBR!`kVa;j}HuF#v(~U)ayq7f|k@__=_IjY$JnmHy3N8C0>>a7Li?L@( z;}U0)|A?ZJYNFsD7j%%r4$3}%}2N0~`Qef48+i@u@D4nE8jF`$+qDIAn zsaTwD>v*Y^N0n+N$rjIpz_JH-JC}WaHG@YB!jkv}zcNx3ZjG$=C;?u^W-Vu`kq)E2 zNeg-u9#sqo{ z=275wSy6ItCOW^)f)$Ji^o!t+tb=cJtZ1r*dKKu#L$XktGga#63A~*M|FHGJHp17h zS&-+tQVc2%$kK5@Meqq5VKD{m{*fq^Ik4`~gm)O^-?Ifnnm*xJz=FxzHNjSi^cV5@ z3ZMY@$=Kgif+Rz&G19UE9bk7F^-zj*>p$cSFz3GKelIBI1Hh-U3}(CcZl&bDhlL!Lh=>jVrU+y^kUbE-@HZUQuw(%qzN*$LR;)_R zo2Jtugh(_Mt$&SDd$3cl^+;C=Qn-&3O67v4l$Gz0C5txbJ~jbfN48zhRH`TETaNsD z{9WqmT&o#4yJ4kYeyK`8l#`f^N%j?4mDubpJ!Q_{P5n>sG64;;vJ|I)s`D>&W7=pO zP3y(&H(2dh!ds(^e5Nfa@+-`hkAb~NA^V~bEd8HX0q!>Az6vs9RSSf3b<_{k#E8ZU zc|;fl^9rgF@9v=fpsh=z9FQeZNKSVW;1O?yq)6mDzYAH^=JlpG?Z?xU);Emb7$>g zOfJaMRqbUYF(K_oUlF#MTzhQ8gm$DQam#lqvLgA(_Y;7%iCSx52@Oz@^@I*-LouK! z#sm?#`6uZL8gC9uh!%nI?*cWKA62PVtEU{3P$(s9-b!5)w8+ucYw*so*|jL>YuVF( z+Da`KfiFtPiy?{<{`Ew_-->Ys|2Jg8JDp^yuWSj0X4*wB3RwQVk`(-oIpH^6uhG4lJXVVp?92sXwE@rpn1sBp4nQu> z(JiFlG8Xksl4CYG#}2ZuQRm%8#yw*)UyD@My#B;KRH&w@LZ=}d9vBIf&^T6=yWZj> zd24V{kLAAStD0<&(E=>Z+eNlaf{qx$=4K$tM0~I$z~n{?`lf1>tm7a5n426W8*47= zXT$BlFX^0_}&aCEZ` z)TQusFD8iewzaCIzgo=bd!?nAVeeyna9BTIVip4XHTv`8(n)vc|Q)!TjWJY zf6PGOJF`{GL+@1i+*GJZH!V@~%Jzh3`msiz6>E3rfS#>=ep#85FmC*z3&q%h;kYS&bOHN_XP1=w0HHHQesyfIf=?Qweg}};@-qZ&7-}hm`(u}qg=I`#jKXr z)J@V~eFw8uU#mjVB87WT4VS#+#4|XKm;w@msXtkz7KR8}62H;oK zU@KK4PEu}C-9&qBLvmTGM-7Db$@B9cS)m^c^Uf8meudoNC+ywk9#}ru6ZC&t&AhV8 zu*&0_c9%(hlu=%UXaMh+@98OSb1LALF4V5w8r7WR3|mf=wUqp#bYyUKKnEBr znuB!g>~;KXHlTm>UGwJU0bW)#RRLsnG{voft$I}?zCQ9H3YQC3uq={@{3y|pQ$(JK z`0j&5!N`s2=@Hx^Nl^gBSpn5K1FFjb)cI=oE?R26c<~y~a^}d}a+IxEj35PGjjB~` zP^WW0ltXwR;r4!d3Fq?#eNKQxq3;1_X=`yqK-|4_$6F$n5#%j_wTg8_{JybEH0+k& zR;Kj7R4Qiy9gQBo9!n&u*4|pD`aknWyrDW;`SeoW@JP`RpqTN-!2$Zf9V7Giihz$eSfw5y zmUj`L!lR=VgyQitTqY|2{Oapf?Ri;5r4sHwG_A%e01zJ)h-te?f zomRPalBJFsxMNcH+=?_DP@WiZGw!o9;OIw9JaEl`cTx0Wapu7ClfCvCJ%>aaON~nI zmjRvMC5*2fLTmfm`BknHU!T#{x=lw$|DK{1-TnahrTt?tf5w(ez2H>;I=?|a+j8g0 zVt{}*z|6emEZ@QQ;58e-Ok|B<&#${!{7p;0gQao#08@8kA(OmI7R~v>n zw^ybr74%IH8S8Gvid8EoyU|XvlHn>nQw9o*=&KR!4rkvN9HQ<3ogS~zS54~b2hi*i ztbDw4;=81ht5x=__cz5BBaye+0~>~xbVKjNNyG`)AT6LYub4tT zr(~;k;;yzE4S#xbixo6oyhNQ-jd@<)yxNxm4jA+6j4ONsORer9=5DrL6FTgTkf+{9 z#u>(HoH@Oq(I1x1ckisgnXm&jP)}EryqH+fG5#0?!oDhBOWj8E8GbNVK>_B93k%pf zM&@(>7Ma1N{imudMS^60GztV9Z2ajp0!6uWP(9mBu@02pOtedh5)BeFudH#t&R+V8 zy3rnsa8ZQIif5oM+Ok=qd@lPD81}+fDp<~BrtVP#s)tKKQGo|b%YudS_T-?ZTPQ6O zby`5yB{0_^+W^Bd5Z9TH%uvumpSi5o`-q-$S+ zUV`I!hs^Xq6U_Ah)xbiuL))TJ^e`;iRM7pnXUJxr8ZxX9Hhp(^SGqxg z8_N+o;R8l3q*H&aM&RuIJ!if*0QQ=zQ2)5Gjuo!gPU!Ecbym!WwUaFnAt^E@@JeT3 zSc0j?s;Utvgh1S@^@z-Y_@~z9;2fu#>58lOScT{+m`5o_{Jr_#2bvBWDItXQnHNf9n}3ElrdUYT|9Dr4YKFYEWb z&9T3T!u)dF)WJ9J@e=)mFXH}R~ zyr+L|W^a0+(rc=@|9w=GX0#!5L(lR5^`n0Cd70xwwaJetkS}odZg>O{jVt$2lAa=G zCG|}@HTFRojX-*ZER8vv!&7D^n)D2ms#Et>lKIsrRj5#b8fwZ`v{ZGn;`gEae5eBI zyAJ9Vv6#T5f%hbVtzjjf;37|DJWb@m=1F?hf|HcDupnb3PhME;hOX+3(ty>;Bv1n? zzL}skAHF6`W|~*>!>~6v>sPiq(rOj+lCR)avw>NugtaPHp+&P;cGA{czOJy`(sWY* z-ZEx?LD_S{vL0y4uXY83{tg-yItK59?4SYP7Q$6_YDETuDMrkSca_ZcE>Xx5U*xb3 ztIjzVMAO1boJdnnZLM{G)yUSUt9MsF%Gl4r(Z*^4rY0!}o&93^T(6kbHMqnWLT}0* z#*9%CjYJjLv&yZaR9YceYQRz#3?rl#u3fN3vFcQkv0QG#y^c!?P?dlH4}1Y_tVb9% z!SN(Mbv}VnSVfnlzQdTuYz;_TPGL)q5>wLQ`k5cD_C>@bihAx|;p$~_Oe~}%tSh5Q zd-(ftyN9nkmcGGk1OPfW0ic(7FefpRB|_`xeSm-kKbA+*azr=(2uiyNqvc{pcYHc8 z1$`TtRd*XXwB{fJI)P}(>q>mwH-*FOA|fQLCMx%Ownw6Ek~Xd4)FVb)hWuMV#~|*m zx_Kv`{*=0D!6}d^RV!MS#A;t%jXv4hp;hQa)v`-$6FLvY8l+|oT+0Sc9n5nIl*fxV zHTGVBW}?J?%ITT68QVdS&B>&p%dAlHk4Fx7#2P*7Af|ZIyhryDd%w*30lP)kyY*Q#r(=J^J6#Zd6#wwv z!jci?H66tzJOtkQBsX?_W?iu*kJ+55x~dy%v(>eIn~2Nx)or}SYwI7;OtfZvC%*d0 zXosJJN=rF1Rp*XEzRhmlhKnt(E9mI)5tjANXBH#i0$n9Qf4BwwvSw3pJ;DmkS$pMR zlfDidoS|w>LIaH1pKuoGf)Yf1O;dkHvG|jSyRaTd;UrZPM^q12%Q{$>gVqCVr4>b~KL*ir zRIOC06Iw`@Q3uhA#nDOh)~7<_W{SQF;IH>ob-8=~$4cNYA{NwBQ5rz;UYt0*s{&qvI) z7Gb#ljkCXVIX}trK_?z!i@Yh`lT6YCv5+Tw4w<*3Njw;^_lLEJWvxI_AU&j(=X(V! z(uD`sUTUs3ah;gY3$@pqHi<}l8V#HEDG;9B2U!`)>9H0f2?2ecij!& zUth1Za{lftn3#R?F@J`?mUWFP8arKCHSqe;Hiwv>Oh2K-pV3!#5^-|of>A#_l62%n ziPdLI)<^@$4_#TskEC#zwS{iwZ+W-NWSC`^paF7DOzia zpz`EW`tnMc%B!Ik1vYP7Po=*IAGV$yUz1T5qn%Q!$Hb}q6$T9)*;}lUpb@A2Q4vJ`L}ew25iu z+I~w~%O57%rdz|;VQ$`^7N31DuUueUv+iiFeY>pl&(n4KuH9YD-M>Ab-hchqzWrWr zy+wFG@Z{wUwYy)OfmNVDWK$O(RZE3``gk$HzvAceh(axBbs?_M7f< zd$wg9*9bno6PZ4OAL;Mk8mPtcMQf+U?)-X}v`bahQ>P`D6?niO}McHS)Ni!$2?I6fzJm{0R>w z@T12^GX#&2e=uY`As_Y82x?5pf?partpMViF%TE!KN?n=p|?97X6jV%iGZJ8;N>_# z9k%>tt9Szi#LUgl}8XfwBXmHk48u;X5VP|Xoj3WHh!9c z)G+=VL##U%=D)nDWrBP(qb_C5J{n|1vic{(4=vs)85GYoP{lC*W8o_i>`24=kbEJD zZwc_uu7jbSU3)`1x(Fv`hbFU^EI#u4xm#^}ra zD_gLBG69;NE*KA8*;EVchxE=I^fPr#2vYu?AU$=19}qCCzGpi}6j@CKqs>GwI$GcZ`RDXKsd2 z76+V>xq@E!V0|z_OUQ*K;t?0n&=Li^oPQxt*}y3Xz2rZbQN@gIPE+MTQ6)*U@9&_O zjZiBaoKe9J9Wf+*k;|cvu52NbbCZ^cR&&HAM)_KU*y;P52_17qC_N#ilg?~V24)I% z`Uz3e5f(VZxTgwQ9W1Ho+&y1x3zXFqN&Q9wbzN#4(NDQTWV({q++@sjX!WUPpNkpvCRMNgQbY(6a zao0Z&X%W=0YAMd_Snvf(UX8ZbU}AWP14R2NpQr{P8cI`#hcnd?y|*Bbb%cU zt`E{Dxig-ay81G_of%X1%--D*B&_j^hnr3hoEpl&6|xSk&KQ!Z*1OV_*{MC;l+%iO zyM-n|6{N$TC!Skrbz6@SpPG7QI#iB7uMG9$jw;Z~6(Kn8#1Zi&Y&I?2(qG6qesnsh z%z0G8dtp6TYe{1XGU;z<)9+Yxy8=}Cv7~z}w**N`6jtWhlUD@#inm8qFlw?^M!DfEq}3G&!NN z|LjUqTJeNmtk5=U_pQ@XmU{PHwMJWCIDe9$>;wQby{&ee(XP^1BxUo18UH0HGpxn_ zCsKQn$AQ?0Bo&?#Km+UojzQPkv*MW0_poS@SEMqmr&=#i3zS;a6(j_5jfsu+k zWgFH0Z0w_rdwf4hbHIxGE=yS75#f@2dcWxkJ;ZytKvi*F!-5%GT3Ge;;xK$}Xf46u z`FgTS+c4NgYTAE)ZW&Ti#+Jf8xuzv=RJ&5+S!99>)<9AeI>GwRomWQq2+{1MVZiif z*hwdzK<}WZTuW}nw2OBCf+4;BUUXTiOqqvd>)A`U%dxV|+oLY!JkP9Gu3qwhAn9-> zUn5@9z99wyojlV63*7h&`J|I9y>~Befn~SR1=o8<^M_F-sAQa4*L*ZwFv@x2z-Gri zN0g7~+;oxAc2VBOOnH^RHNpl|U7gscll`@Gc&%a~ROK8!F>SVJxl_%>)qY=oC7{IL zdgNk$1+E6~>jHeI344?!kONI)!Oo!+{;LYKv6Wy9{N`-G{!>BrnV5eW;^tD6FHX7` z+ovsf7kFZ9#hB&;*1t92b4yU`ZiCB)d#V_&WHtEaO3bo7a9!>Jd8dZf<~ch97W87p!Ll+?@$6l_h+V9xgqz#-`en^*<>U z*--_{0+m7-E5Q!fFV+&1wOBq*y{;uCZTfCM7vF2TI-ivkq3=fl77aOo2WxB~E>6(|NXhBj^XHsP(qWh0xB?&U;cewsr>oc7`4nR(5QY>hki9 zo65+^QqeZ6GFd)>x}q0J8m9)bM0{WIa>P0C1+&i;;XamuYJ%r z80e*0=tjLaRUCuv@bXjgjj{cWh0XoT#j zakJ5n!W)#*|CkbGFzL=WeXoSM!hk*u|pdl zGZH>FG<@UoPK|#d99;~o@X!$t7}4~w^0M?`%0&O6?HhwMiGnTLwr$&XPg~QrZQFK# zZJX1!ZQI?`wr%aa_x8ox{k6X~Dk>r?vnp<7{ivI_D$hAorpAMd%A~N$M8v;iu3v}l zA8$qUeGHKWP!KTC9#);_o(`u2S`FPS4L#@tSi9-~Ik+dUQqXQjhIXC=;((dyDa2X% zVa(v_$)b$GXw3ld7DGcjJ6|PM=X}}xKZA|Y`9!eF2bZt6Q%jGA&$~+tWSwn%4Q%-4 z!kLZ6%8jT(47)2OuW%ktZg3{`Ot7!;4RSJ<9zGtHp2R(43`2oLWvN00MbW@+j%HXY z*Qd99P=gX?sby)U$HIw?ldN~(4kt!F(BySvGmKNfDFGm$k__UJJ-?ZmyjJk7VxO%fHjH@F;4s7(lF5;PY-WF4Cs20 zvURjF_35UkbK(#gry$G|RguBi<8kw*HT9-+dH4i5>zVijJ-OU{?A)kNep>A5d2K-z zUFKcC4c!7vLVY`N5}~n|>x=4@GgXh)!r#9<d)p)}MJ%H!NH1XSH64iP#k{;XGCasq8Y^#Q zFP`I33c6-Ghuv#wX#^!^q>0^=JAN$W+@1}Q_WM}JqY8r--Vpg=aZ?8dFOulVW9n1TBTTq zz9VI&ek`^?DQoqDG?5?QS8Sm>PyW1{5>M7FcXIW(%SIR85XjG3osTWNA-rMpIQL1a zp6H(3?dL!?Jx!Q9w|<|ZCo+u=Ij^?WNZ)Q+>SDKbqZ1B0k?fk05|k^?`TND9vU=-q zmRTyg0a3q`*{SYS%wbUp(to%jWJct`k-Eue>lMWRfOR&RwYm5!1&kG4gp+!PDC zEpNbvC^#bsvmQw}=EX38pF+T(zmWUI_adqmsk`A$Zs163eA093xIhqntqUn4M*nr7 zT|@~rZ!&bW)Tf^@v>SaOs$sO_wB~rguAgx9g)G%j$WnHINKM0QOlep_z1D<`ZzLrK zDn0|oFn4z-b`Gb%TZoGmjGeavDsIjTJ@Q1OH0Yxaeg0^0@L-;a3kw3$Kj4aq>(x6L z^d%gA@OJkHkD%=w9yG)-fC&yM40r%wB>;yU7Y@bGGe~5JMFtlf;%^rpuV`^vO?BZl3^O}33lS61f7;qa>|7lG4*vgd|1r-0 zYpnl@|Ib^7oa4?En+PIiH zF^bz5x|selHMTb~{oiqBB6e0*P7VQq|9)T|*;n1r2Fc6qOg=LoJ&g*9QY`Cf872)t zN#H1MniRCemr?;_Bot)8W+stRNKJ(a9dpTrVv5q$C05n07Y6f60uv<@S0y@4KB*P0 zY1ZA_E3?~qUgb|(AtuNExz01Z4>KmnRbLx7A7feOGk&>Gd?(x|IY0#=@mR0FC4b&) zo@W{Y(_Vz9xdX~C3P{Q)_y9`joPLN$Y0w#O7NaB2*SZ+1z#?YsNF?|go85K?-j;x76qXZGk$r;m>$7va-u@3= z5sV$!tDh}LnLOt&-6sX)hD#YHiK7nq)|#u=<{K(vctPT!hl#Lh{3~tstq*e%g07_a z?1QWgPB%?=pQhCKv}2USgvIXmR>oJ`1+lRVj$#0icB$+8=Y#oo*Y!x7=8qhmc#xp| z&;Cv)(-+{mlMxOBzGFX+<3E}#SKx}^a6#meBK_-56-Hjm-u~PITv?y%zrw00#20?; z8)U~OCw_&D^`ZOxE~N5%2bxDNq*d1oCjRiG=@#cH*(7d0l?#w1nQ$Kq*`+;PoFww6 zoY~S))EACRN;imKH1J92*%Y^6!UFTUcj?5^=NVRb2af6$`a@7;8x#NvL^~3o3#0~Y z_1%XFG-gfNH(02H=pcCqxf9Uj1h+&CFZsDNP%5nUD~He~CKRkhxdO^9Sl^5y(8m@Y`*j>6P%g+C(LGHKIm`>X ztwpdTd9bZ0_baMmPa?ZN$}Xv#XSie@Hn2EOuecDpLU0NtB16I?X7*| zI|vz62R=aFl^?mQ3l)0J@Puwr6>~`zI>GGkaQJJHyhc4QUekB;^A$=Yp0u@e6ks=0 zdYeUVHRw)7_}bzO@(PZbkdjl}wn%Hcr4I>S(*xRr>{JmqT<0t1_3P)J=!079fM-GR zz=;ZD9@t@hE1ql553uL$lk#C77SVg$`6+HItc8Y4-Z87IiTDv=@oa+xAC0weM|wD; znzYC40Arj`K3ZBTSvj|`2bPKqY6Bm>Whj=sh_D-r$#q*1-B`w<^8wS<*P7=& zIW-}^E&78W2*SMY{SrWrK%HWnbaH}uyKFMhGFxg}UIbe?f1=Rn@_K!E^k$P*VtKL~xj zLfyFAz8A)R&6=0ARoJ*OKPEEsm<~nlt}qXES}n-VsFy%Y~=lFGKXt&T?vzt8cSuw8kQd>c!dYPXh;fldaWHZxexIUCSj^*SaBA zxnEVs{6v*JK5BOy8G=8jsqhX_HhRzxKC}j>)(R8(+z4QN9R5yTLjMqez>3eDmRj9Rusr|LT|99IdyGq(C~}&j$R|u zO+%bPCqPVDjy+3WS&yL%@YnW66&nV;C(b}HEG9_czkzr4U)OPGCp^B%SAnMhK?1-P z{L8Rya(yy5uLVF|n6DK9H&9f_4z&Ti;C(zsFDg(!V0G$!{2&}r&2yFI*2{eYz!@Oo zos{TTmo@gKyU;h$J_FD3lwC3dooROPJ3vdob$CFB!dbw_zyWxcC1dK*pF4jDg$bKv z`>YZ;fQ1OVMhj+P+hBoi>LEhtKRf5BC$Mg|DM5UEL;P@uy7VK@Ur+Jr2EEWq!2B880!jvDa>HI}b zf6x_ksV?_TL$@aDpXK}At51V39?^id*L$Fk1oTQhBtG$qsXD`f1b)AMM9BktAo9x# znUnqQYV;O>dj!@SJvVpUQodDmfd|^)+}19!0y_Cc_&|9J+Xlge5dK6&ulnhPs{d2P zXP4|10ZmrNd=?*2(pBpfSDJ%|wFBjm$C>poxeJaEgCUkgqv#5BD9AkrGJ^;W#WlDY zTh=g2N{FDrdR&HfIh%!s8tqn^Xzyvt@z3d6EjZ}8oSE}JM6VZ zaX;^o3M0rN^{9N)Sx+yw=9m}1Dj*Np&Gh$r%^Ss5)7Rcv!ovs5psQK()>&vyjn1L+ zM&eGOUH?(yjhp=f>MrmqaR;hX9@Xg-tz4oHMNV^aQy&WDRh^tao3MH|;$ZnpHER_J zms8}6iAY2cRy;$03O&=FE|<;8&`%<(7ex!q;D?r=s0a4P9XP@{OVT`6i6Zk|GxKp0 zs5a_x3hHP!AKVrgmn9DEux>?Jn;A}Fi|cJS@9ihHDZnpSW&Pn%%nP5J!HEnQIkv&(#|_)=wnxqqL6A3WDB-+P?6*$LV= zK9KDE%PiUhy(-B|RO6g}?XCM8(!V8r*VJ=Z89G50Xtzt{z>A*iPX|kvrO(SsvrA>75_Xi~8?~(q-kyG=An2 zu&EozT+5)wGe1UCG_P15>>eAK2WI3+eC>Vm9yhfO)QnRBmiEy4LK126EbOMb^8CoY zjGTUlrr{20MBJ9}?SKwDECa!rGWy0&1Hl_>(XIClbHW4esTLjY}~x^#oz(h6fP+~Woi1M6clp@DmthreWeWv3$HAqRNgR=U(k zN(AA^_2}-s{DL|d>d6Fm@dauV0O4LI`Zoot1D^w2FgE(i z%t^V4V80RJQEtuxZuz!-7Y~TM;}wuh8-bL-5dARWb`iT6;6CGWfwv_N2&^z3mSDeI zqR{R-f#pFzp?AIUZuz9$t%05uVZ2GcaQY?-?TGV&cXc}zh4}5&cQ)&Iw}At2+rAcB z>j~!~+=+&VSUecl#oR1^3PUjNARm+(m#S8*ABw*I_!fS|sri>&`H#=0?0;*2|5|)q zEw-f7A>I4ZK0T}refb&A>pj|t9=X$WUG=NEhWuiiQ0&p}`LLR-01(>hT^9L{4IUb{ zuy%>)_j4B`mLM*B3eF^o;nER)0dEB$hd5 zl@8JC9(-p@FsmH;B}bQPYGh^_+68+AJp|3oI!+!sBq#lk3O-FGUW{pyWo;Ox1N3iwFlQ8q5LvX}81#gLz1SF7cI^1vpwWKn_;NV>mJW9Wfc~tAkVGge=nh z4Q22rv?)0l_~+e=0#X#exRDF%fH-HmA4-YHnG1_J4pNF0=p1@10rcD=0q7GqMjUtt z!~!M2zq39n*pR#!AA~55G6!#My)+s$+PfQ%YGHFQFsIs!dyY|bV>Hl6rz;e6EFoT- zdyY`Zix+Z{GJd@y%$MioHD(_68~6`+%Zp!imzu(H5K26VFZ`SZ;Nn%0etX8Ez~B67;VB3l&@ znueg~B+4oo(_#*H*yfZ?PahsEI6bsogO@Htk^-sg za?%h?(9u}mjQ#s9hc_!zKlzW!vf8>66XHfDB5&l*pcQ%5urwW4y%5IlxvA*Hgr`}q zOX6?8m5MqTwQC>-4g8x&W5lYYxIvWKM#o>^5l~uW7K$Fx5?9qiISH#z58DU7>`9x} z>W)S|Aot8;KOu|3GVjt|35rG!>!q1dPC+X5LNZBTZ*YF!i_*pxU_%$Ic*@yWhBGDJvi<@lMCHt>6f=BK$UYx{GY-?VlGll9bK zHm5f&+_AO=Q5q}8-8%wpcJ;!>VZ74y~e1-B$dXJ9M1L9onUnc8r%r~wBA zI2B$*ujHWTI5#@=lfDi@B)OXNbByT-oRff^#qD_rek&~vbB)N~ng>?yZb8X`y74+i zunpDKT&3mBo_!l<=PrRE{JDW{2E2po^NGxJ3;kpW2Z3x#I>oTwlzZ7^IuCF7)_b6- z!T;#4;H>Sk0)* zE>1!6>xZB%7fUGU zvAKOT0c?LYDmGaHV51Sjx3qaqiU|Z>4aftDd~2S=E@iyEfIT(_>D{tZ_r|0`zT@8P zTwBv3N|S;#pZw!^)FgySoi~mG2Dxnn@8<#+!2WI@uv|I`Ae6*%n85<7bp_?pDakh$ z!?l5x&uUy5SJ^^HjS)!)lwhPsxU(G@OJL3V!G7XyLE1ANhFh=Qm~r0Nm^6Zz!cTvf zSYd*GgicM{^(M36<0N=)0DX%ZMv3g5-Jb+|@EfRNb8VcZWoCwYt-Zc+v5Bf;5kjy} zUG2A|7cE%tJvtS8JzJahmiqKE6QW(I2S9Aw2)PZ219=i<0ur#>|4j&>G-VcsF-?&{ zi95p{`+B-60O;8P%ZLm*95IP;soOHAq5>*G(jjjdi5Or zAS0?1FU26CC3bw&BSImuZxTceI{a9w5P zMg~z!Lki{HopTJeDM5S3@Qv2}OtwFXY(|?xe-uYcHz#b1gnYL5IpVmi`aDd>Vnnk1 zP_0GnRSfWOQ>M^WW|vhN?=mjh^Ztyo^D_n1TyyY=S6GI4p>)`1dg<<8q|x4|zU7 ziJ=t-U7|sq8r(i%Uq0{({z8F@BLscw{vimHH#h(tYoLM7AZBYzGqIiD5i)J(T1C^^ zY$Fw2uh=X%y;*=k{sd@CdZjMz2*L}2L&F~oHy-fp6!B>F^nk6;5ZY&FEnnSo5EZK zK7$?}+&gQtS0f!HN04vXch)p4x){I;jDYj)o$eu)6}{ZgP{WAS9Uts%;CSyR*{zDB zF$X2mhnnH(6^5)cu>Q!TAxLL^G-@Fl)L+m_2(7&~sMz%gy}96{wJ8h^SfocH zltX9%4$s;959^?~t!3fS)rz1vU3B45by@-!I28zd{qjrq%SSN$m+3pM>zs$ogIsRm z(XDtt&+FhgeCOb}PBRGnFIIi$zueA|2XX7dqt6#XahvAg`1+a1E`K@bPupC*=IU*& z=IUK18soG}!SJ;yAn|>Vge7i@T_k3Um*cW1!ST0Dzv8A%XL&eMv0QA@Uo#I% zBl!{ZrFsXoQCzARJy+^$*iJRH-!qFUxlT{%q}^T6x{o!K(OjA^pLjQ-%((36a85L? z5P0mcc5XD-1y0-iK4By-UdQ87p@k(LzyQWaZU0_nhI92@M5h)Lh&(tCL2+SS=y9g) ztO1=R?ZTspf3g2n$ikzAm-)s8tfv~gP(0_2dd^d`Fg)iCE8NGXGj2=&vRziK#8*ZC zikpA|7++^Ajb3Jy#A&WRan)pq#FBZ%`r2`-B8hatSIhQxF4Q8@!spq^5{60k5@V=C*g5ZLxex9UmnHTRFd+N zpN>f*@USF3#l@UiimjH-$Uf`j#kHeNk(a1a{5V_hABG&=CD~4*YT3{;Csj|nCZ!y$ zV3d&CiC;QRnmjlSntVC&WY7U@nOje_C8I4H9NYOcwd`yXv}_LJFYiuI4c`NL$Gdmy zh}Y`+>~*}l^R6FHIQJ>DeLvrG{2IER-j9QmukG4Tto2DXQ(!+4**JQsP{%~L=v3*g z1^$e6YSTn!wQbpv5VVd}=BYeHnBlyWk(9(MPZnmlqYJ7OBd3tE#jG%@y2q`#c5+d9 z4#`X2cEJRW_aoNlrj6qsVjg1gnU5=a7>)ge%;E+IH$`5O)Czs8I)!yfRm~yzrQ;E6 z=hxmkyvUuYNPYcBb}BFsO4TVC`=KLNP!mFECQf+TFW7TA~f3?m`fO+R`A3&_sgU#o9=`r<6S-3 z_a4l*+b_0f{GZIpU_}1|%C}*r$UC$mMNqMc5fKK8L<1kv!kZCVjsmk{`KV+J|B&u6 z1FdUX2c^6ffDtg8k(iVWS`Js*Q(TgG^iy)$0(yFeHMs5#Ghf&CNdRC78>(Hb|G8e<3am`T)CW!MwwMi z(5ZN*n4o2;vxpPUHgX=&Bs`g5J}5iXy{*W`bE{U!df zD^>pPYdO6;S5QzSS)@WwkB8@V>8m#|x!W0ZlH#)ktR$q9i{_lm4l(1QNllTMel3&i z9nmi#%Rg0ts$?dct&*hun~R>iz02l2c|0@}99)?~fu2!Do*50T&FM+%`7k;8@Q|!i zkEZJ>t@T~C zA5>q@V!)dU2$Ndle%NlhA7AwWWeMKUVC7%w!iWx5zRnT%{5zRrz8Lh2An`f$O1 z=l$nVv|MR?#`fjP_lh#*E9I<`5MGLm$;0vc@953X$X*#DAt0JN(SU;Imi(7y)dyFT z9jjyy<$CI6biF4vO7RVIKMn`Va0~}R>6II6`ybjiyr*bdE_E!Nf5^>7(T~%`+4+_J zEv5PCM)jI(e)D0Nx8VLI(p%DxIJ^RDjpgihTE`S-oa8R59bw>BYzJ+&wn_0myhyod z@Dp*|D@f?kcn_|e(j=pQn5X)3>YgDLU%>nyvZ0YTqiO!A;WDhY{Yk~Yrhh?b5AVV1 zddV=8IF1Ntkz;wp8m28J^Pv?49>u2%KdzxYictd{XJcWj%B(LR$#f+j;(F#=pZ(!o z@wf{Q!Drw!v4xZQU~pPN`9sN8lWb-Hk<-(Wvm7YiVY7AyGV3f8N({T!+>GYM%~d{ujc(UtYytmM9oIzdA4xRn+ocw>cTtjcrG5TiV%CWsHwwI!!lW z0hx5+vG42b-Is9)`2Z3x|9|`zB!Y|>WMZSi6$@P!`?}c{6lDk2y!fe zs9dJfo@@WO#qONW33qrtN@`PFS4&p5Ss%k219jfoz7E?(XaCL{Gvn85kr(~te+B9W zcO^^W4|s8#>xHi~>zk03lDaQR_pW+Y;pRv!rq)_IHCj&5WCEYFOe2j?OdPUkyX_{- z(e3THNiA=-^wyK%>ZGjusrt&(ON>KM)!(_>eF%Kvc+3Em5Rml?!;r!ZujuELh2=`Q z2n@s8 zJHb3OB)W1G^_#PL*#ek-3_vVy&_f~SdM4T7UEx2^oJe)N67k>i68AG96WtUM0&wed%3*k@P!X|Kb%F|E3M{lGwVx; zqNci@^5R>m!B235BKjs-&2qL~nSDa(AxdNy!Pro?qY~BogG!5adCMJyTfIlH%kPtN z{FSOF^1_#dUu0Rd6o)XG!{@Ex7+pi7{Wx_2JxP3O) zgliR~3qzG3Cg9uOf59U^x`+-onC4U#tM6=dtsg+!;QT4MCtWyC6GT8>S-BfKY^Y|3 z#R1@d&K#$m$ep&;2yeLfkG2?BGS(t~sNkQKChjXfhx%BNWE?tf#4I71FUzEQIL8zs zHIApnpC-9Nn~{fk7!!!E?`{Nv4?&kL{y|u>8_O$Y4d{XkeWSjg>igJoIhz|)m@nCa z4{Y%AYGZx5`Wu;aw&z7N@4X44aJ3<(y_t9;;9Hp5gX^$z&Etq;Q$eXw{`&YN1b8Bs z_HiL>O-ZQ>@jC2k3_gj&j=^Ny&((nCKY_c^1m!o~*==uhBDlbTTR=SoTATOm4(zrO z1Y^%=P~9%uEJ4GugOwk>fyS~6hQhFYYHd*EnKnWfsEnPBG81Cl5Udk*{`oEF2kBYH zHm^a+$+}tZO=mVNF|CJpPn0n!2Z@(0Z=D}JF`zID121&}z{{wiA;C&cg_y;)SwcWt zZm7+~fotA1CHhXz3ObpV@Pz$ffhvAo*1k040xcK8gqYQ4q{-mxAwftyk!mUXxQyf< z(a2-2ha9Aj3gHI}S@%133;$y*oEA2KC%0V(e899-0}%X8El^NX!Y&a9Rt4n#i;mgs z$A!`p)qqp%=MQ!-DUkLD{5Tw#;CU zyitw1QEj}jycl{2B>Ctg*=ffD|0&&pI!2dYzs>U7HNofwVUYz8JR!c)v{DkQR;$&Q z_rp4ofj|Iwt_d==9Cl!&J&E1*M6XK%C3m5F^^DKeaJzF$ISO#VH%Gsm!+>U5A=0ao+1Ub@1s!CGj@*TP)r_t7MFGX zU8gCiS^>P5$8^Zcn&9#e3v*x&TA~w69vvxXyjX5zlFZchu_Jj;m}4aW%=_!o1&uLl z>1z74r*kS@{mIb>#;n{#k~f(HpLiD>R5ctQY4Y6`txfFECOCIJnVFHN1 z;1dbV&&OvQKg1JhqD}TaiJYGrR4^vfAj}IwuD>5c88v`T#mphga3LS%E{76<|F#G8 zqU_G(W~ip8CR)uhjJcEX>SBAINx88O-J9))){S=QdrxF4%`oEV#4Dog+a@N8N?`S$DU$d_i8zn%!fspIO2~t|hUCHNz)*Kh?`74* z1g$pdtinQ|^xSWy$pNcA$x;G{cu$w#g4WQVlznxbariLQ0=r_2=ZpnVhdcbm`@^}B zJZ$q9wqN?7a|*P<>(-~W?)@j^Jx%i~%GM`WdoAs$?wdKHXD$uRn}vKmpHtJP)R%v^ z2_8+vg%EH2DN6lEQsI<@JvS$%vviKyCJS=4u!|NSpH6v3M`z5alXF(l8RW{JHlLUM zl_2_|&lnA;6fywhcH%Jpb^?4VtqNLgME00|MA_y>huCKV=7{effspZP9Rcn9ixKSm zencwzz1T`aBAyw&dA=zHp(un$bc|mHgnrrz?ag?5od8|6xn%&SZcKfUmb zuaa9(ENKnLHJilg*5{Ou=vgFb7*>sgPrx9G={Fb?UFW3*PA18;9)U-UW@?n>DV-oH z&}zzr_q&%b@CQrHc30k2m&ZF7Gal|c4}W@-UT`(Y7B0wj{Eltnx992d(PQu=Ba_Qt zQG9NvH(ft1#dt(xJBwqk{YNql!~66E4@2C<)GWM1$#OmJbgEh{?6$lj4`;9uE{-M3 z5=#ICu2(mRLL$Gwd=^@7EhT~qHK>*p<|NvCBa2)U6yFilU+y5mq1w$kvfh6P2+!mD z0yuK-_D83p$N4<}YI5+5W1GqtRwpzko$Oe;I7XaB;Ail6 zkd5sAME1o{V~i=uGO#JdvW{Ds8j^|~nBcwp{{1bKB9JTb63>}Za(S3^Bb7?tO}v2m zK9C##(O*4)c-_BA@rL!{d+Z#jeOs$3g*%lxZ8mwg)+|ApBXE9-CcsX;9-MMtUm$zd zy3vR|bDy5SRpEryc>y&9DlVJrGt2l)(&dTbw8tzI;Q8&59l4c zvtWmApV&^pOJu(|vPUZEJ_49A@V>#v^TYdi=6QOn(kWl@TMh<^Ruk|7)SLLEAO8%zpt_NY3&f4mRH&}Z%+jG&#OL%_vZ`U6e)5&60PN{aK z*$&UIhm-1@(#39r1{b^@>+Lx3H&&P{z_5t|bycVNHou_mj#E-(m(ai7Fy~N(G~!*RkB-V>BfIe{sj{ za;*%UN|uZH2~7S>aH+QtEmOd-3?%prwIO&Ih{&{3`6r4%dl!vd*eZxMtJvJ%C4WpV zP`PC>h6lBC)7_gThDWTFq};|KI(hGiPd>mIDEP^thzcEhJSlzRc?wAG#F z%X3UXUWh}-7EV>Zg0BwN!S2mWOb9?yN$nPO5NUIe*y)8VE|Qq9HyJ&b*GexUm?7SH z#O|m`$%5_Sp>lr8h>BE>e6$KPG+fmkGp5|!6K`Z`2`!6r#=wEggqwTVTv|pZ?q%fs zX?;C08IGWhFPHzC1;HwJ6q$Q~=oG5FKz!Tj4%&0_h;_>P;<@o~u}p)+({T}+PF?p+ zk{bgbRKd4TIdEQQv`GJ(QX%}5;=p;}hEyUWSECzv=T#B|DNj?Wh`?Rb(_|vk!k;9|<9Jb}h=~aBSDo zuS;BjfV?+m9aPb$VBV|(4gpy*rIk63c|`u?%6`P9;o0LKJsNWH#D^8{YpKj3@St(W zR}9Xr9Gw^Ed&D^Im3hCR^_R_XvX2K9!ENQ zd0hf#pVtg<7#GW860HnIqtP6$+)~BRDOYM6Ql`f7?BpwUBCZ&AuNDG6#;=O5G55)6 zg@?yb=O((q)Ernk0dx(#8E4%emQui^&TZsAKzoZQn&A^dZPCAa>&GjRnu(&Wr??a()E_Wqt(D% zrHh|Q8yp|CL&xUulYB1OXV=J$ZnELuFmJqmRQxL-LM3va2-Ih(BzZ(VurJj@&u7qrL8?z#F?^c!k-j`^l_b=zFVm~JjQ<#9+(U728Mp-R z^W`p>=)=J~XEyXfeAeu*BJ6kM9cT0*j8@@;t7yKAdPnuJ`Yt*Yb9uIH)u}B&MCOf> z3Uqdq<30mAz42OBT;0R)L*T)P_v1gX_eheF(oIHk>b0!P(fU42wOJ7_H}_-~-HR+! z%U*X>xddv3NBCBH=hj)v;x4=1fjcUR4YTZG7bwBq2cFH~*K}F!WOz7VN5*uEE^p;= z++%lKUrAv5LaV|&clfG{TFnIB8!tg%qxeOhAcUY7u>&4iz~|nVG_~eU zxsw7FHNN1CI*%Sx5Hlt{^%FY!hjdg|wpjUL0)e%BHa#yb^OnVwLRc*5VSL#{poQnr ziOCu(%1{>QH+p=+n?lsF&J*cBnH-Sn3b2{pb>B_{UkjlI83{&SmmlT|D1_Qh;wWEg z>>_z7FYD9EvezhHGrs9(1w-&U|L5pt54e^6vpqKu{#UJ-`&lpil(yn23_@ma&&MbT z^pv~cG%*4j{VKtm>%ih?1VP9_V`~FdVwc}mb{EcxF)*g#Em9_AXXk)1) zsenG{+gwceU!x}V0e+n5Gnpi2JHE2Nk{a$BzU1;Hn(>>zF-t4=AwwxbTb9gmLS(KE z%eqoQo@TbPwsJ?Vixcq`-VDwL^HoUxLZyjKkUaR~VgNIUo2*}+84fw}sLnd9Bk zv3Y8&dt4qSF$G1aLCGDzV=eb~(##E8bDYOohN80-o79nt0)sA4CEf2*2>C{tD3tO` zG~ZLaw)noOJ`q1rQc{B3p5D|iK6zZLW80jlrahnFl8 zONLk-8Vr-juMh^cxA*wFV-xt-dco5~hMr2Lr-b9ur?=LyZ2|VjcLxyid*}Dkdim>7 z`|Jc8g)V`aG+Cc_ld|=Tsk;(x%?Q#O1e$>tFovG95OmvB%>7j#znw07Lr3ND$9v_k zPReFBjFpVK}@~;i>=Zxvv{6` zUzw4kta}|^J6yNH?LAQ?J&_M;I%Tree>eczD!E2uR5TM*x#!W0&m-oq`=-}o`{v0( z@gdoTHQaqP5Ahqt9_oA_`>BESzf-W!$?lgdp`njV7ZV56YpIX!7`l7nZCQ z{9g(`j#KG-?CysymxkGnICow>Pn>DS$7gAun|Eu5WveFu)4N@y`wIh#1X@3`Ols|FQR(*Tt^Zz*pl{{Aoi{(=sI z-DiZ~d(}cWtCf`$XbctE`n<{icxzUIa6u(NPZkhL=0CnauL=G9FOCDOAF4;~wm$#1 zUT-Uo97;iVEoYN8(w^wIE<}Te>9v=-?K(5kHpThqYqD{ zg1ms~2W_hVK9!;CtMw!MRrNGN-GWCf(lU@_m<8|2Nzq021eE2H=+&1a*KX-1_HukB zqt*N4V!gSj(8SPF)Y)p)AJ=|5lPq_RkL25%`K*G*HK9AqaBD8*CV6tqTlV?yKaH3( z|1V1#ezT#M6J^O7N^0)SH1mgyXdlz4+Ntccs$#jj(t2--Cjs4}J1WlN_Jf6Uf-!}w zoh_$D74^Z#%#p|g_tyzdby>am=1-Mb{AjflS$iEe&+8Bq3EkBJP3_WTI>M8Z(LNt@ zZj{C2>5L8!ANdYz+6`w%r;*pc_f1`%sIaVyf3>w0k9Uo821Zjovi~^}Pma)LmsYhX zlCTuynrGDx9#mfU`31DQX3e5+>u?eptqC0(aT1D1;TLaUDxo~pnhRd?!?#!n`7ZmO zNWIo9H;?H&yLt@m*&phbKndJB0Nxr$5*3Aq5~FT)sKS6#14^!uSzMjU?)9XgT1e}Z zmmyol!cn?|YA+GMkbS?|Z6`5)ZjyiicXEDX+L_?@Qb$s+CUiE-)%;)9y=u{(Q9GFi z?}Magt-DW{GOLPcL-h^HHCK+@!B^bO2z45gF2^he-+V;K~#H_mrd_GkJ`b;o;IPlLWw!Uv@*opOsFZD| zdqL=<8*`uB8*h_GxPlqvoKj^DemSVD+mpN*o@e&gGkO@lhCwiwwKx(0RtEL9`ohEA!#v2AwFZcFT86FJ|M;V%M$(HfFa6n-~Zob@Hv)*8FTLHp6>;4)H zJ-ApxQE=^|+=RDrH?3lcQfZ?;PwhWB>=dBoyr*0-eCrea)A<k8hVd0n; zFukzH1wsO7Z=!eRFX5XxUZM|B9Q`QkD9H)$j+}Rp1CMIXAZ6*^U1o&WtYgP@=@_rjB**Nz7)y@4q2U}9{=M=F=g?(D%yH8%`0?c@7nx{yT<_jZ4o$VqU9;DY6 z={n-3P}tGJ5|>ksD}?-_EMZ7r9DJfs?s4i!=qQue*oXCL3Vo%jbzH=~S~<0@-JM4z zx&?KNcX?bWzDIu4_;x({6WjaU5=6xnf0P0It~NOtqg~>7rX21>4fF=wVlNSQ_lO=4 zg(&1xkcI#nkv*(kaCh1>)yyHx9>q6^>IK^vptJe{_H3xL`glEXqhnxTZFfm+I|Yb8 zFzlu+Lo|QLe=8No4Y@8me65-81QOrILW0c3lps7lW~%lbolx&H{u~|VRN;vso;1T9ocmU+6185m37=z~Ol9YY_19OucHA)V z98pf+_(vAKmTOCO55>Af9Cf!%B#bbh(UisKTijN)(M0Jupp$E0`FZ|MZ4Gj~~ zDW>*NTaC;LXYst>we)N_T`Ba3O>bxj8H<6n(Ex-o(}5 z@DQSbqC1amlZjW=#<-|jN-FU*7J3@t%9}Y|9wgQuzzs#hB-ZU;7+5Vne~P##xGsbW zjMefA!-<3Y;sI$yU^jm?4gpl(#WZ3o(><>ZrH8y8l8G@dat&JupP-;d6HxM~;8V;% zaW6O}fsq_0uO9&*jE?{zO=0ipmxtklm@LGcAxeqg`BAbmtlyx)d%nV#+AF_0XN@Eu zGxw8>lZ*^fCLx9~&1LSeBd2Lm^K7sTcPhrH!P@0u$K_NT%5Uy-K|9uD2=RY&_v~5l3s#E(`R!o{UgC+N*~xeg|E5Go6Hbu`yw!c=59Rn?*Ag}8^bGkws&LfIN6!l z#>AZ1wryi#JK531nAn`y)?{ManAo;&e&^hC|M$84P+eW!)o-m@wYv8%y$kGD!Fp_r z2zQ`=F0+fD3x3i@HDkgBGq9%H%;clTpXMVbCuYMxrWlrg21~CkM4$E*W>PqEnEbQP zrJ0buGd?mQ^XbG*!DV%9VdnOc5b_EK(Hssg%5Fi_(I5W}!1&hCUQsc3X8ygA?V{$g zfzn{ly8{ol%cto3HAMeybD*p?+X4dLI*XV8U-Nrp-dpj>-uLN6C#M37n6CoNi`j_@ zcCyX#nY&qs@{^ZxsInRHRx+ta+oT4bwbi-?`E<}fE|aBRuW>(2r@xxUf%OKMhH7S+ zgl_@#4=M>;+~=^oQZ{DV1!T}y9=t|~n+)FLIv1V0*ylh7ER+<5ptW27vzuOnt5)D! z&+)6kk<}FMCL-TK*O0`>&oA!;0w|#DhkPP#otp;V^MkE&uZ`||UGFNs#cZ3&#)B2- zv)0dK*VMtx=1l?lAJ$mD^~=oN*oiM**RHItYW`RCs*CKW%SA7t=Q!)oZ?_#Ogfz)bbkA~1qC_8YmT({Xw6f-KAKYO%Oy2-_o8uBvg$O=5s%v!S zlKzMeS@apGaaEEgw&tOeaAvtn1SjN4lc_P2xiOQOF%#rbs9pT**|Id&P|evYj3-TF z`M2t1y$#os7we|Gy9UNSU6Vy|#!)tx%GJ8OPT0}p3{IDc3!BZqXO>GHwZ0fn{G~Nf zvQVi|tzvyL-y~6%Wxc=`68KBYgLF}j%yZ5ZcR*{Die-taaY&b3Qjl|%WG8u*Damcb zXF(gyJr-2A6+w=jOy7BuIxdF~PD9kGk{l5i?rNWE-N*|0b}36maBIx?PI%B=Pc%Id zrb_P516;_GRs*FO3yPpxG7x#?gV#iVcE_+m+}(jKA{EFNRi--DA@6VW9OC@=F_cY* z{m?0_JYlqimzNSdJ|$`oE!{q(PPv|8C<~nt7+W6lC5cJ83FUd5yy)^aa@zOLz)!dh zi3AnKL?zC#eKT!GVLsy{lXP1n78jP`O~BEYVj%|4Dw0Od1v_))^FTsLF)W%OC#sXh zadHQ`a-k=(Z2Q9_OcS0ydcFL$iT!i)>lL`pXHC2q?LUW#?A?KmAqA>!kKy{ociBel zHX^)0y?9L5dMB!=qW~wgM671Rm}cq_s&q)k**SH}668mGEpr{{lBIUYmgU~lVrS9i zom3=xPUPpsE=fwf`2m}c{&J|rg(+)ga2sKh{d4O6H(?t;a%9!hKSyoyCXhq$ z2Su@4DxL5Xlb&ZG>6KA80nVq=K>P7GM zvL?S77M4t5$}*O*lVq4aG0`2exDD+Phux{o@H|4_&*Bh_bkc!6lQC=pJ#MlyJ%#d# zeV5e!bNAcqbCpwLyjv4lRHMEcj{!!)$QL7u_}2-O`URmAT%-7P+i@=(K0e!+#=Lof zHTBR@Ljt_^?D5j)5#=Th(l;TRn`>(WrI~c2l7^NpK}%$`_TToP3L(yUDkXZx(2?cAt~+H5OZT8EI^bkzITh z{dm``HcQfHkxM*Y{m7*RmFEW5L=D+nm6^2jLDiwF`sPIZ)UK93@|)P@soscZw1Pi& zzA#02cJ?zZlwT3%$VFfrx7sy_bxdlT^Z1eoL}5>tY<2Z7X5qg4tyuHFW65rb)$iTy zh)MSFk1?8NIua9S>J;{0aa|qVMct6&(krcOBspO;>G1cf(5Py*JYImysUtDS|^z+(aHYqWqG9l0)FD zkW+eMvJs>6<+x6xKn^o!1iZvJx<g_er2BpJGUnZx6A3vpGXHjA$+C}_++T>e@uq#ukGp3Lmfa6aNF;{YI5b~WL zky=N!D4CFzxp2TAg_xWZl8iEG#5@0LJ4dqeW=Sl^rL&Jra4&Qd_;jL1eWtJSn|H%Y zo#(p4L`#nG#>$6r-%qmf@@t+)^39OOh4_L*G$cpuW0!?0#q|zokK$Q&hwBoBaPwAH|ksNRW4N^nS zx1F+h7@^E!D_fS>jW=N?zb@rDSE`2j2F97PRodfAsci1%^1K3Ss{g*NfI_N5SpBZ| z-o^JM?nIicPrXzQlh%IUYbJj={Gf?>LM4=YK|%o zarPXbyNU0*s3KTnu@YM6W!)(Mq5hlx7pNxG26Qlq^*qgiphr(l7o8*>Ah}iClpZUm9EfBO0C zij;zG48BzpAw0^$nh|2_JhqMhhCK|Uig<&K#V$*Tpmiah+Ya+Qi8Aj{o-tWbDJ>Z{ zIb4}xQ5Jo8* z)7Gu9hM7EiGTZ&}1@dmAGq4}$5Kp77GwEWQoxW-?)yb%|D*nmr0**b|SRiL|0&$IV zG~^A62;_C;B>Qsn0htus=l_4>>0$d1iH#013kwG^>u30f?}nX;^ItI&G3zIl&p&~U zo9pum3;Vy09Gt{#tpCpSPtN~S_zwmP=Rb)5JpG^W4?YLeC&v!QCm#+AH!;U25*yd& zefEFOIX?q4G0SHOte-JE+h<8Eti)WLY{VS@-2X&lXZ?pn@4{gmooIG^Qnva$b5@_#T`x&P4`8z=k!!W8t69RDIi z`Y)y+Hcl39_Wu`C5HkxW7c0~MOciw63G1WV-zdQEe6g-)_kE@KOm9ZIovyOY)T*-0 zx~c4Is}w_>9P<~37DE#i+a5vUxhbSTK?o?VpLT)p^MR<+9uXqw=n(L`6sSp47&VR0 zS*`Wu#-js)9schZH*7P@7gXDqTd_$z^hNRU* zg1`Rr(||aH9rd9?tF2W)#Ed@31H6yGc~zv<-Cr{u{K^ycLa)>O&;CmG6CSZ2YF@nt zqd|Rx|9m-*-;b$Qju3Jyx)+Vg)`Pc^Ftj$XV^o`$#k)H!tt#%IsTlE)Te4BcrN5;f z9Vd_>_MtvonB^1eb=N7Oc8J36ywOve_Pp+A*F{7IZc_o5Y6NhY))P8y#f+q_&t4%p zdJ&3`jqi;ooKb1h_8|gWt6`FxA?){zgx-$!v2~}crqV*>`0po8De&*V_B%pNzDMoL z%qVN;R$w#xaAZ=5I)2W1-xGT8jIJlJb!AKazGaePHV8ZyqHVybb;t&Q6d9Qkreg&W z$$r`xW(z_jk+!Iz2GZIAmlvmY5T%8pl>2J%2U*tIsk!dyuXW+(Bc;~I&yZmo@CkM- z@kHI3`45M%hfQ+6P(S(=IYmY+{LKlx^b1BjG(cSAa6!@t-Iq_Hip#g599$Mqh|Zy{ zK`F3-qEz))_N|M!!C6e3?@xInbVzAvOv(Pkknyf-gkPn@>YM$Se$J_Qai?01TM5Pe z3f|`tzAW_||K6EA!)e^uv=ZGLBbVhg{n$|n^Q~+v(@7Gd7eGR`OQns{ zQ_>?<>A7q*yS_VFTlkrH?a{U9s*-F{kg+iIcvxMu$^>R!C~GT>Gc*f)ju>Svc3O)D z6+yLFF)O!$$K}|F9Cr!M>5CkdLGT>KltN*|PhyP2uBW~mg;N{Sv;1A=ci3+S$BJiXGg>Rt=mQVkR;Q^vWM#S@9SzOiR{`W<(WDw04x z9BNFm7e*0BBIff69vSFmCk5WyKb1KR_jHBd22IAl6y8e21;5eEW!jveQD)8|e#DJhGb_oePTZV`~RA&u}Mr;>IuvBD6T?oni^*P0l0uyo_ZVq}5J_%+HVJ?0sr+)`#uAeuE{#1W%p%_Ium=DHsKmfH$&2PuAo?8u_+QcEp@x)VQ{c@J9X3Ddi?pYXR?O<(XOFb z0BJ27h8ye?ZDz?~Ei=~w%nDw(Vn>cy#BLJL9k>>a#>*YBQ{0(XBn!g5TC$ib8Vz6x z$TqBOD5&^c$r)h)GU6xHnOLaXqyDH)QFx7h-1L0NTHi&nZFh+zaRZ#c9~7#Oa_e zJ7-2Y_^;A<7@Tte9p>O4yDqAVc4te7g7Z+x}i4lqvNZgL{MNTWoRN2`$OnF8YGBB;}`c+_xcudx*8X08U~(3qHuKaDevBZ3E&Cqlqs-_w9*_CwcDA!nRo&1%Wuz^_yrxuBarxK~jdOUHyue>zHD{6{!tak2A)H!ZKs~i%J@_ci)q;sz z&=9=_yr|z+bVq#0H=)8!cKAB5d5C!C9mq(E@P=l7p~7e+cv3qnSw$^j=XCT%s%`)? zm1A@(Jn5b`y6DR0PvUC?l{0v4h`IP&Ou;O8?W{N??(cl4TN<3GPZY7Br10@z$3Bc& zU#5HyQV!ICFAAwcjyO|JTa`1K@jYz!$*+Df;oi7nOT=Q#77w&`uCcvZ;Jr^S=wGM&%d60ZUE`M@QiNtYd8Y?PR#roQpV0D)ziC#sl8;5m44$}Vr#*tBaxX4Y`# z)vWirJZV|_M&Ac?c{C(X3U^(7z{_hl);q~2bI-F^%2xw92dhm&cUSg39f?K323+KP z84TabWh`W&r=rfOhCW=R^M zOjP|NgC~!V9&B#HZoVw5wN(AFEg{J1kZ&?bu(?vfkL)ovhezNHY`(MYq%zu<#(*D(vxd zcICSo01c+Qa!;5s(}=#c!QhOk-l@A?+z9F~njnYd`_PIgOOZx!NrueL!Ndc*I-Y8& zg?XNIV-)`GjD|69&nhQaVSgnuw@jx^8xX{mn9cXWg(oK8u{LB*UBw*)kY?Mhmp|OP zCH@B85=%c0LN4jWz+k&S@sGioL87}G>;=r}NzKqndO^!!CAgqb!z`E>BG*cJd#xLm z2vDLLgA5A5 z0Go1{!YR^Ca&=01uya9mJ}ZP*17tZ0u^f{52IK;c2lE>G!f78l(jme)?~|0EtC9m5 zl777;UT)A5oK=1d8Jn7@7XxHh{l=$0VApgq6NTM=X2>FoGRNcSwo)H&I2-r&^a{GE zk3{@(;`f})20quM9py{wQ#}cWOe!tSu@{{0dGFLk~d@ z6#~tbfszV~4ekQj29_0otVs%`$$~yfl5X5asf$()HG z0VNOjDM}cRuz`2UEtFt&q@LAab&MXJ;04s43z`n8Eq9=w%#RKslkU7r8$fsdD>Kz5@=U=LLEn`^?=O}sv_TB*fWVhfz2h_YWTQ~p( z6_3b;Cvp(cbRQKpe(@z2XpkCFg-djc7z7Cnr9LfTk~G@PrNA-_=q(8T3D<){!z;XH z1VB-G{GCey`}YM%Sa`rExaAEzFL59OT`0GtWc#6jI)UfK4p<-_nl+*FuB=|W+glwP zpRnGqK>K0`4899-0H~igM9Gwb(V3w( ze~%|{L6Iw^mm4@y?C=FN4^&sul*)_k1pr2A=nHC+gc(7E02ylf;+pVYVE_WP3racw zyp4LSgeg{-3WN+e1FleiE}YL}O6kQ1j04lD*_17F6%|Ot^J0X*f^Y%zz%pu8AWCeZjcsmggQx?I!}?;k{*USUr{nIK$suI3qS+30-dNsJPogMnc-?t#`GO$Utt%?e@zPy)mOFaR&W zH!qN?7xY)TIYmVkMI}XLMa4LkIHfq{I7QUiZz|N`mici(0T2>_MLmi=KvWcuDB;Xr zYS0caM(Hu37Yq0|~1b6DW7fxWB2&$I!}Fn9A{-6fZlpiQJ>8!$hf(rRdr;NI`l zuj%S}@~D|6eCGgD?zc!{y{h(*n-Q2nqY zXx|9|V5t$O5zhXx zN}|qFFpvbzYn=KU94L&2S9A*&*dl%t1L1OA zNDr^4Gq{bqhp%BsUwhYHdzV3bS3cbx_NymP^t!mrhV&NCZHNx_8gHo$cuPdK9~lUb zT2~?C)=vBSoA&jmsp8HxLg z#g)~AbHEvIPx{#r@}-sQnfh9@mlq{`lp84s4>AUb0Rc2X#i5co2@>H?p9WI5Y+=Hw zL7_qEL6JcTK|w)2s39y-X23!qIj|3?OdSrhCpy=ADBRNx9u4LTcB_&55V!&9*ady- zoy!^M2YaiN%NgJYY5c@KRUMEG^^7)!As7}&2-}7s>Igf8dEF>W5%9VGhWk z))h1&1JMGKlThkuL}^qNsY{rCxM@j{BnSQMF`*x2308XXRj5OxKgV`~3O7Tu8wCMZ ze$A~~j%w31D5lC7A%n~TazI=fHpS8s)B;6`yr05IAZq{vKz_yJe|x!BXhM;ijAg{|JT&Zo>v5gCT*R!M0_6l5!XEZpa(qf$CxA{{puD z`4%-*6i!JPL4)>yKb174^HPLSKor0)Dw?83Bp_&D8;y%ns)7+ANFG1{6b1$*%`XG% zsG+D$m4|ZUkyZZF02fmTK=;8pjG8`a~Ba_ZkoS7hJj;VG5{HnF}Gj(sA%iDQr+!9Ydx! z(>z=db0879@UR`#9n=nv!_-}?5UUP9htI@He8u_!=AI5(2Q!A>EfgFa4-&$@xHAA4 z4s{==g5+O1T|){+XfQsqnieQ_^ryXhH=QR*qk-9ye%|W5@|2{jfQ&Lg61KhmCEFP4ylpz!Y*d1mKfm+kf{Nrx{lI9{ClUd~;(QEr~JNPD5qUuJqh z>z(AU5ku1|k^HFCuM(L z$&;y>gZAOkhR)R4jF08s9w%nR2dB|LB}yu_6pH1Yfe?e$#5hXxvs0##jg(37+YX5 zr7+DnMWq?!HO+7f^n&e-<)@6rGDKT2LYNTzXhQ8)t$`U{E{R9QLB)M>I_-RX7~Ft7 z$xTgig6u=g{7z~n%gW(oto<7L=Rhodi}M!J%>ko?c9qpauk^ThEo+p|uOr^Ov?SdSPAB zRT7-Jc++x+<}L`&$ZeSGq4u!+8xiNi?o`*3uMCgvX_FM(5BV2)7X@M9-9OGn9tvQm zf>A%f9X^b1MI;Mo*xum^PsJVtj~|GWlSr*%dpE&W!eFNT*q~Snu1syQ`J$2YMFL_2 z*-#3oredcOi3dxB>L#zP$SH6HT&13$@V^E5MP*Ac=H}#L39;%6GZtt}l^al! z(2(EbJ~Q4rPc;@CrX0H7(%s_S>fCzYe(}P4Lu)t>PQ3OP>vA{fryENXrVhRW1fyDH~JCU(c0im+R%lMLl0kDfyN|7m zSDwMIo|7?)-+n8t{4tQPvq_MA{WpI(DMk4L`{#_2Uv9#q|UN1G^GqdG{q z9X^Qb;3R%0)C@xjn1%Wnk=d?3oZK1om*0)e?au2in0%Z>nU*kA;1|jfesz|7LN%r; z$xgjSd3>RIhVX?)=Zz7k>K9iS!Vz;B}h)@w=w;17WzTJ z`;*KxJon5M{+$$eoz-=pPb7?uBkht5B*!+JElj&rKZot0{AqfU1@5GyU<{sj4QG7G z!6aLBj!hVPsFWG21NQeIh3f_jxEN;#!ihmp3$}6{NjAb2`Vhj6W`y<>iwncE@+H>3 zS*ZYK#Yk7RO(V2`;I{_%(;SoJD{qM$LzHdgR~84+zyU$!gDvV6I?bR7wA)zU7(Ejr z_~QZozg_q*UscPZWK|$0uFMPcwB+hUDA~N!1)Y4TQt!}T zXB1ssrJD|=!dZp_4TNckyLbw;W8yQ$G0%Or=55Q{x`bWWX9H=){Xh0^F0Uesxo!c- zo!r;Y;nugFu8x+whmu^d%qzX6Mei^YXCZW(KMj?{P=>(ED55Da2N0A%K$ZZ91*uTd-c%H)4=)hTau z`0ShINEgYPN2zBtSJ|?HS3 zSt~a%9$V7r=w#zZoSH(Lv}FULb@wc6Sg8KO{{v;Kag;ah8#tZ%Ff(V_lr(o9$?UkD z%1I$T-Mmc>kuRjn6>dli#FR81AeYp|BB9xBKNQkRIZHlrXnc^~AY?5jvG~adx=Vmc zVi!mLb``SxzEpEQ-GaQ9x2`KT@>{OI6hElNP^)D!j<@`a89z1n63xYVesV|stDlcpF&Z`W+; z1fB=m*Pq?IB1A+?VYK4iLsbYR{nf0d8u2Bg2QhESiSTPo#npvtcn!HdiDL+ofl(eb zPNW9;Dg1TN1$GCaS3x3AMqTAbbrKkulVo}XNcaT5h>3ct3vvzjsk-)`dT73v1tGuk z$_as&#wey>@0i}6DBB?#p(@eH4*)2hBSCoO?wx+lGK+fO&uKNMwd{VvY02lK(gol7 zHje9js~5guw5`(9B1(`krCCEuTrFhw$b4?P@bkKO!+vuJ95`mRq38ecl~ryZxrL6y z@B3XF?8LZxF^_T-`1Ks$bX|$iDBDoXf-(aisA25P&}cUGBpw?F!72RZ~ zqbIWS>fgf+@iN3p_wJ8%F?YLE-`BSM8zQJ*BC$*5c@kQOVGRPJm1!ph(zOeDu7a^M zQBIbMD?2rzVBmyFJLWkGmeST85#O6S<|jE<6`CgUduecqh&w?fD)@k3;dV?!ubgv| zYQfxAsI6JY7|40f=tUm45WP6&&6*@=aDpV;t&dK%3HWsVS6?3wc0Dk$eQC@R`gWTG zk5UF=C6SnL9uX5Bk(3K^q7rNdx=d3byI&6#gA7Q|n4C>i8JkHn)RL`y!eF;F%h}<>1~)cPC_;QJFk7U!qOg#~^eQPgl7vw(-Vji;36!vI5Py_? z_|C_iOq=pk9E_7wS8Za|4hQ~_k)n04{`!ad$0ikX@v7~S z)l7?ASpoob`FlNSFD0ENP~*H%0Lw6MMJxZ%?f8O;UE-3ym@;rR>LrqoPwd@f(3EE|-n9zNSq~Ik)79^$nz%!gc zNvF8CSY3+YaT=Ikxr#{j1Q#Kfyy_S>0$V>FdeCci=^2mK=Nor<4t^$O`_2Yccy3Ix z{Ssxq0#BBrn;t*cb5(yo%Xu>ty6C}bc01Klv-|1Dz95^}mw1%cc@)^yxM`q~kRDlI z_qks^ShcLVBqnC1ZkGO6!uf^2)9QM`%TMe~ewmPCx@Jh;7*sC`ZmQ7ICJzkl9jRQl zzyv7L9umRkC|(bfOG)q^0w&WYPmeASY1CUA)WzkKTVKd>b zn>kSmR^RK)9w|NR`0jOQvLn=Gb#bZ&Vtjj2x2%sW-wVr;v@p*(u9);aC2iO!DdYH4 zStyGYYlsWcf(?{xg~LEngJ};ngR8@-S_7JLiga{ROY&9tUg$zHiOv?Ot!TWE@XnA- zv;Dl?0(3G|gy#A&wE2<;-<_pZ_c`W6Ab=PY(qx~%8-UhAccmkjqJgKgo2M(bMv z*I&YD173U@42@W(V+gK0T)bmeK-OGKNy&rn z1-jV&bzLGKv{R;l=mBf=bXYKPD$2S0_=Pn5#umpMN7k{KeEwuCAY$0!p?goEpTD{f?*Z7)D7`rA;v zkQo2o?JU?mCv`(f^9s-4AhQ-z+!YEPXie7|a}EvjNfB!jAVzu&=knaseMhP?kb{@F z2S+bk<2^DqSS{-iatJdiwe_TIvvdNlV=DV9EpLL-u4~jD8ofCtX-6X2ER9e{gsdJ) zz+$^wBV#{FeSOaQB9|Cid$-h{3#bU74&Phi**U_J03@AnkL?uDPtadcV>+li`5+>& zS$l^@owZ;K)sSv*09$!ySIK> zj~8sCc`q#L>v71O!@q3_wo2%|wej)9Av|;RC0;N2O;1-3#aERpRW}4S8``TAKT6NA zq>tO)WaW|<5+efdu0~DXy!W#6F6iwo<8|h4ok|!XO^G_x^OL32?36E1>aUpg<>tWK zgX+H4<)+;wjZiT>qYD~hhg)-eRpf9F##qLHzrY_1N>6|k-Dvwo;!kD>l~KKmb+1t( zdwZykvrvJx8T^l)>5h8$BZ{x`60;LUP-z(#5f?hV4;zd`Z8u9j3EU6wJAX%DImW9t zpVvVa{{GHlwySTZ(Gc2wy_!wAh%QRK5_fPY!4Ya?bT_i9QFHoT@io0Dr&s{9^R26X z0c1om*UGxW)uDE7Q62Q`mu?sRy3uotHyQiuUQlJ%t_07d+*n9mrb{MkJndM&aTwtEJ+Win(FJxG|`Lg=B|{_>xgd*g7b%ND;Fec zidiJwV{z35Us#$^%vDRD!oq{gOlQ?%j{YNpGu8Qm=CK z9A@DCVw+s%7dVV!ps5$Hn{Bj7N_ZrrNd6Unir|Lj3e?h7E`l2PsU4cdEf?R=;+C1w zZ2H8luFd4Ha&zkZZKN^scKi8n>g0G;xSJJJ?_={g_k77#b<@&LtBAGYmQIApe=oz%gDy)LWt<9au`MLb>c@kk-1w?Ry{>r&`rt?w$a9N- zh|a?)ar^ai^?oOU`rvDnj}o$vEJ@@%f68p>BsQ(KZ`%zUEnjd?E|%ifB&Q|)YIE{O z?&+t)P2K!x`X6?@i*sZKYZ?Vi_;3sIJ(9I>{x??K4h6 z_hW3oSl6wF=pW3~cA#GJUc1cFv4aXAb^?>Q3|`*}L#QGDo-WZh77H74Suu z#9;keYj3oylVzq7|MK#^&lM&{i1e( zZqIP^uff^n&0mO4fr3Pr=$}mJ=ku?$Ue3yidNoeWq$soK$xujnxoGckQ9kv;jLE27 zzv9`B-DFr-)|49?<@n6dOaNlSR^p1V`ecz$XUx`lf_o)A!45XYB3T5R3ORi>jtoW< z)$zD=k;2e!pudT+Ab_`#o4#Y2><@(P?>4)k*V~GDA`CtUawHXg_0BT4%C4_xd*`y9 zaTw*Mk62f>Y0_ixcWL&YEYV&NxngmI7ddyi zZ+Xe=s=Yy3#M7u|Di5evGCIY);&RpuC9R{M+tN!s`?q`GMe;<>jc)wNde1+;3PKWg@uy4alK`M)T*e zT3T94JfLs-e9(OOxdQ5D01;525>{cfH){{a9Uhi}}3Aj~cR|8YY5b2)zpvDAx zTsz4!w{|>m60MAHFFtA}icM3Ef6@of+k5Tkvu~+9l7p|_a}6Q7XZ&5wiUNOMl%?_X z-2=n3eZccNQ0_wP8a67mcwK9SuC91~bzo z2b;}i4dCI-55Byg${MeZ(bY^H2ce4DGFjyaswo?_0;&mlgKB0n#;x+8!9o3tn3ExHR(}}LWc;_Hyclv~B74;2GSxQ(wJ1V8-d=z5a~%(brDmS_O4xhaT6T1u z)b1;Zc9U@p{!Wr9eGSuic;#Ih76mCCN6!me4KH5qriCZ{ZW&T z+5o&jq*H;biu*w1k3LQ}xI<*L_j&~0!*U3yU@{?;g~DOT@e-{Yd$EwZ51&fCun%QN zhD54n?v!29GNa!sr~i~$asveEoUXwbGuRKa5p)3~APrIJUNFQDUIB5=YZ@;-K4knQ zfc8|Q9BGYd;?vuJ5wS_yrcpl6WnM@&LP^slRCQKz>D-mK13Q}>F|nMtu=(g+U^7YZ zfX*E4ecG#`uJL8Ml*&$uq$M-_OUPuRoc1F7J-@}yh$3+QqIr3U@Cg)5t@lJ;k2Ti< zVG{?|TKkv_|E0RPCd4Nz*VOEoiD4CspYHdr<7C>YclmJFgA32>(>XkBY{evq^xI9$ zg1(%Z_o^d+8e^GzXkQl3pD<`K*og=}vO*2gdK#M=fuh?deVQ z)KDcm#_gMeK&}o$i<1tSwz}PGPV#RG+UXKh^6mo%sU4)P`V=u|o=4j<{(ipo3&wKe z@{*ug=iRS5o-afEH}Y+hJ_o2QruW04SLvloJKVnq zb}8_DG_ECTBI{&IjioN#x62a;Pjdz@aLxvF5(guicKD{;2xbxpmU+U+%lNyJQ|Wbz zmoL^K390?9T9b8G_#K7r`D!yQLv(pLLZcKfkb+=wh@MGE8GUYXp4|PT-;lZyG-M9C zu~0PXY1e!QjMlmpddk7p&-mWt8T=OYz5T+9m=5D2xHPLJRr+v){}?(Qk-s)kRnT9p zZ6F+kg(!n`vyYiPf~|~ysgl+o0GUy!GE(v7x`P*hd50!L6&Hl$V*CQ>RPK-Kz&jqe$7lYh7~{Rj1e3mhdRv>>Yo!S!U`O&Ml!d77#|ylAO}f zSo&k9bJ1J&;dT&?1q{j_TeFA=(OzQ+UaTC*1Y|cWQBYr8V9o zZ99`1pVc)r%F*ff)~);`Eh8<^BxWS`P z9~oQn0TNAO!vp^Pf@PCfEHXh|67>Z_?Wde;I!@lXeIMZhHo_q1m=D#;kRl0yj>D_P z&aYq`Em{r7=R>q&uKK>pu@T9b=jEPxW#HPuT--&Tb_)|2byQKVLb?^Pd8!_}mQliv z-XYB9@MHqgfU4K`v%U>f1?C}nZLkUCNBuE4n++FnyHul^rPL!Qvy48WO&eVAbp2PA z@5#Zx5eJM_ibn~UB6wKqe9|7DR=!U*%?}*gI+{CK^l95z`%JH$n4JG?`hw#3%@YI1 z{8+wbtGy>Qu~ST7Sdu)!rpPJz`K&XVusZ>Z<9iLz0udMgOzND*WqDZ z%*aAd=gDjhF4zT&D@d!~fF#SCoV;yQ5iTR^10#$sh&vV`5K@xP^d^T_z98hfA31Wjs0t&gEfX4?T@ zo-a>fCGS)~itu4fp1YHP1FJ2DKV$hYmL9NH2?8sP#O|8RB$1V43A> zZ(E$dtfg2>?*667B(hLlZ@IT5(~w@-(bX|Ky>!*pEx~!Uxhj!>g*inm&79Q|c1Ap! zjH=G=&dLm2I%oU*kjiA$D0OzdJ>4j=xXdbhmc^Chccw?`mRB}xXvtLQOe%%JWlD3V zrWn!;DvMw53j19C+`6T}5i{sQFX(~;+4mt19EAOPC8rw3h5OAbB)q~Vx4ej_Hc7hf zDH~e7YSkE-eEm6A`B;jaNJO5(GAS~cAf748KK|UelxESV0Lc@4ez^W+Ft*ddVg-|t%=_po*zkofvkeddW_U2)>DKHbJtdikbD*R6SE(=3@a*Gq0S+KT4}gUy8&sV(fw z2wA0g@5bBDEs3nW?PBKazLtJbFy#D6Rm=n8Yf1y(8d1@jM1 zZq3We&ef(!1FBRB%Sv?`_B-y3RPv;r^7sd=T&0zAB3*`??l}p2pnYX%-jv;@_Nlu~ zcShAlSz%vhAKfyVaQnvhnohOV^snzFwF{K)@<>^&S0Q+iyOLi!iZc`BsUHIkb=Cz!$|J7-WydR zna?N7?(@mC_CD=oFN*9TO}m9OX`{$5n%F90C-`BQ*hgX6XH3{q5y&ZWD1^gO$&f%{ z&G%%NTNwjR`H0_H2^HAoq6ZYxy#j?LCo58%Dph~n7xt)yoLDW#O%_Xhzf2|JglcyH zAHnx|GPHEV=vOuy_9!%vlbYd*_dw63(DUc`-IWm8D>`pbE=waX4DlEdSo5e@X74i! zHGRUQo`(31qBr@6fv4LPnxv+QX~!auAJNKF%L;>qcDdjM_9=nf8VMAX=wuqaJAUi9 zgTIQI?MVkwr6^_b3&1f~rm%ukUQ^3qmD>uICIjU^hE&W)2OX*KhkWE6NfHN`oZ|ha z6%yYtE}@I=T;BAIB$l_6R=33J6k_M(CxNINOO}hR;BBUi_WCn8S*jY}7+<5)k~{Xy zWh$de#7R?C@eTN(TGL0KKMwc7H}7O4G(D^wzpN>Nu@>8(FEHfMdKry#Q;Gu7gc!h$ovTox50ounY&$qB;AJ3QfG+!&Sn z8qBq-regk{Niq4BdQ{Myyk|n5pEMLF{5m3vgI}|XNjG2ox|1h6YHpLxtVpfb^Uf^F zTXyZj>^XHc9;qqQX3sE5WY)0P8@9?^)zz`|<$LC*$B(Hqt0Jawq`;QHG(V?0I~9Mh z>B-$OwXY;&DSro3qLd2U$=m&Ltt)I-%-y|zWAWK-ISN-ndi>Ybb-67oVI;@Ei*mBB zqx|IE;6V%WKgn$1pJ%os`}i~O9`Y@GZ3Fi>j-eb-MX3}w=VbA{&mv#tkBXZUPfG>H zA8bC7n|QGK8&x#r3FoB$C8X|`aLOK|lNE@JB@Od~tL{Fxuxj&t%hH>x^7Uc?o2pX# z@?yEmR;NXpBYBNQKDihc_XBBeqtf6^Q$@EAZP@+X&T@s(rdJx>rjih--7VM0&TH`6 zeRheNzfT985^;jfXd_y`e^pQG*~D~&3tN$8nCaQ?_xGee$@HKU@I*JD9u&aVsB~>z z-akt!KFM7X>pTpdZ9;XpHY!=rj4Z6HNkJZlXx_&*@GcRVtVWNHR7A)JUH1^@JoooU z`CI8=+o?I9yq4qpFPcd3`4a9ZH$8iFQ<$hX_P_FmK={a$0F1C zihMas3zAW>MVeP1)LXm~A)BgJxpHfA61;54_W&3i&((Gwe z1~#uvnig=TxeZFa)5uF}*N-+A3k0TU*6j83as(2YMolFo903V!LYM5HHz(RnBxLtR z^&6f9d(ekuARj$i$s9b`uZO=mlEcg)a8YxZ4F~7+Nd@QBrwtRSEva+=Gb8wkvprT# zq*jUwaP5KmW_6RGiMSOLQX)c2NQy2YMswd)jSFnL9h+|;p%b6R6OKr&k@WODr$!im z{RA9J)VA|s4}CzuOq7C$MJHR zhObJhbZO(ij%TM@sr&@53(iLup>0EG(^+%bVP?@#tZ=RZT=kx)G%_nP7ydS-`W6f` z8={g;P5)?{|8c{%*cu|I6{rW-?qAm&f%TnzzhYL*Lf$iy-CQ+{E&Ebx`Tc~72zVk% z0rH!`yy*A`>r~H!y+5KRLv5Vx;EW`APF73$Nn+xX3n$;yN%4$ji;tTOd8=<*wc`4o z;Io9UsoLj)rKt|1MkJJ^a8k7+SZr%LFXmdIO(iT}uJsms-9>(#!6OzhsVbE#T%B`* zJ)3O(qG#^{;j#x!v$JNO-yRMvxNP1Wi6Pxu7>b|2xLza{iF6)IR#>f&iF|W6ufzvJ zh1PU~Brm%rORx7Ay94DOrGZ$&anVvs=$vdbL9|6eG7mR`clEMh4f4U7`-a3kA~hEu zX2?$igqU?viPl*wE%uu^MP_mq1sA41DmFHZe+{U9D5_|NK}H|Epi?MaD^iC@{57kX z{9NN?PX-3q_+-qE4^3WRh3v}`V}{L%;`fjn5i1K*r%mNttqXFbOe|IZ-D&4^QROj8Tj%Q1Vo0gmA~ zOK6xrx=%3bfHI+XeGSIXkwT?l)T}~ml;LKv5ekUEh*}b}Yv3sOd?N|>Z}Is{76(R_ zEGBzFZzjGF5EcJ_dTHKS61ttI95N917w}RNu?I6eqkk}$E}mVvqCTty!^SdPio9gO zhRRL*HoF=_puT&Tf>awkmZ{PIP zuG-3tdzU!Q-r||n9s(<58vBy@4$LBD==_9C^eSW~lYBVSD}gCue?eWEZ+PNsTK0p{ zaLm!9iX|Un%Ox}Tk;v$g$PxbON6DF;bK>_TCflBgotkljL+?c~-{Ddu;02gm2D3j+ z_FXY=O1>+zq{;nnF@}huI!D6u~C&L3%u&1gfmcESo=o!_yrkvbDdja_9HCfa7=-h6h zFh#^_yk!}u6h-rbD;H*SBC%K|7K61uy+co>mGY!uE7G97=Y9sc5OvKI?VJ&#SM;zweYtM4KuqA=I`FQZEx%j5ZKVwwf)Pt5s9gH$1Z3(tEoFy z(^Mgq1h}w*taM761w_8#25)UU6yIm6<0U!5%dmoqG?(7^i6q=3evU1skFfJ=Tq@cV z1c6T>Fx|hb0?t!v1ATaOe2UhIhSeE~#Z=z1{4faW*sKg*vV~bjIfqlsIqBo8uVq)w zPoKO#v)dB7;!EdsMR}7%Ar8Gu0-Ct|S6Bkci;ENg_C5 z;7%)oMql&B)HQ9v#2b=4v`m`n$tO|!#H}ur{iREmsE36{pP|_Tm)s!7GB^DtQHj^wtUWw2< zIE2Ui-0eN}BJpcm&cymtSkJRHY?ErdWQkaqaH$fnMK)t{b}Iisd)1Aa=07y}i77KAFju-?TiBw}<7j^5yW?A0YCu zZ{5&;W9&Mj<2!3t%-zs>YHna`%Pbh9t7=l24vVY(OKE%t?%97&KJ#$soygXl&?HV%11e#^5=_s`Ay7Z&$NtAekv!S~~LB5y#3Mg&7$|PPyD! zl#x;BkZVsfr!;MttItliNksxisuC)77F~WAf9dmaKlMiJa=AU?_2fDf3P=T}r$ERU8H_bG1vJ8Zca%W*?Mxj%oa294{7CJ!&iBS+A`U;(|@g-E=agAGZxV))LWrAY2KMef^-hbg*j*~x?rffI#eDb`;{F?$Mhm0 z@_-c#of8rbGY1c=nU-{Q6p>M|qAu3K`-4kjbDGLynN32E%+@5UN43dY zZHYN)lC|S)-DvK}xTTx!Tcx^bw#mN69L26Da|xD^uc3Nj#2&>00lk-Bb(Nl5dc$Fm++|2gW-R>{eJT9KBp|M+47D}IE|UuO z)L%s2&21f8S9eZq6*=gtEepkn0A+2l%BK7#Z%jSzN{kP>ii(6gF)>|%_@+)+r+OIe zYtKp355QSy#5_OVEozqJDYt2gX$-}mJ!JdUdG9Suh$@y?vZKGPkehA~Z1yv2%?e1C$aUokw zZlWf|kx*l;mJHa6I`_C!Zi)$#)^&WYI+_@i-f!#~vLBv)U`^u!P7EyG1$2FbVM92T z@bH91Fm^Vf^P=MR_Hf8~z#Ml^T8}+k+d1}qS#K5mT1cXK7u9rkC@%%gV99;0pE8BmgB2Tky<)!lh ztSiY5QqR6<1Mv=IeQr0(>+6%%c0~}eYkHMz&M>ZvN_v{3u}G|>M4wG0W2tLEGP0wu zj|rPlLLR{QiV8Z{fJlxIiD;6~pr4k@lXusWeE!N!e*A-zcGH?JX!SR`6)7y)d=sio zP6PQ$J8q+EBdaXAqn}-t*wGgWq*_;~z(RKPnNLr#-$rNh$=h=;NL1w2GAhXniM{*9 z^%Hyd8l_a|o4dIUzeqVO@`3(ehprkbFHf68HY^YL7cG*Xs~~<_+T64)mlD3~v2$bV*XOJxobIff6N4$jdZ4iOQnSKO_9$~=&Zg9+%RwyrM2XEh{!IZ1 z53Pc(Z6@7BIdO3_{_T)6cgv;|(Z41+k&p1Y(9#IJjz4=PGh!aHCpvix6*qdD zE@<=B`iXc&QV_4vske}fHmQ}?HCenSHGjiq>tuPHe$+&Xtm&wkB&;mALYiq6XzctYR0w z9Cgg)pK9n?vbbVo@nTrn@(+oS=S3j8_;numhaJq(&dC>+HsG(m_Qa*jDqpT-xJs-% z-Q|}|G+@g07bl;#08L2xls>-@9D2PW@m=xcYN3$a-76?e-s967z|qHfzVYW*$ak@P ze!qfE#MpcFsO`BQ+B^w^yxbB`+A+Vix>US@zpL1bnwnUs2|03363KZL`=NdB$N9SdS8G+XA zu&HwM489P52M#phW%gHS7Wf4{gSobrVP?q?QYcU@xs4=Gx1zS9`rPss8|R))erqAS zp>Y`3L?!Mf$>*tBkCxF6kG*|Jql;;cUkK)s?|B8zA4%@$sw0uf&n9`Ndpb6M%6DWK z!}u6I`PSO(Ek8WB^sM%LHMwmgl!;_nvA(L3jsmlH_Usye@@`vtU2QBwYD%};GmMgx z?zaW{@952vYEtDYgI#Cy=|mcXMxWbSJkOPDSI*fruyo@Sm({5}C7C_R;TQjXbzM&D zioBw;TXU7J0{%T^7lAMJb3s4KMdu{Hohb!xDmOC~{Du9tOw;7I7c@u3(d-6KEx!rJ zzdnV3VF7)9n!F(7jEYZv%h8EjJL3-rC3b<>pC|2?)-z=nCW(o?n$v8bO@0n2xg*A) zbH={J*9hhy9de?o3Z+`zTxu?@B6NTKo^b^&LJ__ROlaUE>>3vTt&Q8-#@hW1T8-I;`@ir zd(!L!uAXVLR9*SgaOE?zU6zt?-Y!f5e+!r!KXp7B6-2K}Rl)=pLk9XSJ^ajCik{MJ zm!)5bo02c|sm5LwAEL_=ak}Q;K#%nw=T8MWB+evsNbCyekh}+C&>^`{ea7sPU)YJL z(-qENhqcwL2CLKoh5-x>lo((n5R|P&&ANK3bE!7#63YZ9&ByC^FWj>0;!7|)u-X_X zIn-Gr*w<=Z8z3x)P|#*eRh^nPKdR(QVO)b$O${t;>?Aq_m#1T4TTismA00F{5`MM` zO;Oy9i<*i;=KWi~>jPx>V#2JemEzX%yj)>H8;Gn7@6LLo6FD)^3dzK~a-P`4jEK{w zpxqJD(+lqz$uD1!;sZki1O63P4LD}ViSyBU!hZgpS+3tQGNKQ+c*AXeP0NiM zmHkOqe`<7dRbuedVjcNqHHq=D zD0QU3Oe}4u<20cpXjBu!pdOK6yhNA63w^B4(XShzwehsR%Ia8Ar`U5{cuQcRB z!XZ+J!cR+NN?N8h+SIyG6pF|^(QvmF3Kpf!VPHrJP7HWrCK~x4o|eeD*UlG?-Kh>A zOGxFkLRaln`WyT$IQM?+SF^p1Vl%ysx=YY{N@5`Pi##+U^so4Q32A`5BaaheMLFHlFKh0yI+fyOd)5&r6oC6*01%p4vh}AdQ+=!TO3+cifCjKf{-d?a$j*E z;Yv9;U)!S5MQuJ{8$2-VXY~eMG-7q@q(+-bWeS*VVTZ*PDXnZT?HCLx)H;^c+4W|Z zR;n}TR3^999&%WmkEfEZ9r&+ef^UBARw*=uK@Jjdf`!%eli@^z#gYFj_3ix*Gg^C_ykvax>%zj zyX|wEH+*Vs{6gUXi%X|e%>)GM#g*MrLFdakq6JeXc!Bk6z4YpLZR_)r5^a~SblF&} zv7&P}Bmg-;Km9xWF3B;h3A?*0rBCy`vN?#kQC4nBuZ-5!aukKt+2s+wDZbt-IQmz7N7c%oUpafJ<-_k{)b3g=XGgUXcKiG&3@V#N zWM?Sysz_WjkLZ_(pNO;~9ppi5BeweFSVu={V_KAsVT&(?rCjhwxqNtI-|E#=+Bb|Q zw!AM7Cw8iDC^Bg26Hv~d>aE4aP-G0n#2}^4)Z$@hYZWgj_cb??Rdb0i5+=TMp>dsD zMBY1e#h9M&2vC8VGc8Y7#HZ*8GWaDW&`(6@raH$V-qL zo1RAWm2{KCxDR|4!YC>36)WyVx=Rv}M?0|gsdxv6B9vj9EzF{_3nClt=;OkOv6{1e zT1fBX-XXad`)xn_ChCP+Em1|SIZ;xvv4iG^C*FUCoHLQZ-3SJa#HPyc}_wpzKsy;18A!FUE%ZI{NzhnwP84+^4dAY9vG6 zp^4e>tH@+$Q)1xt42pTr6t9c4m=kRk&a0xm5FI`sluF7NjXRb%qp)@5h6XYbq?B{T zE=(wJ-K>O)If}+G_*IdZR;8%Xs)2+Sr@$&z7bD_3_2yLXTtwqZKMSS!F6_3c^#{5T zeOKS$M@-duc_(K=gx33R^o@3AeS+Z2c8-$R*439CzU=T;RL)zXKh}Fg-+{g^ziBlh z{MNo+MEK=Ha2a|}whW0?x>X6UM!(x@on(-tSB+dl@Vmy9A5_PCVMhJX?CU)Lr9}E! z6s<;KY{6Vr1GP%v8kg^CSOr?+xzMW8YVQZGDYyrz9dDnXl@lLSOWY_T5n)C|KBVN# zF8XYCq^eV>Z;CqQL{+Dd$+}LV9)nW09osTxZ(AfLnYO34tF}*0ZdVcJVZ;`lNtA1v z@|wp{s!6qRsBf^XFWFZpgco6EwD{gW2@*G54c%0QO-waa3sJ=N78g1$=9)hGa(xJW z1-{&N?|pzDVxq;#9x5x@$~5LCPOOyFZARuoSkf<`Xgg z>edfCTm)7V?e{aJvA@>E9+k|^*`-nKUILwFF^8b~5TCx#j*fXv1akS=y&d024xuw> zpcg(cHgV06QzRR7ip0XUb@}?94p(DLVC%;><1;rZvK}#jfR8pr5QXV?iQ{nAk(n-+ zoYP*$Z$6=OQcianpDZz0$rE@P;)w@GwrtnsA5T{POi2L)O@0t{zI~aZ{+>`;;y!QOL=z8@Dqc{%|IetuC8^MH zgkS4WQ7GR_%6Y}Py+$McNd+$_B{U1?<(__*{1Kej0_?sTezaKCu}FjqmGQ0;W914e zPC_&_aV=#$TvC<@uA@KQ&m|bPucT!6Dz-vi`UNmup-rKJqln>UMT86{nIUO;@ z)&%uF1=T))<`Rp(@&bQcYiLSI>-`JroA=SnSy!NeQVlQ3A5pU3lbo|PnQU`&lKXJ{ zb_wfgOQu@kyWh!4$QIr}%EA!GaQsn1X^MNjF*8F<5%^;`ir9JMW}0}IaoA=liQDAz zbN@a|SF4kuQAIY5$f{5vvLYh0^tqi(?VUuSu~%lOB(FBg z)H8}QzOE!5aYYDB9CN!-*UXb86;@(`{ip$EKR+8vYv3+KRs;8Qw9Q7OZ@smz`NDrE zHqNXCUWgh!^BUp;Z8Hht78$TKC8BvdD|zG*iOQM@MKT5;f9Dr+U@9gfS(}P{=nI6x z6!k~4dceG%fviUoawQE~D=*SYIYFuf9y|>mR2x+kK`H6Vk3mSLfEZR~)K+$g{bMWl z5+@*SJlKX>hj$>Ct1y$fjCY>!m}rxsjPEb8C6&qEZ=^N-^nhd$Hc$`N&g&$Lj!i=o zS6uM3aOO^;szLG^bPj?q)6h2od6xtFgyRlEpOjD76PaX;3n5;;(fo=7J za}2e`8Z^i~!I;`=w(z(lkwtxDD9)lwYV8&ackY}_KzogH_;dIs(uPH$|JpVs)issD zlP54#D^dnelr*fvVb&-naf8O* z1^6akIO=w;XpIdwIRlHXSd^s=AxEG!YNyo#*R`Y6x241W&8#bFR|Z^;q!IsDl~Td_ zTme1w?UOxGompqs(P|x^25|3%@v?}tXYp-#aYJd7Dd7$Q4Rx?d+*5@>{5oW&GtMaY17CzTiqoep~XKA9@ zmPteePXe9mM+-iS)hozCOVS-Hi^iAbdauQj_SmvEv)8~7Z};sVi!g%QkcCQK#z+Z{ zqA7xazbe0SI}>9&dThC{(GkAi<1vOZkfRIuH*gba!4g<@%7A&x;8aOP>%Q;`>LU7O zb}#V=v;{AqymBP)HR%B{uRN!JsMs5IW-%H9YE*Sa#7W^Mf|R+I7w`O3bYxGLCgk@D zOtsCDOzB8k3vDee?wn5{mrDSVRU3ImXZg%sBUcRhps8jVUawYJ3@l|*4~>ir=$%Tv z17$#);97i+VxX4EVyP*)F^kp$!=m6siR10NjB+CIbzyJn2}J{sHS9;NZDRRwJ4zvA zea;m(*tOE=x|Z(AqRClW+a4SAq6VB+pCJF1EoV0e42)dwx0nlV{6DJH&qWi-(VZ=D zO~Otm&`GOHA+0R*_)MXk*_IEPUE%s%ZiiCi#bQ{;u^7a#M^Bh}-s~%bub1?gS*4Oo z?mX&y!H4^NhTuJpz48YP2WA_Oih@&js%w2bXZB$Vx;aZUy9*P)-E6LWm30?_!H%>O zs&?A!%k@Mbeke4uf8oL%-HzvobjBPosc_;QyUiN0v2q2icYCZVxNdhp(0BPrIMBPU zs4ujt?I9E7B@6y-@DgRha#;L?T8*iMGB{S^Lq3=6i;2rzj|h*1c3bwVc8ku~o7M8K zbEz}4<=`_x72!g)i@DhTNo*Lz!?nLV!82xRVt%-GwLR60B_-!lP0VM8^l&& z2Rj&S6np{;U}|s#>ih-ZlUNdK1xHG>G@O)5lVQR;1eaJ*I+<485>AY;ij9Ciuns17UKtGh zzx4bv7>cUB!!K7cEsWeFqKpk``C1UfUXr_h-x$W&eyjpwwAew@;xnS2hX)kmxL&QBSM&2rsO}zl}c(wQ2&3 z9}B3F7+Wv~vJQ(`_<&w@EWFpXOTVAoU#)?i)u(e>kohiMh=D&0Wz}kd91;kdvUX_C ztrnj^&#KdS^H^HI|6_(b;)R^YRry-|eWN0Exjb!4ib!r3L5>eY9fYbd9M3_V_g`@6 z7&!VgZT~MLw?`cE>*uvWoEcocvBbhA*Hu{9J{=#tr?8Ylm5J}GY}8Np+<1`M=9bM2Rv^7`l%GGMIy=LP7Q z{(-mw9R3S!wcJ;E-=we330UBqs&yk!9n#z`aoiw&K~e(C{Bg`uZT49;YDsvgYkRQL zv78%;Z>)u{GF=aNs-&e=$2#^pjurQ|e>J@qN8MGaLe3b@2%XD5dw?IF~k z+TyE9nhh#uOLZo3cVa`XWjv*yGlM)F@mJ3qu{c&7D?+>Y92~0#T1MA%m=>Hu*?fpm zX?O@tBa06Wk6$_L3632eUv$N=|L++~%x#a`SjHT4H+K+k z_v{~w1qS!@_v{;u1O|5xx|<_LeYnNvYYyoLk;JbAZ{w%oh!6tIPuUYRBA`x0fLcsP zC*pPqi9n!v4|jPZ2-IH~1kPdO85*7s0^8TL8bdzllhpV^rm^c2?)b*m(yD?<1cBz9 z%a( zVJwu1lEOs)KmT4AtF!IV?Z;}&58~&}sEc#Mqv!KMwc$T_9Vcn2lveUerNLz58#!9= zdtGXkRVyWc2UZ6*4LuN7uy$i|QL{AOL z+9Ws`Sg^L}YD?M`aI`W?ZVTnz?ufr-L36-UT9LCCB34LZN=8!VK-%hahFbetgT&!@ zZ^Fo^ScTQ5F{ntER~amNlTIJ($VED%dKsf+EOw1vDN%3=i`HP$34sm~Nj(Q%A|Jw1 zSmZe7w)@eFa2l4e@Af}pWFFD%4nHQXa{gIyXTzCuXMWxQ#I>d0e@BgAz$#gz_R*#amNY% z5`G69u^&rLsh##Rm^z_x%AC+5JPGlg)2TG=QSQg~RP`W=Ni>B0&{nv{D3;GRH*$ps z;c#dP^)Nc`I}*;?l*GeQlF|EZHt01IJ0+4W1TA<;EiRRF2B8u`y(N*~4PFxr9F$jr zQphX!Ivik!TtN{i-h{tIyaz|yg)Mp7;Y$VNhPG&FzV| zY6){-k9mK60@e1}Gp$805VM;q;$R&v*Fr1j*2?j%IKCWb^fej?h6WngmCDM$%~C|KpQVUGQKg9J zM%`V1C(`HJ_{YSvYsR0$T;SIz5{K->Y$Oi+=7hk+8M+MKfVR%f1oyZZ(z=JAv2`Ma zzCF9l4RJS6kFNQp_2`=4S0jqPhK;0B{6-2FqCR)nK;uhR5$K#Ke@wus2kxYRF5+{C z3^Xw|h8EuL4eJ1TGyYo!I(9fImp%0qC5N+;DH))8mu96BoRUkw@DL>@;Y}6u7nC0X zf5PvCGjw7t2ob$?TqdLSkOfXS1-YOtgQrUhTCnWV$=N;feZ&=5LolsABT?}d0r`j3-fgx*IPLXm#g{8 z834La;FM&|0+Ou^{xVL9=SL@=!8q{tDVrAlV6HOmFEMf_|7GKD*8K>%4=U#u;Qtz< zUtmt$N;7-NFtjX)LB)6i1*Ke8IiS|z(89fVLdi=g2ru{Rc$$6wyU>P^gidGSWhRqD zsZpyLz`DKgy;NiIn4P-HpD50PY&k}}Al6Vbm;%$H>g4B7P;vq_z&&G><&*A2gk*1cBkz(Z*GTK|nEr9>8oPgi+ z%jrMj7`YXlxQp4LH-VQi2d2aCI>nG)^ALx&>i+x(b*NL9&e?M9x!4E%8=#G0yCY!=M)}^NV8O+*u0k+WbhE5m^mJaC z{tfsi$z|f$kf(!xQ5@SBPcd8wj&2(UhsK?mkHd&rZ9Z>w-=y_Hhcl#?o8*>kIGnc1 z6}GhBSKUeN^QUbJuvxA|$r|WEyr$B?p(!+~_cPw=9&4{JgRTg@=qo=1j{+xV#&pLx ztc>4vT+Qe$821{Y{Y%vvbLouO&J5sDncAYeRmvM&CaZ@7 zt7N38f3#n4g#@Wo2tg`5JpCu|Eb)|BV`@HzY0G%|Y1-yC4w5Y7nzQX^#XRHrK=i!n zKdV9uk#i~()vId$dqM~mJS^)egu+c8j`K8~>kAdpjbbR&jIPZ{&aQ#uc@zX7=gFt! z#2_3(_4t4pW_z?_@#0d)lJU}!$x{3B)undyS9s-z#8UDVxR%D};2I9WKgaOlDVifO zloc045SkjnYUSk~Nugi?X=F5OjEA27+AvVrAV=ep=b^5~t^62$XI8(Lerl@1CFj<7?YU znUs*K1UQ~`a6D=_9w+8Ox@rHET1TFS!(uTzc<;E*L{|p{ha;X=CT1_I{j@XroI0Dq zXDpqd#?_|mq8!1R1D0S^pvIRiT|yGZsMj7aF~ruLxM}ZC|M5p#5k!>1A)Nsa{q!f` zp%;~c3Jyj_{zGLPj_320C-F}5Hq4Hhr!bwdj7Lt<#$U3gUrI3KSwqqwC`*det}mf; zrUFBxOD8lrFY^|yLZP+rAd8MlQuFuUkFNin3eZ}IK&5mJom{SSnbQ7uKPeMji0_wG zo&*)~$(Cm@J02~`Ik}emrIGz5ReSUqkumEQNX$6QJ?0)%l<<+2@9}C@y%s{M)S~fhfa7^X9FH4OLYUIA*lBzRrp8EIH^rLhs+fK- zOV|kThBn+8C6p#OqL@H+c6WDCq#^3H`3(#n>4Z4vkMQYFE{AvqO0mFw0gRqJ3C2DT zt&Qj|Eq~(ZaX6w+O`CCzw%;S8(I_n_C~izj`OrE;y)U~p)qPCu%o z+fjKRYK1p(intb=gzwkE_iFL|b>jQaPcu*|egWTKFTP(k%|Kp7?{B~+(P=XHHN&L!xpgn<9aE}Q8eR5ELCmD_u3im+!?W+7vWe+ zN>P5lUO+Y?pO;eTXp?;2@5|+LIlUfUQ5;#C&k1?~UWrv&=>G+{?*zz5Q&WTte1{F# zthna)zt`YaYmlA2&-rauLi;B1xHOSU8I=#crxOI-dk-m1sboSrF@f%yR1dwU)$6tI zJ)|;=cM+~QL~O)=LS9+NJP^=9Tj9j1Q$f<~>*abO<~f@ZS@A-!Vm4;!s|HZ;7m>`H zp@U&im?I8H#7tLq%C&Bj*`<>KJwP`*lEhszhb2B=w*r-px%YHBu^O8uo+RJK)?n8? zk1fML4c%J`d>`Ym4ERAw(H7&{`uf_qn8e^M) zQ`RB);~Fai^66z>vb~rdb(KMIif5oTJez*A{cL*PK_=nJ*J?R|T2i1UgLM>>kCAhu z7GgPdz8<8N+N9?laPnm9o-eG`0jb7mbod1+t_u&gMfJ3VW@%+=c=y2N`;uc@c5WF< zrdEG^nHGM|VX_AWN^5D$MR+-h6Ea$=O!coRW){YT)cCet+s0Dh<4bSf*dqI}Od%sF zM$NoTY4iqtG~$XF0KKBiYN~7a>qg!te=%gl_ zN$W}3;-#1`lpoy>d4CL2{b}-TKoMV&V@N*NO}}s)(sW%JU4eL=VzHrcIE)e4;502^ z;Tnx%6WA8){%7DituN7m;^5Hw4J1{d%HWj}%|*v1+%BHtVrB4ZNl^%Jh0e|b7myex z(P^fbq3txlv0k`bo~Nz7@MpsyTrW`KCb9MIp^3mU8Cgt6$6OoAz;_%j++ql|P%~n< zbo!!r5>>+?H1(C^^~Kt+i?5$vQ&sTk8832n@%#i-uV^DPIw&`T-nS7Fw&#{_9tz^L z&TF-K)g&Ga40OZ|3_55}FsMX6`?Sk)U&Q)5Jc4eQmie%w8;i;U3Fwb4*!w7b{gJK2@bAmIARYO8Linu zgDZuWC3^=J-nyyz|4HG(Lq#k50mZ8|Dpv2*+k84``Hiy5Q>M;k`|#UioD^tPwuq~8zC3-9G)YCYTobGfM1N-Ot)o1Usci{$?%m+QnDwdv{XXLIp&Kbr_nM> z!DYxLj5cFi&fs_2)!Iz&no`G(MM>G0RZ3LO_5kfRI9*1oN01pUM%LodnLHMgN@?-L zT85yEEP}Lt4AL6O$R_MABqOd89U?cZ9~x|?nxKq43T1@%cqhi<6qhKY6=(`^O`V-h zTu5SqGLnZYAe4cuP+3-8K2wVR~(U8s;jr^== zkTaqoohKU7T#k6G>9Q|u(&JK%%WUYNr<~Z{LM>>{=O^5qv_2LY!-l& zcNkrM4GwfYtBf)U4nHHM{h4;Bd*G_&iAp%o+ zM8+#WPq1pOiq%?mR-az3F&QafR402kENI;|o+dskr72V^rnsMRYdDQXFuSxePN$>J zX)}Fmz}q-y^$I$t*}zn8(|PPhX zF>=jEI$v#N*UjI);r4GGE_B^;M!Z)3Xl-3xYMy9!+NxIvZa8@MzQtpo`rei3I(pA{ zZ(4Hm%6N3yb>mBJS`~{dzpmCx@6ytihZ@TS^Pl&V(+D=$UiEg+Dr(P#I^j8Z4^@lY)iA>GeVeAs7l>pAH$ z2}J+`+7CF2MG!TA4N|BL>w5+h@OMt7z3>Msp2q(NLWdw|J??N6&1G<~Bros+LB%Gx zVi{a{jG7b=vO!GAi|4+bcbrYF!31Qtd1s_hwfbJjg5n8VU!xeFKIah}8ac(9G`}q_ z4D%X)bD(KuXGAGg(hz6MHO-TU`_~*2;CP2q2rSy)pIEzjU)LuT#vnQ=tujqK2xq(!+xiTa#(!Q?jw}g` zbOuI70-XdpG41UsOeH@J4nnT!1y`PG)xaM^p$smc8dw4ip7x~6MGj0D%HWD)6z5*}p8WlB0|XBV`f;n>upi zO;&I3*6tmw2E})I<<6#+Ee;{v70a&bO)(Ti(l{yCwN4!DTYY4G%G$iF*uG;pa%A-G z%Q|#ctBSKmA%am;7Kg>0S`ZHRrpz+I2hE&LYDp~!xmqGdhu0z1`Rsb9z-zs3V`Ti` zQ1j+RMHNmZ7VSVXW}8+@IwcV-1mRq9D(2+M`0f*ai3E$5aqrVYm~*a*nf;JjC%H*_ ztz;6b^^p>LMVuAeN7avMoXOy2XV|CS5CC~4zzv*|PC@;+!j|x%%{=FR#~C>(snDvx zLzE@a9WV9=*~d9UC4pBy3HEPIXTMvAq2HAnA|6L77BS=BXE;VeDb&jMf1Jd>cJ5HF8*5iT>QLU(gIMR1>d3V#c@q$1jWWo5_*K`#oN^Vo@hJI@*64F_X zb{9S-M{rtO>9zISwmrNf|IHnb?rUas1|gd?`wX<+qBmtn3(18jog=`#K#oG;|@w&R5Y=_!NuDb0$` zGU%wQ$k}nOC{LvZeIkzQyI zve*J__&F?w@5Z!P0N-7rZLC|2tkb#E_~Xz}l<=>gpwrD{xC}H?#uZ&hIS(Ml3O&g?yY{l|}P@~8J5zYbmlm3K7Jp<-qrA*f@6@R}5G z;o$f0g;w(Ag9p!k8d=L5SKPEb5?pfqQg{sqmLMznX=tC0O43lbB%Z;7_!A|TxA6@8 z!3-L;dsUD}+*vb5KZgdhzT0rV9ZIJ!U_8b67jcwgRPu8<$bS?GU;Xh_y_KhMnM#2S zsljje#SO9_p>2d4E!D#vEmjnb*|eV_`H;_G7g*^DC~K$!Q}+JTj6v+BvmB25IY`qc ztOMEA|2`FW!yhdBP0_CUpmni9;vPID#Hr8(mu)nuD7pSY2Gw`onPao|^f?k0AsYmT zR!(t7?OV-IDGm%5SM?;6G8IiJO??}$Dy_eJZNk)Z<>X25Hq9%jdA2k$)KRoHEwH#O zXsf(0Wb!zKz|fwIol{&T-rL1z(`m&3m)= z)qXzvdOd5c@76=8%{#ZHt210vVd)NHn(=vVZ{kZ&a&rHE_imz{`-;XdRYkWi=(SmB zRDB{lTWrS>@25D4_*ZAnkuSK}zf+3^EPq&isSz^YX^~FKLpajhT!=MiCqy8}9Go5P zog{o68W+0^w6BSa0YZt0wJYmQ4Op4eSDJqc1pbBdB%nsyo<^;(Yr4He)|Q&8R=S)> z?5Eq`n-7})5Y#rq(8JZP+A>jgK+b+WMBlQOdXi23HsQTYUNYn0hE9F?`%IELi3x>i|Fz254>pCUhS}1>}t&(C~!*#LE4Dps3 zNp`%Uh@hUs8h;33d)E>%CD40CT;X4K#y19+*tk~T?@6USM0dXa)Tk)Ixa(cBAkV+I zrtDLiajnRVzYKOS|HE@SzXM!H2$cD^Hog=Ql#KMd6~sShV1N1`}?H)s}HTE>}^LF7l%B1qnBF zib(W3P~KPrELD+p@tK&Flr~E;z8j#DF?6rECgV66Y3raM?1qmveW zQV%WAqXF!WKT?W6KXCdhUf{=8^%#qlDJ#Kp@2Beg&Sx3$+OLOZg5+%fq7B1l&2(>* zt`3gPT_RqXmzJMxI5Z9_NZ58?&UsK=ijMw>RbX)KSQ}D0bf|2V9vM3(4Q*LiF86y2 zQ88zG6WV)#p77n(GI`ofoL!_ahO26f-gXb1YEF#tfncR*a~On3@Ko$MJyNWNK~yA& z@z?>YQ7qTrf<6EWZh`Ci3Ce&iB9sve(u1jTKjTEFV* zZ?)|QJUV!R2d096S7YaE_FnF{=?rs8C;BEVe-R$%pAC}NfIONFx=a<~pCcnk|{<$9n#8;;@R>bL$Jrku0Zrl5TIBTPZG-IBc+Zcw{0eTx-pyJdu^Q+GuR9 z7y7;!FOljka9DcME<$N6XgB6LGBGY38PSG3c1?Js;sH5bvGbfZYcqeBmL}SDmt%B+ zVJt+MzCkAeEV{9}u{R@R$GZuB!tMvGipG=agqYIsUrCcFZ2ObmEO9##?E^yIciL0n zt~_9YR9PX+k`sh6#JL+h`}+!dGo!G6ETX5U{11n0a_2a|^RdV{u`ca&0nyJTvL$;B z&6CpIo|1D@=K5m;?T+08?$o~|D9SmVKkoN=WXP5o<1&?flra4vUI&+>Vb!?FYT2Rb z3_GTZ=G$3Z&6W!Dn~1Ykt4o}>s)*3ljGOSNV#X^P;dsp&Ep>IX+LMfl9H50lWTNt; zJxaENp7^50>Y$dGQ|uc|z1QIcq>OHvU!L~^x3j4ryG3ORod6at=LhBEC7eMVCB)GG@VFHq7)zM#-%o; zS6n`4@0USt@4Msb{TP7`VK&c+v<^0Bqu5KO5m|6RIEX-4_&X)S(0vc|B^L(4=!q&! ztLX!Pz!QbCBGh(CJn3C}hOwhC=FoB1tU{sMwIa4vhb*0t3OCieu|;?xI}^(5)oe)G zG#_u5#3L8@lr3W>E;h`{UBvu9Zg#c7iRsxpX0`-0I8ASI6Iy~`sJQ$jXA>OZ9r@Ws zb+*>M^#)FOJylnq*MVCCn9z&!_35Ea>oPgaJ0+}HGNyS|w6lQH>o|PqGMkc&-XCr) z7u|k`D{L4x#IXoZm%jFu9W4}nqe`R1`|_zDL`l``c~Z^J9;v!LQzzyU;TEt9M9cK zWI^eOUsfOAfWE@s)FrAr!SO9dyVaLhT`?6yEhi(xvE=oq)tIbnEesZN*m*gbEV`6! z2Es><*M;m_GX9nF<=}UxQDnwS1Q#(DJ|SYww`U|+;7k@AB7-@{dE>uK{Bdl4e2bZn z*S|1l9tVdDO2AJ_0GIY(5~vM^>e3dYMsWy!AU`2I{84xiPR0B2UA(w9X^bNFYTR3% zFEM(5fPNhHe=L%6w^?1L@$GeLDLSmgb!^?Y2x&YrkBO^IzYBR+U5U*U|0q9b+#m84-+%R39w-!J= zfZj-EPohP&VHTrNye}5F`~iL=>?Pw}`XqnA(6e1$0O~zFazODFN&bHrid;S4Q1mZ~ zgMB{;?~No?BHdl^yMBhT5@T+EEAq0ia(^;7v>w4VtMc_;vMHc`AX;dhK$qmDB7HNO zuU2rlYmQf|0TPK7`ubGaE1@VtJnI5Djboin=MaR?Ks5P|7<#W5211+}?%Cqiz4`c_ zIu&s*mr8NKVLV`lnA|1SaqNI#aiYIfW4BTd`~F)}zARPH!#P=j?>}}kk;|@^4oW`) z_-EhmB7I|meEl-iN80b%$McYaih{uE*HFId_wG)Rsg0dxfDS4(eKFDN?a_h3QbAbW zV&ae2#oxfy(05Zcf?t({|C#W~#8yrFV@26%XQ@}PA)4K2Ml*ntm&@6{Qc0S+0TH4` z&VjjtSXP2GOCz1p`(L}`vjB#&QIxs5>fyf05rbc8sFo{(iv7Y_1>D3@Lc@q<6>Dlr zI3*}ERZg3=Z5`Tw4yx)N=aY<=tIS=gQ@Wu$_*?pyH4v$a&^cW~bdJWHp}95KG90GW zqOgDBKYb*);dGW4%j@PX#w8=HbY5T(IOW7fba6bk_*|q0RXQ?L3{x%q2KCn_%^?yI zZKPxHCfw34zeVa*OChjTj$&GcWP-rVy6~pfVkqj7i?l>u&}CyhZU!mV3YxSRZX{B< zkrwGgK|AX*opg(dabCihyM7`)ZJ#Xz#cZ@LLW9z}+%@g5VcYsn*Qwb|JnGSpzoW|^ z-D-9Hj>mQeGB3=hbY4~5>@-l0Es#N=GsV>uj^iT<2^jH!?|YQ>j%JkLP@Jap5bJlr zDz9UMzsrsJrXQJQ-^6G3bG7-7d=1UJ~|ZSYP>Iij8t|!^|b06?<@T7G1yN&)j4kDNHdJ} zyg^*I3MmJkIZFSfGC9K0MDWw*klnVB6Kx{O6kbuo@5T5~ou06DJXT#m2}y(P3038| z1Y=tE!^CUcb!gQdJQrv*9AfHIsS_pH6c{td5+-2{mkq|m!nJ?MMMy9yo>fs2e^)!v zO`MTk_HNuwl?m4*ir7UhHOc9<8O(nYBn<^^1z+`SoYr-sh)Cn=Sbpo7CQkq+Bn_0i?8k!E1r-??#l9BOZYBHm$M;xXqR0eLjDbaR{yHvF~ zqju%fU8LuMs%~SNjJ#xCJz`pK$^H}*zJuGP=19+&fpjPL<37CA*uDsC&Zrr497q0y zaTS~?@gjG!#|O72d<`x6SD(4O#m079$v*n3#MZ98rQ#Qwx9M=9mo}%6V#ARC=EXdVXX92f9xXY{0A|r@Tqy)q ztfkec+SY&rn6lNC=#R40kOAsFXvD5s)1#etJ3~!ATIgc2ppbgIWit0!02Cv9)AZhR zUyoNcspc^!lHF{2+nV5t4oZR$MMGt7Ip|@cLz=Lqen0^8*Mg@SfxTxi$dQe(yWm>mGjE@^zG0Nyp!C zx8ZXWKg$m$tbJTo8VeF624fZgvy2z?;ysM_EQTVfGr;>^aL5YS9iOkw4d(EGDy^j+ z-82?Tg+v@p5pu79!m_WHvBv_0P3K7E@?=TYWFQ(FiO%XULqU@K_&I+={@{;t>q4c> z6|o4J^xbmGW3(&#CQl)9$}`K}^-PxBU1@q9?-Lj+n&LxcIsqEeq44-WFQCU*j#Srt*y zizQQ}6@$eQA~JF$#TU*`UIIaw`?Nz5+*Oa&5x-0PsM~e}?J|$Wz;yH!F=39;70_2C zI&(v4@A~s53QZbogI-4;y4&fc=hlu3fhd{RA~5dyQ-_`w4m3nm zuM*{%twg7H*X7w}%94&<-U=C@G_`0Q=>}csa|&}ZL*U9DM(S)Y3F6P1rMAb<9md5I zVATvkZnzlv&6M-Xa2tj1_+l*A4w}P_4+S>`S4Ngp^H+utSB*n73W6%?4F9iL6>X@o zl@Oz3n}&K<0RCu2_P(x|#eH8?3X0GuNgRr6Dr8!40xbuc$b8TW56_AE*epN*=EHEO z5ljH~gJwr15CKt&a5T)S~S=?0#{a|r02 zi%%L`068@P^7Mk>Q7_(3GRC2Y?8?dF#;(wsY1Dq=-H!4$Yno4K68jrwjT}q#tEXy| zG6T}YHCB2ujTF9O$TW9wIvkJ7fvDncMKwq?hOWnfhM9&j=uyE6@s|xEQnW8aw4!n= ze3If4D=%cq8FLBTp&%8CB^lb|@%Bw}+uPlq{YB9Hs)yba+T7~S_&V|Gdf(ZjHGOVO zWG~_>TKE9-@8s#6LBpPuolzS2%ELy|v$ve^KFbW1m#_E5=a!5rVs!Mi0k2&m z+AkY>fmg;GWVMd@(4J_0GGB2(hl;-+NTZXia?@ddd#Fd^i=~sScJnkacU7(%=6VLi z19>x*w5QJm;-SBpN_Lmf`bMmW6QC1vdszdLc0$#ZG6cCTfOxuYrbusNVKxJpx4AC| zzk}n#J%sD;M{5VBD0_r~3OObyZMo#Nw$4Lc_x_pAIgGL2)SVYcSVz{7JOPAl$QtH^+zo0@PpOQay8w4Uiqz;TS)!qQGs|2yEmZ_oi*YO20(fL z_uG&ej22-9LSB^uF@+D5)S!c1fUlzS;Hb<2Z11NdDan%%=g2uGx%}*1tw_s&ZBzSV zBE};!lDl>iqQ+V@K3P+hwgcS1u#R*AQVo6* z@{?vw%MSLZ04(yqR%tX1HIa%%Ul%hgVb;c$o1my9s1JM!ZKhioEa>5pt&3Q^!-#Y~ zjHYpF{4*SzDr3%#uJZNr$XeVJNYaqEv-q$B>)%21Mmx67IEjYUj3rCurhwAbvju$U zB|XB34xDJavnyeu3j}-MbKfeWu}pp~*q5gA(}R~Md`=FrLVzOPxVy?|U^(FDWNOn; zxAopR5rT-HSz`iG*nxz{F5CcAV~8XRkvxM|SaOyfh7%HAE?$r%saN>*WDWNQ1_2f4 zp)%YQRnd}pR7;l(kvUQeGrV(Wfw11$xs*xvV7P8ckwc)W=$iOGkbsBK2QuKQb@ZQ( z0%9Vh)vzQK?+_cTG*ardQdR6!o5|3mA-WId3}}4yfRv#{+Hx^$H^{}$hfAe58OueD!?}4m;BkS8UAVnEs@E^9xS=PZH#qp-lcG%s^S5M z4}nf;I_LHSM0*K`nSH?>TIr49eSD3iw~geY-W8zQQRUe(SOn#kw{JHqz9Bt|vZVUe zjW2S$*KzA=E-;kad$%*?`Gx#ZBWhexA`#n4?7GX)1fov85?MyCU3?}L`|^H}epSKm zUp}vlzA)kJe6FqGn>$qAds^L$I1Gd3)%EB}Ox!8Uh*?0jMs91=L%ODZ>7vJ`uVf1J znq}8hS9?W~6J2gA9!{gS0qmqubA<$QSTy~~QLdBz*Sx|cETLSn6y)+psH7gj@H?ip ztyPD29(C$NYGj?MD%dpc_1@I}49e!e8HWYa#KDt^!hF=zHyXdP!%8+Ac7e=|yrrq} z`BMg5xuIOdxQk0YpStxCP3C=#Sp0cIo;9C|kppqJ3G{13i^(V!pcSCXPvN}lk4A4E zD=Zy$Pr_)E&BY@YhmWKL$oCbRQkz^r)K!$e_hd9+yduOI6CDCos-#DaV@gkUFU*p`%he)m9u$~ z8r|jf+7pCk%_|;$e>HU1HE#P2pj3?hO!(t!RTK))D)}w>=XYh2LkXUyRe;=RKcp`6vxGDy9%pzOb z6JA#I;8_XG*H!9Wq`U9ZFKC!Gwz0yw$3eQVlW$ny47VvWWG`_(V8@9E{#<{4qHpQ; z5$yf7o0fRFtna6yu`I`-vn&*U6S`vDffIWa&xw!1Eq}}4@Xg8@@T3sb5!?8?otv;J zpxqW|#-T{&v)&r;hI%aB;UI2>Lujj)81OAcZrL)pGcyAIfpaxjlU38xO>}rH8LCG3 za&Obp*@a@Lkxd>Edv4nbS0nEI)^nqMJ3Ublg7FK$sdSm-3Vb)b8$#KpM1r5Kz6yDl zNWD03Zhd=>t6AB$@RTzAkscFoqZ;p4#m|TIhNIiUoC0uo{QH*;<8)&{4dGq{P6+4c z2#7xN?ri|9DADar_lDwwc!2;dKg3K1p3jdDQt{-A`z{o4;(J$6|BmUeffR8o^PfF8{G4G*7x2O8Uy904NFHyQygoiTzlFh-g!7X7FjuWnW$fW}vRZo( z5FkijsCmXMnRv{Gqx|ZE3SA9al605(YJJ3_tOUp!2FM%Iyq>FbFxjroq#pe0vo1oE zf)CJZTx=Nv{t#J(lf4=3!+HjGh4=%8W*nXBs7>P1Q)o2!SLA7n_mlve#m$QUqKNAz z@g`6tRKFM4(XD{iE%!A|vf%}Nq;!h1nuj*gK48hkOHVG2gU2LV+OSci zJRg%LbcqYfPjKu^P*idK1ALgB@JBtkiIuQ@H%9z>LI@G}kz88uEk+Z`jQy;9@&@iF zBV2szyZKJY-%9Xbs3dXRdiFc99jpKRT%F2)5uTUKBHg_k_-F5Lpna9RcddePFao|N zZGw1kIJ2W{SMwA?FW}*X=9DuGP_+6diKiBR+G;1VbRQs|8heT#&ybScE0mks)ch?N z4-2#1R3tY=EJXX)7GOUTJe`3m<<8ME9q2cB~dM&zbp zp-3U@a2M#l|0_iBhr^3iI3$Pxr~;kb@8$vfg!piI_FS%u*TQwC*nwkxeZIbQcrudq z=6fI~`dQCvHOCAO)wsakg>J(s85TSIrt(L(mDVyE)+c-JC~Ex!D3wGycO*m4sy+O@ ze&(1ir&k@l44<;BS(v9X!`&rSyikdUb9cA@g7s2eMC3UE82Q!G%cJ)Jb3-u)b$w## zhW=vXp7w&5?>db1U7^rfSi8A_`gEJ^huxm56KQCVVp${Gw5^Mnurr zDAO5)AF&x4aJuqvKCnEhTD_0P8Ny8*pyI?sd{~J}qJgBF?`nnKHiTZs{mI*lnwwHt zy=MhSuU6M2I&`Wz>X+|CZ5 zLF}_}2p7^2Wc@OH+jxu$N<=UMp$!pgwhOL2WofFDMU5&L;S%L+FYxICq&x*r5zBv? zh3RS2sGSMLj%7*@MS2}o*_d{UTQQ9ldW-=JyKr`*3CR#Uf6%QvA-YCwv%RVfl$o#I zwkUF$r!^`G_S7L1A9vy_=H18+YLhfNA0Z>qD`S2Js(hj1hwSLyhw5#Z z+#2!#c*T=bQU~u8f-*!Hq0c|o#U?2xxJgEIC1HiP#tw9GAmgr;U)FfdFzbPrLp1|6 z{k}Tw)+XmugFFbZwYF{Cb;p7S{>GQ$)8bm&c}A$TE;8+HqT*Sr9*+SrL7N$}&pShq z8rR8yR0Ui*glAnQZ?R*wozy)JQt*=c1QiPjd5zi921wneJpzd<2yfL zHqDnYQlv~AKVg!%!*lYJ7USfZ=VU%tyf*y(AHAJ&KE+SAH0c{++y8wxs`z9bxnF;W zpxpgQ=cl)e-LHgRA`psN(am7(Z0@Ji?}Uh697Pt~o9q4Sgq|VlRR<<~4^%&_Z|t*u zG9Kz2M-Z+bnqPu90D{%+kI07hj5>z`#(1swScmvGu_{N*8e*P|g?!xFlR#UhPk zI?t(+6_k2iM#|eTGSh2u^3LE|T?TIeD(%~QXy-{~%x1Q=_uTYJD%!tTLiAYYgjkX zG__@##qi(FqjZ31ikGP1NbmD+yK9-e_0}mTv;V;A8KJ^Mz=V*6Pd*e%C;7!AM8z+~!g)lsD0xEgrY4&*yJF#Qz{MfjCqjp$BQ2 zDmVk&n<3{o4qfthn4eNQeyq#i9j#xQvHeOqemcAiE{3tWsOQnTPsU{eQVFj;6S8}+ zJ&6R@{2SkPj*lAlpB8lW#C6FQb;)R!FZn~$uxz<3__L8U6WnN`wA{cgRy0y~j|1G;DJo*(S@?60XY_TNcELz~<8gI>FVC=gCEytCd}yV%<%RpYbEM=3HgMNK-TW$+KJG<@o&_45)d7 ziW8yA%j=SRB8z{$;8aDm6E|}=Nk=-)#LfCiQJ3ROwj*=;9s5=cxDy{J27bV9L#EKV zz1{lQ31J`DmL6?#++YnD6;E%BQ;l1$Vk<;kr2PYZZ5_g`u+8};j&@$wa90Kz@-rHy z0H6yQlC(f+e^|NOM1L(?QTSEYr>3X8Xwa>Ac9U)nIs3`wy=#qr3c6u{{I3+e7`p{7 zGlXpN%EfI`_Bs{-syHX_R1cLMEI~9fNoqFLh9-|w2qP?1c*@rHV4Et%teSPcjgk5s z!G}<7AtWAPn1DYQ-%wPex#bzmx$9b1i~sdJD~Vf`yVSXeM;!Hfu|~tK@zo7?J7mpj zTGFg|CW$(s6tbnA&#=iuU#`5OS&Nb@+q8vrM-tbsfTE!`Bc9PG<6S#EjvaQIFrre=7!Ys9^;UBypx_*$XnjJP_HSN->6jObq z9ck4A=#~s5U|-$Awi};zi%+8PhgNnf%0g^*qKESH7Z2B{#VsnDmtW|cGG7;`vRrw{ zA7N1k>p-gf0H(7F;&OM@@_^0KCEI|-6mu=xk@KLSB|x>j*{%74<&e$uk|%>@mm0pD z6xLiQoGgNs$VXKMj8RatnYIwc3v{K3J!Nf6ruRb-{}{$~&ID9fB8MaPVrSz%Y}UPM z1iOX?BztLU*Ud57P;z61z}si`qSTa8rOHVYk4oB%t+xt{AIO;^J}cP zVW5nb6L}RQuXV!^9U+m?jrC=TGN-Xkr@1!!wIBIg@BoJhGR9`Jw|%$#s{G3E=r+I# zDBsbge8*MllVO+Jm`eN&ns(B+KVEF!NqWqKB#rV9)*1`qAAaM3=X$9`p}NEYg#(5M z(G%ACrW@ePM4qerb7hnF7;&_@G2CkP1j&6a2Pgw=h!nKBV`Eucp6Fe7~bL7 z;ydl4Tyd|3(` zswL%qil%G>v;dCH_}c3W!KNX*E@U3)(_2_#5~c1u9=EG$ce)C)fo$EebhNzm zpI5PDuoWB{t1z1}o=H*)|JIc!q23b4w+g_EGr3I=uMeMI*hmdUC45lHpPS4Ylx%gX zsk-i=GwI=}q~asx>W!`Xw}}1a&5V=s0V~voz`w8fOPhRV)zUjpzFpN&)Z!ASHjJeQ z9OD#@Tq=gb#1*8Z6ye5WOx{xYY^5kgv3(&>do)y-o4PKE zx#u!6kItV{Q75{0`0dC0Qv&mV2l*4>bC{JBEki@W9_bXt3LRP6&dAtT@Z3h!cQIVg?JTzshB~!y9cOtbS&5}6P$=*q7j(zQJc*E~dEndLG z1hlQ0Ht?X*PWTW-eOgB-Q>fMFxTfjQs4TlmoAZ5OkR#F(j!C%WfUM%pABQ{(3!Bx& z@D^P=azG@jV^ltR%_lHP)zxynb62|4`$E(4s}%aTB239nv-if`QT#CW%UWu4wPY3~ zYdJJZ+Lknxo!G@wAJxks$592W6D3Iam~7&W*M|J21rm=zuy0piS&h7~_Wy1Qs;X8z zjE`%W3wP@4hzp}n)|!YXf)b6N7kbDirLI?(-8#tC`Ck52wC~_$Rpu8?!fp+>W?KF| z%@Or%dw@=rgsHwP6CXj8#u+@rTwF{=$26Rs{Ku+WQKnyJv8*L}$1NPXhn8xdDs3du z^7#?it3dy7fv(E0Le^Kr;HJ@WEY-%bvPR+s)u3OU*45omKUdIs&rrO&%P_sv28A%E z<2he8drt8t^BsMT(rUSY-C{#2ysfQgthU?=^(}O+Q~|W~%@fz!at`Q*9sB*313Uis zn5y166|bC{ZR?~_9L&b4ZsmUq7@J6&)fv^~yUbx%Dv9ozdKDt+13?>=(6=T=xW!>zNYWo zZKRE%;?+8Z@U;>fEO)>U$A|&b52Pw=h-S+v( z*<*9c30R3l1UbFJ2d0jH|B@QY^+kwk$&bIPwZg7R0$AGa#CQ$>_By zQwJ9M*$arVWf%6i`ME@azq*tUZaRL!ecr!apW}6HEqKq$^RA0F#rcf}t3%Ybbl-T^ z!5v0GY=_o0T9JuM4p%}naT?$8b}Ad$+H16rCr_k<7WD(t9aiK543S{__uQSBr+irQLAO^+$lTPT695u$0F?1QUTg>K1N6m#%tQoeqW4Sx)C1+}Q2 z=qMm_h*`^uGt*=xci?~BsE5m?<)Bw-6mjH^k($cS z=!t#%z?=&4wnV7nEBD#`Ps{OXsl6T^r>D7N=vRBZcCaqg!AnFhd{oKr9ra486(&}; za;tyE?rHxl*A1>_pI34acX~}SKlm3dLq>x5x8V}Mp;3@m%&v{c_%;g-q8{R9k8j#6 zvnn6vKomoYs~1BA1qkRC5?(2=OC=mzf6J%;h_T!z2C9Xt=a{Mqq2GE}#ZGDFGs;9n$+pHD-*t`+mBl&&MkW#9>; zu+5FS@yJB`*36-|hw!s!r%5?~?lODH^6_lDZP7&4LZIBWjbOq8l-eCY&uC_4jV>l? z{KyHcz!Hl9xSS>vX+8ZDYb+9pOCeMjKLHWD4(W*@qbaIn$>e>*E zUZS>PP{cB2)&)-^Ok?lYZbI`DgIVJ+sfOhO42aVG@1|4Hu+|#qYF07NqUW1i=tazz z{QG5+j!)kDkM|#LV#Vqf3~Cz9Kdm34rx_l%{WXjWonr=I-|$L!&0vX+(-UAVElnQd zz#}#VtMDqz`JREXSK~PJeUzv<__tbO)$euw^fQR((7Aq@*KR+}|B&XEB|A#^XfM7T zT+}nTSd>>#vM#P^U_EeS(WEHXInn5b`zpU6lEqtSI;VOpJr zv~ny8*qB106^h>PV-qyYlCbs{+NOcm4y)vInF97O&Qh5I9`7kUy&$9Za*reue|~fo zHC?O6$d|UMRk*EvY+}EuS1VD_vs^CloKU*eh|lqhc2I!kl)_K0B;wHuIu2NW8FoCQ zJ@JeHI{n>NA3Ffoy-8$SIousO`KmNnhgT&P_T=6vjjQS<_jC7vAib9R+NIxC$BRJ> zQcn8T8-(LDtvC3iw_`xpFyInapw8<6bE3NB>rpMovR zw3WinX%L&2(A}L`wvIl!BQzbpe3q+DTs6ad4GSFOF8{U^-43>NE5-gU!Qy|)%G{cx z-zJ-u3ev&kTq~CGAk-RQn*KV{*DE=@O;&43E=Q?E0?Cw(4`Pp>Xe%k_B1c< zt#&)O&j8pRn~0uTFY8)t^R-67cM7ual!eCb>(o|PG_}V$e_{wLBgDdS-NHK2{?@pH z0}{RadBEBL2PvIhC6PDY5>Pg{L7cuPLjg>x{}`U-4lp{^lWPIDIk5o& zTfPybJ{W1ZnzzeDKVxfn0Kzd{GA>^fo+H~!S1cVXV{?%KK%UQheAgzfmBmoH_9#!q zJ+l{YIwY`NNK_d}lJ8zO9GTB4$k~M3{Y`c=KWAs}@^#Ownu6Zd?PxvN&&0Wruo_#- z?zbbn-OrKU^LDzd(*6^yi)X6GWYPWslBl)oWlOraz6)1rqs1mQB za`EcbSCMM*(yzbtwkb!hYM{y*Yu)NsoYGb0UDo+y5!25@_Cd9}D`h=TIDruJY)^6J z!73Hs0T9|BW5X?R_q2o7n#r)4Ks)yxm|cfZ;U6igDcAO%jlHhME`_?AYr8icmyX4N zVvb>9V1j&DzHb4o)N)GCrfK;j4BbzI^-to$QZc)^b`p&2jUDy5CT_ zNacwv_(14AJ=-|Xtf+P#5JPOPUZO6bQb7Bx{k(I-;o46vD$sz}<#uMUrn(s=!PzJO?~H2NIROkm3w2OX2xp4GUK1!ffZ>nZB}iW)k$M}V@Zw0U|HiWy9@ZRc^UP&I4RLkxE0bi zYMTb2;aFQ`{*TIS+qp18mv45_kmfSyfna#1G;wo5f2Y+rq;(!DLB-<9v$7Iz*jN}0 zB9+83vVgHm_@LVcu_CF6$>ZE?!RS?gG-s&C0?85MjMsa+ z=c&pvP^YuRXI9&%mBrDUiI7+4GGeBfxMzCb)@6;`t^4${-0^{xmG%9`=X#4cbv57* zeQ^g^y;1lavn{+Bf)mdy@0*~;+qF1Q`La7z;hFCVvT;j`o`Yj4o%-$4%fyeGEg6a$ zshG1;NMm%i|8a+oshP>{1WB#ut7gk!CJhRhGdtwS^H%-1eth^WJ%mY5!ZE0IAX(RK zQZcz`oVd>LH(Y?>I3F{>B*M=xCgjO-3J+^c{7m?Nf0N${YV?p7-FH zCKhMs^)o+vz&%Rv(Vp0{(Ld{H@R_Yt%)EH*z|?(LdS>#BnBlKB)SJ~)FAh=;A%EcQ zvX?!0zA6MK^h*?P^y1Ju{7uVy|3aukYFC|8MhG`|e5{!p`L#4Z7QBR~Oxl@5_8BkC~ovU^yo~U3Oj9 zw4a$@D*m-ZxSThouv@t4xb7DJ@wz|nWPLBF7@wX#vlj5pF9)%`dqr0I9 z2z)Gk;X1(Yh+h%Co|fT|v3c4)|Hm3|Tik_f>3V|`_6LQJ1rLIk<8>q1$ zZ`3^_gF6m?(@lMdfZoeuLN%Ekv4@ib!p(zPWF^0M)7QyQ-RkzWA9aunI!=qA%i*Ee z@mK+`4<7$zuy6a1wBhe-^sXWRGrby^B{WnjcN$FEm%-`k`C5$^4S?YD!Vz!B6WJ+m;vBXt~p0_KgN#YTIJXY%lrqy4`Ozlh(U5#5DyAy4pDu?qAdU%O zj!`Inx#iQ9%8y11YYDN9e2G%gQmcRA=`e9QZQ%dg7E$Mg}_s-#t_`e90R zC1MPq2AE3yFwIQVR)8~wqX2c$CF6}*dI6|psADd*g|%P~mxCSQlKp-qAF9?~YW$m= zLH}=L5#r&bu$I{L(UGzW>=ME<^mNR@5>l2vE*k`&+AIzMG$11YvIy zE)Awh17TCSfKNESgAaR6_`nZc>#(7MknaBvY3aCt-8AtxoG_Y2!Db&_My~H<{lBN* zIc(s?YO+WOe$*$8NXL=)bzJRPhLJzFpO4d$=twj%c3(q1Px4}X?+I~<7Nsd1 zf8stM)+_*?cxu8QQ~W;;-lO2@TeOfK7tSC>$(M*dE={3r-so`g7-0d{CH95pyyQX8 z5iq}TMR|kFIZfW@ zSpY&oz6uw;SbYo$istrU8m^C#pcLlxPmCj!3yfkJ+SZZo{hv?&GiGj6UNf zK{1a)2WgY5!7JL)v`nN=g;cx!iNc@kQ0vsu_XO#0MX35CRN0Dg@Jzsdw1{Cs^s`hZ zq5}GhMJsjAAWf~ehSU^7lx{aHHc9meKS6X)ZTjcJhRAuV;;Ml0t}Nvo-U zspCGG0{9f7(Y;LLrbsi&WB2N@jxN2wXW@{pHJU^8MAc!d;3Q zwjc-uvr+X%EJdO#PdCOWVx8R3C9+PixG0)&Hci#YEsKIR`mm_&jQmKI=wk0l7)42# zkqeUmS`f0%iZzCyOIU~ZmL>}GNMA^55u$2{u{kj+|Iq5ZO zc+G59hvhYtjyY@q^jQm!kT$#~6}tO*x^0%$oE5mwA5_g6Awj9<{5tje3Gh$f{#}O3 z&n*%oWP{dV3e^&v9}_}_A3!FN#|~dzII|Z*?9}JLxU}$VN(5uZ4*ZytSsY5QG~X9< zxRoh#&_$I8>a*04&e=A+9ex@uaQ4W4`UkNWJb-eSkNiQzELw0JVnNA+P(p}#n>Aa^ z72lAQ5?%T@A2{jInpN>%j#7~|yd@g0pD-sklyTUtd$=#_H!g$1@d+UY6;U6vFj*m! zgnxmQjz~4a4L`!?(ancQx|#4L>yaU1EQX$NIs~he;7-be$Q{=&LLqM9hkxRc4w50B ztbyg-9YMgeRvuxD0J6lfLuh&civ&}tlcp!B(4X*iDV=dAF;=#~HX&s(X55fF%#WC3 z6P(`K;8e+8^A6LN@VH|yw6Dk7~LujT>NE4E;+ zoN=uY+-5!DE_0wsYzBn%h__@*NK?4_WOq=(|w)asYe{BLGH1fX)$*ZvIgXtJ8AR0 znPg)%r3QlOl$jHMsVsa$bR%l+BWzrwrfcdmCJ(IxjpwP;(-dkTlxEn*tNSxXIe(A< z59Tt!2&Ninbyzzxj+m`8AsJriCeX%TRwg_#$qAxt1@V9l-5Dcy1pk>hIss)wrV-Ny zAx&0doZ%k=%0gx_A{MYaVERm7A7jkv#_y!qqfC&Jd#V2#qaR6E*NuPB5U0x~AKH%e zjebZm{DrsnWV!HUZJQio7b*|7CGRHx!9@hE_m5aDl^j*mm_=ZYkL!R1VE(W;$&mvW zDMgi0!p5wVKN3E|(2gnz_>X~TBttchlaeP}dLYi+yTCGvDQE_;qxjL1SKN9P2MFt&JZqmdKT@ z0&}GV%l<+<88-A*2ZXNiv0q~>e6`FPAwRvcBR@o--UbVU(5L#lhYfY{coHjIN9Ji> z(JIP;0DWtNFrR6FMxw}(6f;!|7PwKhaLIB@W*4De} z9oR;6J~RM@f0;ZPGc1{e3eKWWA&C1XAAX`X%M%7xUk3$ivRpgRKRb~%>cLW`P>Z}< z3xzpjPw807?v89;BTnt$o}S1VLuesAxU6aUiRUhCTbm&Z%!G?im>W17X~Fda$ovy< zbcGqsH*GX>K}3$PBb&1ieQ(d4B0?`@2w-SsszcqAH-#&XFtJTL5rx5&DLiA*U?l(H z{7H%5kp4QfLm_gtHMRD2phPwtaJsZMJ{EUpWgYhnJI=p;s*BqD7m*R-f$k|BT5=Ls z&th~r`>60N@9w!c5?Y-Z6MTHUngNNEo0$U}mQM%x&D_R_or`Z4w%2)vCH`V?D~##v z8!CbVEfgZ;WM2DM-q;wpTxei#?Dj)}fCoJ{Pt+*3FJI{LQr?&sP|wJPYG8&z+`!^Q zlv1G>P$%;Lq0jGvcoMqx@W zCN#^53p^egN+D!St#4`UNC`MH5(_H{9Ts}6#KI&C?0{ONlMS{#?US~RV`KvK7YOp?Bby*14X>>U#|Jzn^rlMBh zUG;bniU;lOV3zs=I>TiIb}xfq)nAL8j?)0OS4Kc za;)cN-kaWiw&-}Kj9GYaMryygUUZ3WjTC1Nm%6_9w%_xEBc{HpWuBk~9o?bw(|h`Z2iJ94J>j#0@PZq@Sgv8- z$KQ98BEi13!LzCB=A^mmx}v_p+tkEwM21=Yrmr0w!`-f4U(+oLZO}-sb5>@BhySd! z+-FjDw0+p#%kB+MO^H(B2dKd`MJF597_|RQp{YD8j8lM&I|l>1!ja?>MX`P#-*YqMaD$RDGr~)@=(e=ao1DfsHYc9#r{G zUlI7ns09*Q8P9axsV#Fwo%lCFV=>eN>C+D(QtI>!K`V?8H6E^DF|2Cf2IO9^oA1q$ z!MF3{*4Muh9`9eROZ@H*{3Y4r>W_Z}Xmw@ww5rl*TX@XRPKPv}9~g?X)kUAckbTSk z@|SmS;x6{C<17ZRHQs;w;y-`2@!4nS377JkXCR9c27vy*7JXr$^F5+z{}KB?8~FcI z1inDhVDMSP{X_`V0>#qC)mG`>q0;il*T2LCG@R|QCM5L8ghs}LQyRPCmkSGxMj4(W zWvhH1puMdO`A4oOWTdndaDNay`jl7?H7LLD*rJe{FI)6FbhI%LfjwxgdpUjXNColI zeAuu(>(zyf?Y{W(-`ucdP<4#0`h2UZ@ape=>9qMUVx>qq+|?i*8b>emXi{pEme$%M z(a^j`ZNSY)e*IZvCDkT{===~N!98HWo)Zg(dEKS`8n+_$i;3$w)KIOk>u2LV-elos z2C#D0Zp`hNwLCpLyJ_&aZ8bZIiM>DD*l5umiz?~JxTMt0%PSTw9iAK+oBd6OZi_a; zGOowEQsPu$Nl9G7e1FH0*f|9cF2Mn$w}&0a>mx>S%79STb^pXXQ?{Nhz7qA z=E0F!H68qm;TiJ^+~79@x|?^wCcD3gJQPMrUr~?)I8|2uc}JqTd)Y^239+Gi&-UwM zUxN8ScdGY_{@r~kilR9=4a5pjtDM8sKDu~iNZG%<#*MB~G)`iuq}?=iB@=U!Ge-A?f?P2h2c6EoIV8kOaXnPI ztBym(??a7Dzn;N_`FULtPE?!w-{WB3ZbfkuSVW=90|zNNJ>3;0 zI*Jo`i(ja==1<_M;|&;1W~l7>VJ=j6+??}25920Q>5^3{=KE;QKTZh=N&DiS|B~wh zgU8v)J|_Q3DN>X=6hd{%`IYZM3_Ckt?Dbv8otf9#i}RO2PykCO<_s&?qmX2q^*dmnRP`OFi~Chy2ym73iO6 zHQT3JtiK;Nq@nlw1J?9M;*VH)D@358kyiTcbP=r5k?!aW7C=Eap(JiHAe*8b>x?$>?f7&N}^AH}x(q)zVQ@!et|K}`zXX*iVwGnA0?x~Y|{ zf?ezqM*)F=ji)E$2nNu;T0xQiH3oQxrCO(eVPG6dVg=g1pIyon(YyymNRFf2+&>B8 zx=ZfxFj?R)*Z2eq>5Ru-Gx7PlfBz=er)q{kp52zGA5MOLH|N{B(&M;947&>)=VWZ= z=fnXEg&cSWib7+9f9cwQ(KOIoFKEQNvL#v8e-C``A0Iml5vgz?vdp@7L&O&ibL-<| zuWQIIKhEY<@XZdV<_DSVb$2U-f|h&vlfczrHaDJ)wZV6Xip%sm`8w#4YT#AUPJvOO zZ@o{&$y%8_j!aFI2v3gJKL&+|mZSHTj8>53tSk!Ec+=KPD5(^|3hqH)3y>k1SI-}F z&rF$z_PnjB@n{d6O^HX7W&+u6{1@}5CYrrx!wsJ)x_Y+NCqZDnd3cCcDlKy@f_u*}!?gs? zMhx7v<92hnF=xm2Rbqwyltr3vefp6I!zip2F1PFUGQf-j(6MU~VnzX=yJa0{K*}XQ z6r{)ix*e1-<+!!KH8Ka~WIA$4!!U-o$&DBZSPI5LSPc<@pc}% zjT%B5@cZn?3-x>TYS>#+0}lPZzt2zPSbKkpngXQb?o{#s- zfWo3@xm~^ca4Lo6^StIA*x_9r^*-y@4i_l?!sjjS7a+PI9~c6a%E5h8JWANvMEmJZvuTSH2rH?;VS z-Vbv;usiOLt$P=7+h(ulYcZi=GtD^Nj?WLF41A}|0C&A4gMfdP7cAOAdkflmdy4@{ z)p9vJXYKF3P%AnovaPffm=h7xCu%q)1MQxQJR8Qxr!^hdl0JEr3>!w(R7}K?ver_p#6ZWW<(zMKz1ai3yLG?_s6GT^j$4+@dI2{m* zI3wiKPH}+xIxj~;m&9FFnjtmFSpD(C0`~#W@F>2D&rr@{NaK6)q8~|l{H-(djP2s!43`(vdZ*}~AdRo8SPMwJ*HNCFlI53}6 z#7rSQF^g z@)+2{2l`nsTd}eE9r-;tw-(O0xe)S*WOG!DLEy8xn0W$3w|!fuG`nGDvr@J5U^He5 zs8a*uUb7&lQm43YNZgPF{DPDLyif$IJ)yaxzRnQ0?v&VsW=os+z_jj$ zpp^`yyUDlkK;kCmsQO@0YP&B1cpbIWcc^U}H&=e3j2~Ygn&zKp?LDl*APT@!De!m) zZ`f2>D%azkcrEQLzX%#(ec+`;8^BSAve>HFdr3CM%3=l4)_i|F<@L-$r8Vbw<(4x07og4YgalG;6Dt(5%m^l;)&YUs?A{%2J&iQk!fw z=R$8t%N^lBH|c80C)UUxrlFcYS&mM-eMwYz*Xy{RkLzgPO$(`#Je*LI(IideE?kUH zEtk*9nY(Dx)9`V$$QRSnj#iv)`#s4f1l^JnMCR#wh!H`^T?vCMw|AD1cMT=l&{I)$ zC^wODaJ(azTW%yN{h4VC2N294xLL?W3S?=_5n(ZQYeIzTFNThX$w5aWi9v3Z0i-Tja^fN*AW}{x1}MXvag9)pxK_e|Ghy5QabX6B=YQf4h!m#>^B>6i<+i zG(0_^h-DwyRhNsNRGTvc^2vZsbgw=ii@p4E^b``lr!%75G;WyjK9W|Ab|Co}mj-PC zpC4FSe*@l|3mU&47sM#KQO~?zI;#4_`Y!&axE)RrdhwjstEM~0G?AszJkYMi#H3WM zr70Y#+8H^(x6}=H%+=gYeE#Y1FvIXqBO;RupV-(~dDAR-RrArQOyUq?w`hC=*f*(_ z?Bvr=s?<+BR1(YS<P;XV9wbcmx-Lm+>oPSkATa~G*Wpy0AvR*`@Wsg$2f`Q?LMHE4^Xc7YU z=8fjYue8B#zk$03&>W==pDXCl&f;i-OXoq$)yw(y8Xbokj2B!WXWN#bHT=wPNy@fcP{2;mr^P>P~ked ziaKAOB4ak@(pyz9n6ap#OZ&^gr&-_er0^8)jpz-^C9%N&@KBugbR{)~_$dT|fN#yY z`it)jusUuAq-PuXq*-uz+KR22?JSa|zF%sS@1U#DEt*z(`Mm(L0P}vHSxV5lSK8h;ER1k&A_uM>IO95!+WK6fO5&(&{dAf+utnHYu>Lk?+z~j|H2g*FJH$bGV zhfIO5qsXLSAz@h0&Lx)X&(u2>6IXz)oK9$M@K~9j3&zA(xMA@ckXwI<=fy~Fi=m?jHYnN++42r zbir!b-B>%=q@JK3onRb|f5v!WU+|PSo{wL_Jxy0#*3=uU{5|}XnL0N3hJVK+$-1~m z$75a%!`)1!(9$gDc3oLSxGJl^B+QkoXJDS0kWwIF)@({Kq5QVicuuprDVtoei9Fx0 z@a=iC?vwf07NrKialv{3Oi&q@YsYlU8<{`@qbmH@yy6G6zkKiJA zG(jy5!7{%1;b|fREWKO$t%!Li@#O5DX!0K5!JA!V@-GtDL_x$tL!>}aLtQ~t zQ=!P1e8}C2Z))jy^pGoalO_hIJgT8SvVz09Y|g~w%#!eJ;%7_)C^y7hs9TQFdxBjU zj?LMFRDnRbEpmNsG`GlRsEX<)lPV@6p$kBdsG4w|-ekZeP5Q{Yd<#{_lBwLkDLH*y zeN&}#i>G~C%0N+U>?JHr5+qfWp)`F0vP@16p~_V<*wkLSvLkPnCMK*dv3Y{;Lrmq* zQ!c2RVihZmN)Ow>JkA4g+jyn4bmi5nRp|X3;QlW6`bch)P4b27YE|nzIJ~THs zvtmSwXA<{>D*E6-e;@iPXs`e_{W!W95R{kTVPR>%@qB8%J!b^~#q=yaMg&qu+w`fNiR(TSha#6PyynzC#kItq#?pT~3KRBEXqUe_lSjiPVwzqU$4 zOB0u==Z-pOOYDP{+RE1^R>=qhUX7MWiL<~puG%5h{nOwzz5@U3`8q58?h5D91LH(+ zeDc;2cD#&Q{7$dzzHV{MULl*6I4l^XWGwwKWtuHyV7!CZlN6KI30#xnHXXf`Efte8 z7mLW*{z}OFf2tBBJQw|3*A%BG1j*JA7JoZIxJLX2!wor|&+OXZ-ylBq49yvqc}g2N z!F)Wb0CjpSc(~3M*mxpeTwm$h66aZu35#Vpu5I33y27uW5>n+jiG-tY0>woeW zt-KJpy2L41k80c)V~1=Pc6`B4w^yTRk&pQ6US9bR-w(kxn#(b{;wP^d8o!@lZ;E-? z7Z#8jkqu`{Fg!0VMWfi;F5po8yJTs z(4z*2CZL!%j3O90tUvTEKs21}UKg`G)UZT1pDJ28#A1mX4%1jRx+xe3i6C^Kh* z;vHCI4F}-oyMo%4&A>i^iEhp2g(3;MD9KeeC7hrj(GDp~B8&cB)SVl6sAU(Wl1M)) z&K=-?QCdfI^p_pv0cxk0_UQ< z4!D*XUbmGUhT9y!mFmP|JZvRA4m{$O)|{Xy^|Ba!a6xh1--u<<ch!qczWI!*&59(=`<`~j+uzR%iyb*nJ-IM@!3zi-Vc%WE}uJp zP@#)4R)JtDW>ltu4fLQBth39u90c8wn4iS~yo`wY0`u`0NNSdINZ_1xSAaTZMsGjv z*QObm+`Tr+qN%QFy5?m;YH)~;*#2q0LKYD8*aqp7efIqmR2{T@mWSSu#q!`8{=q}0 zFe~+}2o+KL0Lo%iXR1MdaG7$hS+=L63J5Wiq|M$-{Hd4j3*i)XB9$*uLxk!F{geDB z$l|^*_l-y1o#HEJ7+A-v4zG+^wPm&i(%rg3du+=aMQA~*Bpw_?zC(R_0%6)6^Zy?oMq)aKXF&U@e%lKLBjzQ=n zAel|&Zn1c~l3dBzQx`&*M#3ZXLLPv#ObQE3)1082G|4G81mK6-60EAoQAIl9&n;A# z=C2`OX$EYb%l3t05|xkiBR$RGDKa77m=Uk?iM;ld#3E{L^w|& zn?-d$LjIEl82#bNn2dsMqGM?(RDQ4BRmzQ$JM9PoJkL>rmW6b>E+``~;ViG@1lI=6 z%&f8{XEefk)W{24#O_G1p+abn~Bqi_uM^p$?i@72i*}77-q_AEOUEIQMvAKP5B| zE+H3q&)|B0z;YtX>$9LK1|YUZ&Lv6r_`v6c0Gob5{hzR}>oeWRmpSUu37k-s4+?`Y zd-D6tSP;BYI_-*-AW2jG96`ckY@c25Ukim zzXe_ToKTNr6#nV_JbE?^EQ9cdJ+!QqL5SCASI1{azSd}><1wEWb~b;f8>nDB3GgkM zF8Tew#RZ#!`sT&NE2S8Oth_8vja9f=1I&3+5fklFqd3!Hz&EkU8fW2cJcdI?^(ol7E#f2ih%F`6jbyf(wbMT( zGo^JW--{A8NWucOi4q|~!sJGb2$kia#u%Oxpy5Xxo73IOz<%7c9IW5<1*HA14G z=l-F-7zVL5LOccvFKP;ce;FYhH#CYZ?atA(i+#Up+Ar(Ics}xZT}!dg1-!V0WnjH}@buBeJ^Z_R5#?nVK*S<`-SR$*umH1F z9LSkKJ$=i5jKCBFhVbwZ0X-I1(%a~n9Pwdq2i%7M5)i2Py@)J(z+vdF=cYpMSfV_0 zI;3!b2`AS5kiO|=T0ZPPCw3ISBw`rQi#{WB+^0S#ygybhD15L(;42Vo5ZUfA<0vpo zDM&*y69eTQPp1D+010oy>GnD&eA~cCEd`Xv(1i>DJ(P1~Q(uY}kwW09O$ZYg!qESK zR(?O=fblmHP|$I>ge@!=;=T!znAgWOCgpKd#%F{u>$X81sL!?fDlW2+K`5lU_ujDa zW+Eqg%;fNN>q=0s4Z z*geuB^*~YEhLseVQm5B+$Q3rrtsD{X$J22w4%IL6darOGU0o3?Pkk z@^g3Cu@(XbrW%jjut%nYFW39Jn-$J{b!QI;03ayV0xT`$o5D!l60=E1D%RDZZ%IFx`5!cI7d>vt+1B^C#FB($OJ`~ z>5CQw${7U-My6;M+;nt73=df*P{4t2tG3sZTY}v#8!?0y2!>AIeN*h*j1+r!Vhc{? zhyxIQ$Pu$^Q9jtohuj_!V~j&;WFS8*hUHEozgtEh=93$ou3zB+J9Yy%8?(|^+Umv4 zd@{iqKac>r#_U}T2f2|xgK9u|O)=!T-eP*v&H@{Qbaw|zs`N`RnHSym_*ebTn~l5m zAa8fggvCHC6W|2xLYmUqPcJKPF)0M=~f_LUUB?x1>40gvJ+j(3nmZtWJ0fRgK~zaApik$n)0zoMUp64#zxNMgi}xC3JyhBx3!AzlZ!7CN#A zzy-%{z6ycIzqrB1E&9{0o!^yozQV%Hedhf56nF5I(5H)o*kO~eq4ts=g8?S`1nbHb zD&5**RaP-0suuGLgCd9AyrpJGRD!Su#@BNgk7QslIyYg@fx=lvzt{=T<(y|UY1*$N zJA&yDzQqN68Np*P1Ze_%5o!a#*thH?CuR(J)G=yS(ebp=3F@_qrk&2Vo=)oKjPK@r z{q0TT<8b@s|fcSsdvYOMGRB)3XarkyZ_fHCw|FG9lpM+mt zNeAC%K}R&TJvAWT2m{{bUH>c13+MlkwfrxoEI)D>7G7RB=>Jp6q7&a|Ilu@TdgBX? zw;@!wp(CX44C|=Qk$MG$t2G82WsQ0g-;#G30#9Bm@bxYCk=pGlhZh3-7E^e^G=MqE zLhoP_#<+_ro&)!~d%wN3F~v?rXWv7IbrL&VmI?mY5iWHM2Oq}^@2>oo^4l>V3O;W| z_sv)449BbpR=T!!sZU zKzQwTcr5gojV2fvtFU`RTmJ|X{E8UxJeIvV8jyI0_3M43u9TXx@d&wdS@~gEfn02X z@Q5+&_-f|FJQe=3BDmQ)!_(dVnZ$P6q5bE-_O5u;{MhE8=w=HT>yxew`Ow1$n*aRH^BP7UhA4*I>gwdh)s5V8o{}k@z1p6Wz$} zj6v`80O7u>`ERc8@!PX@;y!}_zO04`7}r=s7pk8xlv*;zzl&rRfMN8$o)V8Ly*-ke zUUI@_>^Op4NmPwEd26*BTuY$Jr*5YQZnO=+i+$KJZw%>DZ~8dXJwS%$!B#-Z5@9_$ zMG$RCTLPdP%Xw5p#0h2SL%xH3u}f7Hx-^Su!_5deypid9f@k6iy6Q9qH5HeY%FWE! z6N#rZnU8>x;lmsv>Q&+#+mIKbr5c^tLr&#(6<;AB%WwL&{NThsf8n-{wg&k{{Tm`& z^v!m71X_J*N$11+F|*Jm@ysHwR#Q2XOCt%k3A5K81Y=Is*X(IYDVxw+PlZFHg=cw%4nR+ndT~wRsG!1x2OABxIC*j3JH567`=vC{c5k zi_{AFppKid>$X(MTX@I~co!=*`YvG@IGqpJ?Lx@xOZ09dOR*@%@2l*M9rlK0CD zaD#(sTUr+2SDl1y8?R1bs2U1|y`Kx50}$Ho-$Gv!be)xuc4vBzeL0$sxaK9LcB9 zHR_V;$iWyfPe8iYc;OwK!IxU5EmIj|ab3(2iTu~)|YkfyecTW3|=N~XBYbpcxPGUcL21}KT;Yr@Xo&t*)~4_xW7TM$ z(itM&MCA11$@Ox2`5eb-&iw(7GZfWk0G(C9eA54x3HAhbiA4@-tUg)tbfra3?hNxb zyLbq7kqk_Szs_@|=mN>UH$B;(cXm6rMC&mxNUyBHCdB`ql$CrAJje?6tgpY^MqG-H zw>2nSB~+esntLl7HsXbwxW?oV?VIN7X1KbA$CQ0`dzZB!*wo@KuLe?NEfO2_BrW|Y z6Br+|&^k{J1tD2(_Z*y=gD+M#a#qX3?L#?XjD>l5wY3DPP?qT&kHaC`J{n`A#T}P% zXWdrUhZG?=E)|pbTx;#paT*3caU`bkmZbXjf7#Q=Ui`Z`WY1;z0 zQwGO^WR^$fh`j-zz@9f6QtErtNcqxAyh_|`an$U9<@GnPY6zd@f(zb#|JP0O0IBLa zk4`(XT834O6WoU8FsYZ6Wz5OU&$5Kjhf97h7;wA$=%`)3NZ0HIt0ISY^Z zh$P&MJmQ>pP!E~nF_df`@3O(o43+Scs#Y5PJd&!_ zm*n#3-6mHBcoqc$aZcz%6UMo{T{^?;?pOq!vBkCk*X595udY$zTn?8mcO))qu?ZwyhsxjSOfURf@k-F+@iS7zv4dH;MFxj~Rw@=6)N8xpGr< zuxdEbeNgNsCp2YK_Xr1T5>sM-1@+RKg_Bne%aQ{uw)$tlv?)sfDyn$pDP)&RHnAfs?7B$d&^iq3ee{ZTM-388dkt%$ zWDU5IjoQ2=yH?rhXn$wtSbH67^)qt@ML62_F%OWMy)gtsx3t`}s1yD*S0`@@+*;ay-f>q0L1RpP~%WAMA*u#cN; zZ8AkF7!@}wkT^Y<)E!R=Gs)kZe6LbsHrfKGM2l%FNMh`&)9LBnAV!bFF>WH06Rk>Kh=w{b)u!UuMk+>sP!Bz#@s|ZX zw^AAvSz%Pz*c;PHP%a<>v9_;E5IC4oL7=L!HMn&kV=d$*8&Q}L7!9&}$a*gcID=Ue zn#P4yS}%;Vc5daAt1T>-2iJ{(I&ZEJ2aQ#W9vK|{ zw-T7O=kTv%k4@&+TkT=vmR5#bUJxSrbE+S_nJ+x4G+lZ-6P%GE$s<5;W`MI~gK;a0 zDj2E?)`^8Yf;ZrdN_s|!mmH%6U0U;P5>=K(CNFoqx?Y8Ro?!k)0NL_`^^=z&?@!#r zy~GL&$Stn!TL+Noj}Bi`kGdBqEr)vYte9%H6I>CLyhND8^}7^jy61^$&$0Jok?v& z8jJ2|@f7lQh^EH>GU4_xk=LkE_xJh5`=hct9-V2E37Z4=mVfA2c4P;76*C$)1nzcmBU&Z zwqOB8O1{rSGySJY8s%WFCC1Np1Cl9)=?6Wcdfa|yBk6Ims5k491fsMSw@!^Rib13! zJV8<%FH>Ku4JV+h2c=3!6V)f#6Kk@U+yoMqQBv<@Jt9Gii3 zODAa*Jl+rGSn5Cun#C5i5LKRwQntNi`G^MIB8#>nr^NUf&ssKNyTMW^uM<|Nh7uo( zOOy#F!om6*7K=*l_8S&_1X7CYYVqoDEi0<3sy6ZEs>A8F_|9Lt+Gy)~JIh>6_W=;- zY94|ixbR^})d-(3@2F1E9|@g%)m)-qz0h(eOa^rS3OiDoV63bFxo;NpeRurCe*6H| z96oyhUG6+A0;x@Vv|DL(TF3zsLlRmz1`3D`L4}B%Twy42)!Jzq;+)9xO6dV z-EoJnmtu~uJ7MD<^ZVa<-k= zF9jR6^_3}c$T+c$XO|bZx1#Oj&@l5dC1gW*WmR_5&>&^_jovp?aiwX8em1XXdh7fc zCFpNK%C7F5KVs%;ywG?fQD{6gf%vG5;@PB_1qHQN&VkwxJ(&CD;CM|G6f9(`BKH!x$G`3ga02a+ z+3l8v?P1~qx&AE==-8!h#k1`Va)fE#1g*kUS@q?SfFcM0aE6N=32?@=X6;#W!bgyD zeQ33UKSRyzm-*-i!zLGl0pDWHBjN{D-TraMOXdfG?PJ73a0}(b`SO0<*{!gbe)W9? zoD!jVGUdYel)Tm4GRS{b-Ga4(=#u8ed4OtjPH-B2(M0#=2&RemZw%ZJLb$F50m5e? zOUES6h0l52Lr9YlUN_HuS zEne9_qA`{2g1_lLz>E0d7YhJlyJ3e#j80$c8PJRA&`pi7l64fnzTtO*%)*1b!@!ln zRSL$7+lfDL2ZeyF1#NEz5_*X27Alx@NdWZAp%sMaPxo9UHm?Zo5k-lBd1>xbX6$@7 z7?S)UEEvY;0D>ot25X{j$}wiLp+@#2jR(?p_4arM!xJS*#d$?? zDSAqloN+#pKU3^G+-~92-OmBMo&iZ4p}`yJ0)o> zc)Fsy>0u!|g6*PIFgFJC-E+=8m!{6u%(%^Dr#?<5H}?8(pK6h=_B0Q_VC*?0U14)W z^9;R_d_|On~V(0g3|_-?<|<2J?WLN)V2z_ zi{9GLJIXm0!KX@ZyKfi0^tgIHK44fFoen0yGX7?e?4=O`tsuq`diST0yy!;r*mu1Y z4*iCmK?XUePobr-k^r$Z#aR<@O_)$f$|HA6ta02XAl?zA`wZ@k1>pQmdB~Pho2Oon zzEeCe?6|dj@$d}hmD@pL4b)|Xg6elP$eAU34OTFysnvsol7s3&^(E^h>kMO}Jr~YO zCo+wab;xOz!9}@2*F(}%uu=K_*HfcP=|)+vCRg zu8-t)>Yrbc*fit{wCx_!D=i(e(yhXyP~(ZsECs7#qq1lCrZ}HO?5y(V36P z90EPUTouKCXh0r#wL(>u3BR&wL!`}p2RgOJ*#$Es@;dN%qeqUa+(LW9xeYNd#e24K z2YmRy4MDYs;{s7{&-lXejFARXH$?)PZ)v`@bGa(^y0K!Cgbzg%#YM7=XP6 z;q0g zm5Uh&en2$}h`grW#?7^-{R!&=@w~nFLNE4)GgD{C4*rut&W%-#7OJp~VPN#yT^n<% zPY8gVx}|$97X{OeL0RDx_6@$*h2mYu#z*sJ@m(CKDg%4Icp91g-Xy(7u0i<*ZrRP< ziTgU%-Q+;noi^~w^9c}BD>L+as|qM5NzPWWDmlZe7Rg7RfzDqDH-joNUn*}$j5ckcXVbp?U2ONZBXPHo4U$C4+4Y&KORAR>z7FR4G_;E)Zf#s|pmJr) zPb((PDnj{L^9h%d^gB%KpcP!Tz&T~y2VkT@M@el_DJBV~%XWs0x@%)>wmdi26sI9( z)0s3QQCf%MVp_CAlv0){6T&~D5Y%klb;dxGrHPVlzeYRc2Ol<|u!7s?SFBCIsq_lu z?b6d|ma3gDb%!q-0<+AXbXTZ}WP)mx(7NSBTqGSWnN==az;hHR%21FGP%y}#&smAa zWcLl3q?R?WNEOWL4nE_g5(H)whajclkRzpbEA97zQ8g|@BqAgt z9H8!4Q@QIeLnc7pKg3r@;qp=}46T~ba1_Lr&Tcdj^fL#XDIW-8SQ#l^C4@H#}bm?Ih z$fQ_qKI4zu!OJ9YxNJ(90o6#h&+@x-=m+xEoH#I}=(ZQHhO+cqY)I?l=W z*=O(lyysl|`~z>UUe#S)Yt^di)%`aIYbNEP3)tDt5HHLx4MF}dOebt+p%D`*GcF0CW-yOi#54jW%9wd`rxAn8s*D;%7tPmf7|!W9z1XUB1+n#W`P)AQp*i?mosS)E z3PX>l#cBGO-Ew&&^@k9+cV|thq(CSfn*#{f&>x)!E#D_#qow+c^fL>wx8jvHN^KMV zbONUJ#xP`S8A0DD+!pt5E!;CCrRlT!)KA(^R%i}_Mq8#r`;~56>{*NLGFUxs=3!b! z%E^X@jI(gEJdYpGURcn2FLMWY;Fw-tPZr9!^Lc)EcNSna`I|TnFVup0TuHOMAl%CJh|+)0aB^)|qOVg_ z9CEoxfJ3>DEr}4PoB-c8px0yk=kK>oahefXDYcL$@r67_Y`7_h(#Wotp{WY%r`W4a z&W7E%%SxoFcFG)F?qIJw{`G{BX#T1luX&uJC}P{Pat({O)eIK;!SRWNLyS!0+>gUf zXf>}m;6RA%sBgA&J382rlGKAY5q;>Aq15G_F5)$6wvFpik46Q*-zqsk zYV}!FS;Z`$D;7UF-sI2x>8TILR!p8VE?uUpcV=glB#c({Bl@9Ds!}L%_$08Gw@+yX zVpEYFlHAx{32i?e`#Z{3SbLF3n$;(i@-Jc;f*6Mw1IELDk48L+iQ4U7i7lds-=xI6 zs!Tzz!1<IPMYCZSFBjJ%S>BsuquMigX_PS8~g3avj_jhRklg-K( zhQ&|XjoGW#W#sk7dhm1DomW)hy0+Mxm4?}2?P@bMxrKCplic6#e3RCB9hK@lak&Km zHt%0|%f}0AQnd27=bFkF%_pON2ot+6!DvP;YGZo+a`{=Y0TgyjV0Er?Tx>GVfP!fr zUYc-CS&?SiR>|Bs(VFp4;z8eWy|EbAc&NmyeK!`LgxZ1i;Wm4zsIBcWh|);BYB4!~ z(|KA$s$cN!E`{9IFm5wcEYkaxTMB<$`QU6L0hIH?h(|EZcg$;pnTK9m#IwK z;JcRZuW8ae#1}@i6uq1nV#4tVIO_c1?!2EboW8OkVLvSGVHc3R>=$LEe{!i91(AWHT~EamuQpW2`GSFrYtd!h+)LxEmj&sxhidUHE%D zh`_Ew6(!QlxvGaAF-NhK#pb8KZd+@MdmcPCpPayQK%JaXb0M83GBj9;YmCtR(qXcs=m#MJtJZ~d1{Jrrc&#urKbPX=t<4! z@bGH7@3$VR^xd46|I>86IKH0xu>CO@D0fH%Xa)~VnJCyj24a^B2W9B4#M8o1r^5O0 z@T9gHR#Ry)9sLjMSt6dA;%H2rKy}q~PREI;Atx?pEx>zw-(i7u`1$)u4kazG%iBg% z`%8j*FkMYe>|m#&(zq zygatS%%F)uco-GE2zp29=!1`dST=c|XK(&yAb;!|XtneSLkqP0l z&@EkWSo|JF8?Y=|i)(@`&Wwt0nMWG1# zCErV-WE~rLtdu8HefDyr?ma-9R9R7~Zg1+*n(S$_^j!OrSYCF7!~TJFLg#^{lNB^v z_t-1>&La2Bq5b3)W#(z1Abc}EJi_jv^^o9XXF?L$E>er5FjzeM{*3l(l@n0hZf^kL zF`b-rc;J(=m+xd1{y-Q$)4Mj*a66dH+l$87?zK)8MK8!}@ssvv+Es+PzIQdWBp#eZ zHqhdZh8v@W-#PprZW|bntp!fH<=M^7hTEGmBVLtzAY$a@;WY3 zM#dt|qk5FXp|pvS#X^`iQ4zOi^RmiL{a-uNkox!`JzwfnBd{^@TL*dtQ7|#IOgL4Uh`+HONy=>mqUBh* zZ6jAk7D@kD0XS81phU5GCM@(ObTX!0C!Lb%V>kUtQ;*+kNwZob)V_p}Fp*^YypAl# zq(V+9Stc$%mU;3a3^N@&Yn97MH*9ZTzG9)yeCv5IO@u3~LDIwB+6pW6{Vp(Wd5hht zdk>yv-G)lF`N^KNu`3AtK{k{{#b{;SC-I~wu%L47!(qPz{D5$KB(h5Kn#2~>F8!Nf zW%vS^LLSLNd~k|U-0xfxMFjyA6JqLxlXP`0U&O+Izh}*SC9RV?p!ug*Nv1JcKw;=- z53#wu4GzQx>$ZQmgcyQ74-!&Tj5UY0)@@%3CVM++?=lgcCtj@%&c>^ZwVT^awljNj zfRktxH(N@%_KCj3wl?Afle+JT8*`O}kzU){s^!AdLfY=aJky>WTXC;cl485<4x&cR zBo`&UrvuopL+G=N2tViwc^bS0PxKQOC!d$Tg zK(yNdChHUz5s%P35e<*DulacpNJGuKeV6j=d!JDx<;s6 z=xq^|hcqO;n#2<;A*VJtDEMK#8nQM5B0^lS7EjvwF5Kih+bJS4CS<2ay86onHjVey zJ0&frH@TYqoTbVp6Cwd|*&;hNqmgZrQd7~bA~@oJFQ>SosE$468b?{Y%eT!p@2LG2 zs5~24qEdtpHzihYu~$JR5rcn<*In_G9-yQwa-QE@j5Fh%Rvz%8Nwe(-_7U}ISUBMx9=t6kO zOW)xtgvuNh%4#+^QP7dQHpp_3*DUgCuxBIN`e@lLg>AHCxf0}MG|Ez|u-7*ZeNBfp zAVj$VTqRw|)W;+w)j#2nxa9xZIq;DcSrsPLe|T$Uj<1I*5+xSZQ{2a(J0n|OH!qNc zsahw33X(0UXSH7sx!35l089Dy0Uy@fxgdI?BU#@r z7nWKO1J$WqAoH|AhvI)$u?!AsZ0%KB;e5Carp=A(^|e2!f^ibVrlDI;dce{OuuZlk z_FdmzAvT9Iq_b6V2Si!!d?sv{ENpSXiL}H?AGtR4q&d983sSL3K2_w5@;+~GfxcaZ z`KfjR{sR&pcTU28RqvaJDvQ9kK)Q%tZL|aG1yxM`S>QM?paTwk&GwAVZ`{{pLqbmIek7M{>Hc2J3-ps4hT4d zt>H7SSt`JjoWIx!7E$G* z*f;(4dxv|0%~nfS*F2Fsei>|}a}Kyu!~uB_mHlge%e{A>nuo8wUG=;Ces2_^UvYp$ zB)KF~Oz)VhKFaiv@oz4j!GhBd)kS-JqZMDZlusYT6Z*!LNHz4)i-uoU*?KJ7@05a# zQufE}gs6FD-h6QS+vRFYWKnU&N8R%C%ek&qf>|^18UH%|Jh;Y?SGbpOA+jdm`~J|B zvB@qs@N#cG`o8&GFSV&Z;PDB^tj|Nnsjv=+EMTEI_p-@`1b}wKFkTS<_x$iR^5*{5 z23yjD_2Mr_f+HPATjfuSMU?Huf%++z8{7A1w$19=cXp2~xNFxy_NAL;?SN3(5_k4< zJ(?bwevH4K7D{l3gteKdl@rAb0*&!8fQGxN(P&1Ethxw*xpDH+i;WcRqCFC)-iv%D ztFcoi6mhhQ1>BM%?G`)g+zO7c0`Hchp9et5={ca)*Z_>Z9_c!Xx_Ti@G0F9@xizB; zk>G*7*OFJ?`sZ3#GDytI*3?p}D@!*~j3N5pTVanqh%IjSmbYr}F~)xGKmagtg5^|O zcjd@0h6v_+vS4<>#xp}IZ;Od;!{v23<9S7fx5+Z;I)0nP}PX2 ztQ5adS9;?OT&G0g@*BS?#zs5pI!;oyOC!9hCJRs=!^-pZ#GrV`sU3zWvcvE*_hjQM zySK4ZtQv!r%0Of|nyK!|?@yZOsSQZ9;~9sj&vhR@4ap19Nn<#2lj*@9M|;!;#h9*9 z;~Ta_UZpS;EOku1d*D^n)%F%WA(3Sr7MYRHkK~Na-Bay4gK#-R9aULTVY)i&ZGSbl zHwaq0Y?$U!&twnBuy@Qa8kw8S4`gzOF%E3JakuO4rWQSKsr;X)T?2f@EHC^MS}u0l zALHZ9ES#thUl3ejZsU>RZnPNK#sq)s(AF13RW3Y{wp0CmjWf!To-);kTiTn9YKe@Q z`?CQSgf#JZU^_iz&vKZq?Sv~vno@4dQ1BgZ9h_mw&NOUBy7cw7&&j&PTN2oBfW zY;HG=iU(GWxTrN;C9xZ8+|4N;9CRzdG|a0Ff9ThfzezqySRNcsyY;X2PqC$lP##FD z0&H+qpb)C+)VX(A@u^uBVKO{mSryFpk}J}k2pd^+kCm^MgUu{f{2jrn_O#_PtA2=% zR0VMSm5OJ#9C9*M?hVjfxJD;TXV$MkKCV)6ql|IFE*g3?zFo3wHcgyT515mvBos-R zDHn;vaEWNJ>a7L6UVVH`&@@U}BcTzbei*B5W(T)8&=giik2)?AJk~Sse>CrABmG6Z z)Z;cek^Wv5Tro4x6^Hc3!@~0L7NN%MSnwfOig>n5Td8&m$*pi(ZC#uZVS04|6CNSq=X3t9UBXJ&?(82CgZA`FK%Rz7%&t)8Y~#YG zeu;eobEh3xfe8dGIQv}FiI-O5*^L_yb~two7cTbeJ(J(N%2`gqNGScA33Qk%v=j)F`}i;dF{2@4Yk=Pu9T%_rwGxf&u`oRb?s!hr0MY>v!4Q3P1wGI)yf zWGv?SwMTE>E^;6HBrZ_&b$Km}jEAa&-*lO^c8-@Lbl>g4&QipIB^0~(IR;{S%4k@R zccL;g+9+j@SiMtMzi0zPb-zcI*O_4;Le_%0E~fi#(EWgV<=w`d0yam9NwFBb0&tq6F6vC zu;w3RrIRsk?fm=9bWG-xF~X`GbQ~O-iAjf;qZ@l&HNV6{56a(`mM7ER^bLU1U|GKB<1{8on@vrZO1yf`7zz@4q z(H4179;^n>{;<^J&mk1GG0wfegLM&Y%o~>)DyGzw$D#psvk`@*FK}sL4Ow0hP4cDR zhXDg_womrF19cm6+6{I2D}9M8G(lyEgepeaKz^~mVwj%CgL?~p!=Z^JySj&qtvhi$ zPAy8$I_R12J{{#mF*RWlF${}ryqy*-o=kWSefRXDcDx6Pjw9&f3+&NHaGXis=;~K4 zUxN@&2L}rGJS|8F+PD~+NHbd6zGExlI!BgzAa#ZgarO$2zQTfri7sH|k^XrT(+16< zVNjJblfJIKQ~2Q4;UQ*~6pO93tZtL_X33xTC`B|TfT1z8l$q^`>+!zdIZq+DTGH9qRt<0(1h$CEBY+$8NZ4j$hFe|aJ ztSZ}_ms_D|urRYUwX)y4V-{;HsVr$kHnwGLO~5GzQ?BVV`F zzC4g-(;7+(@2ZqQY4KuIS{hZ zjMFIWRidU={VAk(FKv0ju5GrS03%iw0h1Y(9tKGL=1o`w7=`x^yX)50??)YiE&oXD zN+fu*9DON_>JoqU=L`_vS?m2FHRQk7%ZlSdwKEmT&Sx<^k3z}&(l2%;Cp|=NTA>y(q-ZarQO^KYOVSn ziaa*}RHLm)>IHPG(EpHoXaI0n(SeDEXD9mx$U5`n?EOGN%flb`cIIpcdFT`F{Q$MX zkemA-0!tX^{xh&d1CLGvkCmBD3lER+6QN~g)581zGPDfz|K0Ro)&FkPGBEsS<)=~m z{|e?|`F{oT*rtv-LHNut4C`&EHiFw&5HnKM%BKr%dex$GBzJ>7eehmuJkM%z-u$@3 z1Ya}ooryEh>>WkX>mG^YP}y#mc2}|DOe?PMerqI3=fv3wDAX$+Q2dVj?n1PhX6 zLRp#iFD=PeH_0qe57>V{=41|k7_)KWhUw*kgAH~B^FpqhFFxuS{MK^fdKXR&r@Udegl;tw}c3| z^oK71jRh*mKu>1SVwe-qNQ9OwGPURU9_U-qa(V172^3^^l=6P~vDpFGa0US0KP3Kq z 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 diff --git a/packages/issuance/audits/PR1301/Graph_PR1325_v03.pdf b/packages/issuance/audits/PR1301/Graph_PR1325_v03.pdf deleted file mode 100644 index e210c6ce5fe30647963cb9ca0be3cadd583bc747..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641200 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

Gdo|8DU>k?>U1R4lVX2A-Vk9 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°GINE2IhJR>AhCEtF+Mm#D!P! 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 b7tYTM?a0a^FQX(cEyv0tBBF!RWo7vv`E@j7 diff --git a/packages/issuance/audits/PR1301/Graph_PR1331_v04.pdf b/packages/issuance/audits/PR1301/Graph_PR1331_v04.pdf deleted file mode 100644 index 68967caaf94742503c71775e750fdba9d2cfb968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656340 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�!5a}3 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

V9l< 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%0D%w04Nh^>0PXTlbIxnma1e@U7uM4=#i>~ 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 U6=j4fLXDku%N7H)Av^2;0c^zgl>h($ diff --git a/packages/issuance/audits/PR1301/README.md b/packages/issuance/audits/PR1301/README.md deleted file mode 100644 index 70a0aa8b5..000000000 --- a/packages/issuance/audits/PR1301/README.md +++ /dev/null @@ -1,192 +0,0 @@ -# Trust Security Audit - PR #1301 / #1312 / #1325 / #1331 / #1334 - -**Auditor:** Trust Security -**Period:** 2026-03-03 to 2026-03-19 -**Commit:** 7405c9d5f73bce04734efb3f609b76d95ffb520e -**Fix review commit:** 0bbb476f37f85d042927e84d8764fa58eb020ccf -**2nd fix review commit:** f44fc5a4c74fa5190fd2892ae15a083b79f715f3 -**3rd fix review commit:** bbec75e04aa14c34d771681528b9a655be1f8249 (post-rebase) -**4th fix review commit:** 8d148f39a89e4f569456e098eb4d68f8a8d967e3 -**Report:** [Graph_PR1334_v05.pdf](Graph_PR1334_v05.pdf) - -> **SHA note.** The first three commits cited above are pre-rebase SHAs on -> `indexing-payments-management-audit-fix-2-light`, which was rebased onto -> current `main` as `indexing-payments-management-audit-fixed-rebased`. The pre-rebase tip is -> preserved at tag `indexing-payments-management-audit-pre-rebase` -> (`a3c73f87e`). The 3rd fix review commit is post-rebase only (it -> records the SHA mapping itself). Old → new mapping is at the bottom of -> this file. - -## Findings Summary - -| ID | Title | Severity | Status | -| ------------------------- | -------------------------------------------------------- | -------- | ------------ | -| [TRST-H-1](TRST-H-1.md) | Malicious payer gas siphoning via 63/64 rule | High | Fixed | -| [TRST-H-2](TRST-H-2.md) | Invalid supportsInterface() returndata escapes try/catch | High | Fixed | -| [TRST-H-3](TRST-H-3.md) | Stale escrow snapshot causes perpetual revert loop | High | Fixed | -| [TRST-H-4](TRST-H-4.md) | EOA payer can block collection via EIP-7702 | High | Fixed | -| [TRST-M-1](TRST-M-1.md) | Micro-thaw griefing via permissionless depositTo() | Medium | Fixed | -| [TRST-M-2](TRST-M-2.md) | tempJit fallback in beforeCollection() unreachable | Medium | Fixed | -| [TRST-M-3](TRST-M-3.md) | Instant escrow mode degradation via agreement offer | Medium | Acknowledged | -| [TRST-M-4](TRST-M-4.md) | Returndata bombing via payer callbacks | Medium | Fixed | -| [TRST-L-1](TRST-L-1.md) | Insufficient gas for afterCollection callback | Low | Fixed | -| [TRST-L-2](TRST-L-2.md) | Pending update over-reserves escrow | Low | Fixed | -| [TRST-L-3](TRST-L-3.md) | Unsafe approveAgreement behavior during pause | Low | Fixed | -| [TRST-L-4](TRST-L-4.md) | Pair tracking removal blocked by 1 wei donation | Low | Acknowledged | -| [TRST-L-5](TRST-L-5.md) | \_computeMaxFirstClaim overestimates near deadline | Low | Fixed | -| [TRST-L-6](TRST-L-6.md) | cancel() order sensitivity leaves RCAU offer unreachable | Low | Fixed | -| [TRST-L-7](TRST-L-7.md) | EOA payer signatures cannot be revoked before deadline | Low | Fixed | -| [TRST-L-8](TRST-L-8.md) | Callback gas precheck does not account for overhead | Low | Fixed | -| [TRST-L-9](TRST-L-9.md) | EIP-7702 payer code change enables callback gas griefing | Low | Fixed | -| [TRST-L-10](TRST-L-10.md) | Inaccurate state flags in getAgreementDetails() | Low | Fixed | - -## Client-Reported Findings - -| ID | Title | -| ------------------------- | --------------------------------------------------------------------------- | -| [TRST-CL-1](TRST-CL-1.md) | RecurringCollector may underreport required claim causing under-reservation | -| [TRST-CL-2](TRST-CL-2.md) | IssuanceAllocator may skip minting due to hypothetical governance action | - -## Recommendations - -| ID | Title | -| ------------------------- | --------------------------------------------------------------- | -| [TRST-R-1](TRST-R-1.md) | Avoid redeployment of RewardsEligibilityOracle | -| [TRST-R-2](TRST-R-2.md) | Improve stale documentation | -| [TRST-R-3](TRST-R-3.md) | Incorporate defensive coding best practices | -| [TRST-R-4](TRST-R-4.md) | Document critical assumptions in the RAM | -| [TRST-R-5](TRST-R-5.md) | Ambiguous return value in getAgreementOfferAt() | -| [TRST-R-6](TRST-R-6.md) | Dead code guard in \_validateAndStoreUpdate() | -| [TRST-R-7](TRST-R-7.md) | Remove consumed offers in accept() and update() | -| [TRST-R-8](TRST-R-8.md) | Align pause documentation with callback behavior in the RAM | -| [TRST-R-9](TRST-R-9.md) | \_isAuthorized() override trusts itself for any authorizer | -| [TRST-R-10](TRST-R-10.md) | Document role-change semantics for existing agreements | -| [TRST-R-11](TRST-R-11.md) | Remove or implement unused state flags in IAgreementCollector | -| [TRST-R-12](TRST-R-12.md) | Document ACCEPTED state returned for cancelled agreements | -| [TRST-R-13](TRST-R-13.md) | Document reclaim reason change for stale allocation force-close | -| [TRST-R-14](TRST-R-14.md) | Avoid magic numbers in production code | - -## Centralization Risks - -| ID | Title | -| ------------------------- | --------------------------------------------------------------- | -| [TRST-CR-1](TRST-CR-1.md) | RAM Governor has unilateral control over payment infrastructure | -| [TRST-CR-2](TRST-CR-2.md) | Operator role controls agreement lifecycle and escrow mode | -| [TRST-CR-3](TRST-CR-3.md) | Single RAM instance manages all agreement escrow | - -## Systemic Risks - -| ID | Title | -| ------------------------- | -------------------------------------------------------------- | -| [TRST-SR-1](TRST-SR-1.md) | JIT mode provider payment race condition | -| [TRST-SR-2](TRST-SR-2.md) | Escrow thawing period creates prolonged fund immobility | -| [TRST-SR-3](TRST-SR-3.md) | Issuance distribution dependency for RAM solvency | -| [TRST-SR-4](TRST-SR-4.md) | Try/catch callback pattern silently degrades state consistency | - -## Notes on findings dropped between v02 and v03 - -- v02 **TRST-M-5** (Perpetual thaw griefing via micro deposits) was withdrawn in v03; the underlying concern is treated as a sub-vector of TRST-M-1, addressed by `minResidualEscrowFactor`. -- v02 **TRST-L-6** (Update offer cleanup bypassed via planted offer) was withdrawn in v03; the agreement.payer / per-version persistence refactor done for v03 TRST-L-6 / TRST-L-10 supersedes the original cleanup concern. - -## Pre-rebase → post-rebase SHA mapping - -`indexing-payments-management-audit-fix-2-light` was rebased onto current `main` as `indexing-payments-management-audit-fixed-rebased`. The first-parent linear chain was re-signed (new SHAs); side-branch commits reachable through the two internal merges kept their original SHAs and signatures. - -Verify audit-side content was preserved byte-identically: - -```bash -ORIG=indexing-payments-management-audit-pre-rebase # tag at a3c73f87e -REB=2292e6ae8 # rebased tip before this commit -diff <(git diff "$ORIG" "$REB") <(git diff ddee12b11 main) -# expected: empty -``` - -| old | new | subject | -| ----------- | ----------- | --------------------------------------------------------------------------------------------------- | -| `5c51f0d6a` | `ad157562f` | chore: use ^0.8.27 caret pragma and bump solc to 0.8.34 | -| `bf6d4cb70` | `9b2fddc51` | Merge commit '0e469beeba0ec433e313be8c9129bcf99acdaac6' into indexing-payments-management-audit | -| `28edcd7a3` | `2a9d80b3e` | Merge commit 'd9f053a7d96a8a4d81415303ae1d537f836f887c' into indexing-payments-management-audit | -| `f4451f189` | `927cd08cf` | feat: add back legacy allocation id collision check | -| `fd962344c` | `9edb765ae` | chore: restore pragma | -| `fa9951427` | `79af54585` | fix: cap maxSecondsPerCollection instead of reverting | -| `c6836a716` | `20abcac15` | fix: enforce temporal validation on zero-token collections and remove zero-POI special case | -| `8efaec97d` | `8776d4931` | feat: add adjustThaw to PaymentsEscrow | -| `3f1578cdc` | `5ea7b1e19` | refactor: rename IRewardsEligibility to IProviderEligibility | -| `d20bc844d` | `d31a2c95c` | feat: contract approver model for RecurringCollector accept/update | -| `ec7236086` | `2bcc8ec88` | feat: IDataServiceAgreements interface and SubgraphService integration | -| `89def3d34` | `7d7927a10` | feat: enumerable indexer tracking for REO and issuance constructor cleanup | -| `a23ad681e` | `15bd6ceca` | feat: RecurringAgreementManager with lifecycle, escrow funding, and agreement updates | -| `8673c34c0` | `8ca9cc1e1` | fix(rewards): reorder subtraction in \_updateSubgraphRewards to avoid underflow | -| `506601ff8` | `2b5bce3e8` | fix(test): set subgraphService in snapshot inversion tests | -| `32bd36134` | `0d9e8fe44` | fix(test): exclude named test users from fuzz-generated indexer addresses | -| `0f4f48693` | `cd2f1b468` | feat: add issuance distribution integration to RAM | -| `86a5d6e2b` | `89ba6e873` | docs: clarify two-layer token capping semantics in collection flow | -| `7405c9d5f` | `50e984da9` | docs: add payments trust model | -| `9ae7643eb` | `6a9e37209` | test: add cross-package testing harness with callback gas measurements | -| `efc51160f` | `251e16f28` | docs(audit): add PR1301 audit report and findings | -| `956d983aa` | `f5617ef98` | feat(RAM): threshold-based escrow basis degradation (TRST-M-2, TRST-M-3) | -| `e1d73c109` | `435a281f7` | fix(RAM): refresh escrow snapshot in \_updateEscrow (TRST-H-3) | -| `e1a3c5ade` | `4fc2be9fd` | fix(RAM): add minimum thaw fraction to prevent dust-thaw griefing (TRST-M-1) | -| `56322cc50` | `e3bec768d` | feat(RM): add revert control for ineligible indexers | -| `3b617b47b` | `3f9c68c12` | docs(audit): acknowledge audit findings (TRST-CR-1/3, L-4, R-1, SR-1/2/3) | -| `df93851fb` | `df7f08123` | feat: resize allocations to zero instead of force-closing | -| `b1246562b` | `4c61ad9d6` | feat: revert closing allocations with active indexing agreement | -| `40c910464` | `a93ee9285` | fix(collector): reject agreements with overflow-prone token/duration terms | -| `83e25156a` | `74aaa3417` | feat(collector): offer storage, stored-hash auth, scoped claims and cancel (TRST-L-2, L-5) | -| `38b090c2b` | `68c8a39f4` | fix(collector): harden payer callbacks, add opt-in eligibility gate (TRST-H-1, H-2, H-4, L-1, SR-4) | -| `5b4100543` | `9d16819a7` | fix: compiler stack overflow | -| `608346eb2` | `f56be5f8e` | refactor(RAM): replace set-based range views with indexed accessors | -| `0b22a1408` | `fc8e14124` | feat(RAM): add emergency role control and eligibility oracle escape hatch | -| `77fc87f78` | `22eab2737` | refactor(RAM): convert offerAgreement and cancelAgreement to IAgreementCollector pass-throughs | -| `64bc0f0ed` | `87a0b899c` | refactor(RAM): remove offerAgreementUpdate, revokeAgreementUpdate, and revokeOffer | -| `daf0b47ed` | `2e75ecc92` | refactor(RAM): restructure storage into collector → provider hierarchy | -| `9ec2c072e` | `67af760a7` | feat(collector): make RecurringCollector upgradeable | -| `bbe019588` | `be5cead8c` | feat(collector): add pause mechanism to RecurringCollector (TRST-L-3) | -| `0bbb476f3` | `70b8fa1d7` | fix(subgraph-service): remove VALID_PROVISION and REGISTERED from cancelIndexingAgreement | -| `df9a8464e` | `b289023b9` | docs: update audit extracts for PR1301 v02 report | -| `cb6c45c1a` | `a882efc15` | fix(collector): add gas overhead buffer to callback prechecks (TRST-L-9) | -| `3ce581315` | `8a22a87ae` | fix(collector): cap returndata copy in payer callbacks (TRST-M-4) | -| `8e50abda2` | `c7f3c4b79` | docs: add response to TRST-L-10 EIP-7702 callback dispatch (won't fix) | -| `6a0ac799d` | `a7a730558` | feat(RAM): drop pair tracking below residual escrow threshold (TRST-M-1, TRST-M-5) | -| `f96a7316c` | `c1ba8b5ba` | docs: add responses to TRST-L-6, TRST-R-7 (both won't fix) | -| `35447e703` | `466599894` | docs(audit): acknowledge TRST-R-3 cancelAgreement defensive check | -| `2dd23720f` | `018a31524` | fix(collector): remove dead oldHash guard (TRST-R-6) | -| `c1ef1cb68` | `7a2ceeafc` | fix(collector): non-zero offer types, reserve OFFER_TYPE_NONE=0 sentinel (TRST-R-5) | -| `36217930d` | `98acdddfe` | refactor(interfaces): drop unused state and offer-option flags, tighten flag NatSpec (TRST-R-11) | -| `f32e55024` | `bebf0dbff` | docs(audit): acknowledge trust-boundary correction in TRST-H-4 | -| `d2fd36444` | `65a63fa91` | docs(audit): acknowledge reclaim-reason change in TRST-R-13 | -| `b61d4415f` | `eb511caa0` | docs(ram): document collector replay-protection assumption (TRST-R-4) | -| `02710154d` | `f2441eabc` | docs(ram): document non-retroactive role-change semantics (TRST-R-10) | -| `1ee49f232` | `ad829d054` | docs(ram): align pause-escalation prose with whenNotPaused scope (TRST-R-8) | -| `9396dbd12` | `c2c15eb74` | docs(collector): note self-authorization auth-check obligation (TRST-R-9) | -| `1e5a6b33a` | `229ede684` | fix(subgraph-service): validate update terms against RCAU rate, not stale agreement rate | -| `8be1aa0c8` | `35ba8639a` | refactor(collector): preparatory helpers, signatures, and version constants | -| `cfaf39b21` | `9ad649837` | refactor(collector): drop unreachable agreementId-zero check | -| `35748ff47` | `cb36d5717` | refactor(collector): extract \_requireValidTerms from duplicated validation | -| `0ad0be4fd` | `25fd07088` | refactor(collector): split accept logic out of \_validateAndStoreAgreement | -| `bfe77547d` | `4fdbdab9b` | refactor(collector): split update apply out of \_validateAndStoreUpdate | -| `594d19b07` | `08634a331` | feat(subgraph-service): idempotent accept/update with allocation rebinding | -| `885555e91` | `51963df39` | refactor(collector): hoist solhint-disable, idiomatic deadline comparisons | -| `572853b01` | `c4c52dea4` | fix(collector): validate offer terms against deadline, not block.timestamp | -| `b6adbf16b` | `523171e84` | refactor(collector): extract \_getAgreementDetails/\_versionHashAt helpers | -| `8b48437be` | `41caee8fc` | fix(collector): persistent agreement.payer for independent cancellation (TRST-L-7) | -| `769b252e5` | `de4997923` | feat(collector): idempotent accept/update/cancel-on-nothing | -| `f96b4ea65` | `600951db2` | feat(collector): add OfferCancelled event for SCOPE_PENDING cancellations | -| `c1dfc34af` | `ef0c92e47` | feat(collector): per-version semantics in getAgreementDetails (TRST-L-11) | -| `33d2cede2` | `f2361e8b4` | feat(collector): compose cancel/settled flags in getAgreementDetails (TRST-R-12) | -| `fe13b1128` | `262d9cc51` | feat(collector): add SCOPE_SIGNED to cancel() for EOA offer revocation (TRST-L-8) | -| `b13d9106c` | `258a0f32b` | feat(issuance): expose getIssuanceAllocator on IIssuanceTarget | -| `e4cd9e026` | `d28e30c10` | fix(collector): validate full terms at offer time | -| `6772545f1` | `1434b1249` | fix(collector): respect deadlines in scoped claim cap | -| `067168e4d` | `740192335` | refactor(collector): collapse redundant state guard in \_getMaxNextClaim | -| `757da4174` | `950b23b13` | fix(collector): use dedicated error for invalid offer type in offer() | -| `87ee8b6df` | `7c12e2f80` | chore(collector): make module-level constants internal to free EIP-170 headroom | -| `f44fc5a4c` | `a8f46322a` | feat(collector): add CONDITION_AGREEMENT_OWNER for ERC-165-validated callback opt-in | -| `5b07b5833` | `11292cf12` | docs(audits): drop withdrawn TRST findings, retitle and park remaining lows for v03 | -| `68cd77e5f` | `3af1424fc` | docs(audits): rename parked v03 lows from TRST-L-{old}-{new}.md to final paths | -| `f09c2e3ac` | `7911e1de9` | docs(audits): incorporate Trust Security PR1325 v03 fix-review | -| `9b30707b0` | `80c5010cf` | docs(collector): clarify cancel() signer-vs-payer caller for SCOPE_SIGNED (TRST-L-7) | -| `c21d7f88f` | `8d1653753` | test(collector): assert callbacks receive MAX_PAYER_CALLBACK_GAS with safety margin (TRST-L-8) | -| `75cae7ceb` | `66dec495f` | docs(collector): document EIP-7702 trust assumption for CONDITION_ELIGIBILITY_CHECK (TRST-L-9) | -| `c8a5c2150` | `93e7d1cbb` | refactor(ram): use VERSION_CURRENT instead of magic 0 in getAgreementDetails (TRST-R-14) | -| `a3c73f87e` | `2292e6ae8` | chore(ci): fix flaky CI tests and silence block-timestamp lint | diff --git a/packages/issuance/audits/PR1301/TRST-CL-1.md b/packages/issuance/audits/PR1301/TRST-CL-1.md deleted file mode 100644 index 94f92f1c9..000000000 --- a/packages/issuance/audits/PR1301/TRST-CL-1.md +++ /dev/null @@ -1,17 +0,0 @@ -# TRST-CL-1: RecurringCollector may underreport required claim causing under-reservation in the RAM - -- **Category:** Logical flaws -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -In the refactored codebase, `_getMaxNextClaimScoped()` returns the next worst-case collection as a `max()` of PENDING and ACTIVE scopes. In the PENDING calculation, the collection time window always starts at `block.timestamp`. However, new agreements after `update()` take effect retroactively, so the time window may be larger (since last collection date). - -The end impact is an understated next claim, which may cause the RAM to under-reserve for the particular allocation. No loss of funds is possible, although a delay in payment may arise. - -## Mitigation Review - -Issue has been addressed surgically. The function now accounts for the last collection time in case the agreement has already been accepted. - ---- diff --git a/packages/issuance/audits/PR1301/TRST-CL-2.md b/packages/issuance/audits/PR1301/TRST-CL-2.md deleted file mode 100644 index d3bbe3235..000000000 --- a/packages/issuance/audits/PR1301/TRST-CL-2.md +++ /dev/null @@ -1,17 +0,0 @@ -# TRST-CL-2: IssuanceAllocator may skip minting due to hypothetical governance action - -- **Category:** Logical flaws -- **Source:** IssuanceAllocator.sol -- **Status:** Fixed - -## Description - -The `_advanceSelfMintingBlock()` implementation optimizes the minting happy-path, and if there is no accumulating minting quota and the contract isn't paused, it does not increment the allocator. This is generally correct because under the presumed `_distributeIssuance()` call path, the happy path would lead to minting through `_performNormalDistribution()`, so accumulator should not be touched. However, there are hypothetical paths to the advance logic through the overloaded `distributePendingIssuance()`. In case these are used and the conditions for happy-path are met, the offset will not be updated, yet `_performNormalDistribution()` will not be called as part of the flow, causing under-minting of GRT. - -The scenario is considered pathological because the governance-controlled distribution functions are unnecessary in the happy path, since `distributeIssuance()` achieves the same, and the contracts are past any sort of recovery mode at that point. - -## Mitigation Review - -The implementation has been simplified: the optimized path no longer exists and the accumulator invariant always holds. - ---- diff --git a/packages/issuance/audits/PR1301/TRST-CR-1.md b/packages/issuance/audits/PR1301/TRST-CR-1.md deleted file mode 100644 index 65827afaa..000000000 --- a/packages/issuance/audits/PR1301/TRST-CR-1.md +++ /dev/null @@ -1,19 +0,0 @@ -# TRST-CR-1: RAM Governor has unilateral control over payment infrastructure - -- **Severity:** Centralization Risk - -## Description - -The RecurringAgreementManager's `GOVERNOR_ROLE` has broad unilateral authority over critical payment infrastructure: - -- Controls which data services can participate (`DATA_SERVICE_ROLE` grants) -- Controls which collectors are trusted (`COLLECTOR_ROLE` grants) -- Can set the issuance allocator address, redirecting the token flow that funds all escrow -- Can set the provider eligibility oracle, which gates who can receive payments -- Can pause the entire contract, halting all agreement management - -A compromised or malicious governor could revoke a data service's role (preventing new agreements), change the issuance allocator to a contract that withholds funds, or set a malicious eligibility oracle that blocks specific providers from collecting. These actions affect all agreements managed by the RAM, not just future ones. - ---- - -Accepted centralization tradeoff. The governor must have these powers for effective protocol operation. Expected to be a multisig or governance contract in production. diff --git a/packages/issuance/audits/PR1301/TRST-CR-2.md b/packages/issuance/audits/PR1301/TRST-CR-2.md deleted file mode 100644 index 3331459bb..000000000 --- a/packages/issuance/audits/PR1301/TRST-CR-2.md +++ /dev/null @@ -1,17 +0,0 @@ -# TRST-CR-2: Operator role controls agreement lifecycle and escrow mode - -- **Severity:** Centralization Risk - -## Description - -The `OPERATOR_ROLE` (admin of `AGREEMENT_MANAGER_ROLE`) controls the operational layer of the RAM: - -- Grants `AGREEMENT_MANAGER_ROLE`, which authorizes offering, updating, revoking, and canceling agreements -- Can change the `escrowBasis` (Full/OnDemand/JIT), instantly affecting escrow behavior for all existing agreements -- Can set `tempJit`, overriding the escrow mode to JIT for all pairs - -An operator switching from Full to JIT mode instantly removes proactive escrow guarantees for all providers. Providers who accepted agreements under the assumption of Full escrow backing may find their payment security degraded without notice or consent. The escrow mode change is a storage write with no timelock or multi-sig requirement. - ---- - -Accepted. The operator is a trusted role managing agreement lifecycle and escrow parameters on behalf of the protocol. Escrow parameter changes are visible on-chain via events. diff --git a/packages/issuance/audits/PR1301/TRST-CR-3.md b/packages/issuance/audits/PR1301/TRST-CR-3.md deleted file mode 100644 index 42097257c..000000000 --- a/packages/issuance/audits/PR1301/TRST-CR-3.md +++ /dev/null @@ -1,15 +0,0 @@ -# TRST-CR-3: Single RAM instance manages all agreement escrow - -- **Severity:** Centralization Risk - -## Description - -The RecurringAgreementManager is a single contract instance that manages escrow for all agreements across all (collector, provider) pairs. The `totalEscrowDeficit` is a global aggregate, and the escrow mode (Full/OnDemand/JIT) applies uniformly to all pairs. - -This means operational decisions or issues affecting one pair can cascade to all others. For example, a single large agreement that becomes insolvent increases `totalEscrowDeficit`, potentially degrading the escrow mode from Full to OnDemand for every other pair. Similarly, a stale snapshot on one pair (TRST-H-3) affects the global deficit calculation. - -There is no isolation between pairs beyond the per-pair `sumMaxNextClaim` tracking. The RAM does not support per-pair escrow mode configuration or per-pair balance ringfencing. - ---- - -Accepted design tradeoff. The shared pool optimizes capital efficiency — per-pair isolation would significantly increase complexity, gas costs, and operational overhead. The snap-refresh fix (TRST-H-3) and minThawFraction (TRST-M-1) reduce cascading effects. diff --git a/packages/issuance/audits/PR1301/TRST-H-1.md b/packages/issuance/audits/PR1301/TRST-H-1.md deleted file mode 100644 index 7c15cd250..000000000 --- a/packages/issuance/audits/PR1301/TRST-H-1.md +++ /dev/null @@ -1,30 +0,0 @@ -# TRST-H-1: Malicious payer gas siphoning via 63/64 rule in collection callbacks leads to collection bypass - -- **Severity:** High -- **Category:** Gas-related issues -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -In `RecurringCollector._collect()`, the `beforeCollection()` and `afterCollection()` callbacks to contract payers are wrapped in try/catch blocks (lines 380, 416). A malicious contract payer can exploit the EVM's 63/64 gas forwarding rule to consume nearly all available gas in these callbacks. - -The attack works as follows: the malicious payer's `beforeCollection()` implementation consumes 63/64 of the gas forwarded to it, either returning successfully or reverting, but regardless leaving only 1/64 of the original gas for the remainder of `_collect()`. The core payment logic (`PaymentsEscrow.collect()` at line 384) and event emissions then execute with a fraction of the expected gas. The `afterCollection()` callback then consumes another 63/64 of what remains. - -Realistically, after both callbacks siphon gas, there will not be enough gas left to complete the `PaymentsEscrow.collect()` call and the subsequent event emissions, causing the entire `collect()` transaction to revert. The security model for Payer as a smart contract does not account for requiring such gas expenditure, which can also be obfuscated away. This gives the malicious payer effective veto power over all collections against their agreements. - -## Recommended Mitigation - -Enforce a minimum gas reservation before each callback. Before calling `beforeCollection()`, check that `gasleft()` is sufficient and forward only a bounded amount of gas using the `{gas: maxCallbackGas}` syntax, retaining enough gas for the core payment logic. Apply the same pattern to `afterCollection()`. This caps the gas available to the payer's callbacks regardless of their implementation, ensuring the critical `PaymentsEscrow.collect()` call always has enough gas to complete. - -## Team Response - -Fixed. - -## Mitigation Review - -Issue has been fixed as suggested. - ---- - -Fixed. Added `MAX_PAYER_CALLBACK_GAS` constant (1,500,000 gas) in `RecurringCollector._collect()`. All external calls to payer contracts (`isEligible`, `beforeCollection`, `afterCollection`) now use gas-capped low-level `call`/`staticcall`, preventing gas siphoning via the 63/64 forwarding rule. A `gasleft()` guard before the callback block reverts with `RecurringCollectorInsufficientCallbackGas` when insufficient gas remains, ensuring core payment logic always has enough gas to complete. diff --git a/packages/issuance/audits/PR1301/TRST-H-2.md b/packages/issuance/audits/PR1301/TRST-H-2.md deleted file mode 100644 index 3f8eea841..000000000 --- a/packages/issuance/audits/PR1301/TRST-H-2.md +++ /dev/null @@ -1,30 +0,0 @@ -# TRST-H-2: Invalid supportsInterface() returndata escapes try/catch leading to collection bypass - -- **Severity:** High -- **Category:** Logical flaws -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -In `RecurringCollector._collect()` (lines 368-378), the provider eligibility check calls `IERC165(agreement.payer).supportsInterface()` inside a try/catch block. The try clause expects a `(bool supported)` return value. If the external call succeeds at the EVM level (does not revert) but returns malformed data - such as fewer than 32 bytes of returndata or data that cannot be ABI-decoded as a bool - the Solidity ABI decoder reverts on the caller side when attempting to decode the return value. - -This ABI decoding revert occurs in the calling contract's execution context, not in the external call itself. Solidity's try/catch mechanism only catches reverts originating from the external call (callee-side reverts). Caller-side decoding failures escape the catch block and propagate as an unhandled revert, causing the entire `_collect()` transaction to fail. - -A malicious contract payer can exploit this by implementing a `supportsInterface()` function that returns success with empty returndata, a single byte, or any non-standard encoding. This permanently blocks all collections against agreements with that payer, since the `code.length > 0` check always routes through the vulnerable path. As before, the security model does not account for this bypass path to be validated against. - -## Recommended Mitigation - -Avoid receiving and decoding values from untrusted contract calls. This can be done manually by reading returndata at the assembly level. - -## Team Response - -Fixed. - -## Mitigation Review - -Fixed. The affected code has been refactored, addressing the issue. - ---- - -Fixed. Replaced the `supportsInterface` → `isEligible` two-step with a single direct `isEligible` low-level `staticcall` with gas cap. Returndata is validated for length (>= 32 bytes) and decoded as `uint256`. Only an explicit return of `0` blocks collection; reverts, short returndata, and malformed responses are treated as "no opinion" (collection proceeds), with a `PayerCallbackFailed` event emitted for observability. diff --git a/packages/issuance/audits/PR1301/TRST-H-3.md b/packages/issuance/audits/PR1301/TRST-H-3.md deleted file mode 100644 index 66bddea4d..000000000 --- a/packages/issuance/audits/PR1301/TRST-H-3.md +++ /dev/null @@ -1,32 +0,0 @@ -# TRST-H-3: Stale escrow snapshot causes a perpetual revert loop - -- **Severity:** High -- **Category:** Logical flaws -- **Source:** RecurringAgreementManager.sol -- **Status:** Fixed - -## Description - -The RecurringAgreementManager (RAM) maintains an `escrowSnap` per (collector, provider) pair - a cached view of the escrow balance used to compute `totalEscrowDeficit`. This snap is only updated at the end of `_updateEscrow()` via `_setEscrowSnap()`. When `afterCollection()` is called by the RecurringCollector after a payment collection, the escrow balance has already been reduced by the collected amount, but `escrowSnap` still reflects the pre-collection value. - -The stale-high snap causes `_escrowMinMax()` to understate the deficit. In Full escrow mode, when the RAM's free token balance is low, this leads to an incorrect decision to deposit into escrow. The deposit attempt reverts due to insufficient ERC20 balance, and the entire `afterCollection()` call fails. Since RecurringCollector wraps `afterCollection()` in try/catch (line 416), the revert is silently swallowed - but the snap never gets updated, making it permanently stale. - -This is self-reinforcing: every subsequent `afterCollection()`, `reconcileAgreement()`, and `reconcileCollectorProvider()` call for the affected pair follows the same code path and reverts for the same reason. There is no manual recovery path. The escrow accounting diverges from reality for the affected pair, and `totalEscrowDeficit` is globally understated, potentially causing other pairs to incorrectly enter Full mode and over-deposit. - -The state only self-heals when the RAM receives enough tokens (e.g., from issuance distribution) to cover the phantom deposit, at which point the deposit succeeds but sends tokens to escrow unnecessarily. - -## Recommended Mitigation - -Read the fresh escrow balance inside `_escrowMinMax()` when computing the deficit, rather than relying on the cached `escrowSnap` derived from `totalEscrowDeficit`. This makes the function self-correcting: even if a prior `afterCollection()` failed, the next call sees the true balance and makes the correct deposit/thaw decision. This approach fixes the root cause rather than masking the symptom with a balance guard. - -## Team Response - -Fixed. - -## Mitigation Review - -The new code has a `_setEscrowSnap()` call before `_escrowMinMax()`, ensuring the snapshot is updated and fixing the root cause. - ---- - -Now refreshing the cached `escrowSnap` at the start of `_updateEscrow()` so that `_escrowMinMax()` uses updated `totalEscrowDeficit`. diff --git a/packages/issuance/audits/PR1301/TRST-H-4.md b/packages/issuance/audits/PR1301/TRST-H-4.md deleted file mode 100644 index d9fa550bc..000000000 --- a/packages/issuance/audits/PR1301/TRST-H-4.md +++ /dev/null @@ -1,32 +0,0 @@ -# TRST-H-4: EOA payer can block collection by acquiring code via EIP-7702 - -- **Severity:** High -- **Category:** Type confusion -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -In `RecurringCollector._collect()` (lines 368-378), the provider eligibility gate is applied when `agreement.payer.code.length > 0`. This gate was designed as an opt-in mechanism for contract payers to control which providers can collect. However, with EIP-7702 (live on both Ethereum mainnet and Arbitrum), an EOA can set a code delegation to an arbitrary contract address. - -An EOA payer who originally signed an agreement via the ECDSA path can later acquire code using an EIP-7702 delegation transaction. This causes the `code.length > 0` branch to activate during collection. By delegating to a contract that implements `supportsInterface()` returning true for `IProviderEligibility` and `isEligible()` returning false, the payer triggers the `require()` on line 373. - -The `require()` is inside the try block's success handler. In Solidity, reverts in the success handler are NOT caught by the catch block - they propagate up and revert the entire transaction. This gives the payer complete, toggleable control over whether collections succeed. The payer can enable the delegation to block collections, disable it to sign new agreements, and re-enable it before collection attempts - all at negligible gas cost. - -The payer can then thaw and withdraw their escrowed funds after the thawing period, effectively receiving services for free. This bypasses the assumed security model where a provider can trust the escrow balance for an EOA payer to ensure collection will succeed. - -## Recommended Mitigation - -Record whether the payer had code at agreement acceptance time by adding a bool flag to the agreement struct (e.g., `payerIsContract`). Only apply the `IProviderEligibility` gate when the payer was a contract at acceptance. This preserves the eligibility feature for legitimate contract payers while closing the EOA-to-contract vector introduced by EIP-7702. - -## Team Response - -Fixed. - -## Mitigation Review - -Fixed under the assumption that a provider setting `CONDITION_ELIGIBILITY_CHECK` to true must trust the payer contract. The statement in the fix comment that "An EOA cannot pass this check, so an EOA cannot create an agreement with eligibility gating enabled" is inaccurate, because an EOA can always change its code back and forth via EIP-7702 to pass interface checks. The correct security boundary is that the provider trusts the payer contract when opting into eligibility, not that the payer cannot be an EOA. - ---- - -Agreed; the security boundary is that a provider opts into `CONDITION_ELIGIBILITY_CHECK` to trust the payer contract. diff --git a/packages/issuance/audits/PR1301/TRST-L-1.md b/packages/issuance/audits/PR1301/TRST-L-1.md deleted file mode 100644 index ed4cd9f11..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-1.md +++ /dev/null @@ -1,30 +0,0 @@ -# TRST-L-1: Insufficient gas for afterCollection callback leaves escrow state outdated - -- **Severity:** Low -- **Category:** Time sensitivity flaw -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -In `RecurringCollector._collect()`, after a successful escrow collection, the function notifies contract payers via a try/catch call to `afterCollection()` (line 416). The caller (originating at data provider) controls the gas forwarded to the `collect()` transaction. By providing just enough gas for the core collection to succeed but not enough for the `afterCollection()` callback, the external call will revert due to an out-of-gas error, which is silently caught by the catch block. - -For the RecurringAgreementManager (RAM), `afterCollection()` triggers `_reconcileAndUpdateEscrow()`, which reconciles the agreement's `maxNextClaim` against on-chain state and updates the escrow snapshot via `_setEscrowSnap()`. When this callback is skipped, the `escrowSnap` remains at its pre-collection value, overstating the actual escrow balance. This stale snapshot causes `totalEscrowDeficit` to be understated, which can lead to incorrect escrow mode decisions in `_escrowMinMax()` for subsequent operations on the affected (collector, provider) pair. - -The state will self-correct on the next successful call to `_updateEscrow()` for the same pair (e.g., via `reconcileAgreement()` or a subsequent collection with sufficient gas), so the impact is temporary. However, during the stale window, escrow rebalancing decisions may be suboptimal. - -## Recommended Mitigation - -Enforce a minimum gas forwarding requirement for the `afterCollection()` callback. This can be done by checking `gasleft()` before the `afterCollection()` call and reverting if insufficient gas remains for the callback to execute meaningfully. - -## Team Response - -Fixed. - -## Mitigation Review - -Fixed as suggested. - ---- - -A `gasleft()` guard before each payer callback (`isEligible`, `beforeCollection`, `afterCollection`) reverts the entire collection when insufficient gas remains. Callbacks use low-level `call`/`staticcall` with gas cap (`MAX_PAYER_CALLBACK_GAS`); failures emit `PayerCallbackFailed` for observability but do not block collection. diff --git a/packages/issuance/audits/PR1301/TRST-L-10.md b/packages/issuance/audits/PR1301/TRST-L-10.md deleted file mode 100644 index 73be05ec4..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-10.md +++ /dev/null @@ -1,39 +0,0 @@ -# TRST-L-10: Inaccurate state flags returned by getAgreementDetails() and \_offerUpdate() - -- **Severity:** Low -- **Category:** Logical flaws -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -The `IAgreementCollector` interface defines state bit flags including `ACCEPTED` and `UPDATE`, with the documented convention that `UPDATE` is ORed into the state returned by `getAgreementDetails()` for pending versions (index 1). Two deviations from the specification were observed. - -First, in `_offerUpdate()` (lines 417 to 455), when an update is offered against an already accepted agreement, the returned `AgreementDetails` sets state to `REGISTERED | UPDATE` without ORing `ACCEPTED`. Callers that inspect the returned state to determine whether the agreement is already live will misread the underlying agreement as not accepted. - -Second, in `getAgreementDetails()` (lines 500 to 528), the `UPDATE` bit is never ORed into the returned state for the pending version path. The interface documentation promises this behavior for pending versions, but the implementation returns `REGISTERED` or `ACCEPTED` without regard to whether an RCAU offer is pending. - -Neither deviation changes on-chain accounting, but integrators relying on the declared state semantics will receive misleading data. - -## Recommended Mitigation - -In `_offerUpdate()`, OR the `ACCEPTED` bit into state when the underlying agreement is in the Accepted state. In `getAgreementDetails()`, OR the `UPDATE` bit into the returned state when a pending RCAU offer exists for the agreement. - -## Team Response - -`getAgreementDetails()` previously ignored the `index` parameter and returned only `ACCEPTED` for any agreement past `NotAccepted`, regardless of whether a pending RCAU also existed. It now honors `index` as a generic version selector with two named aliases: - -- `VERSION_CURRENT = 0` — the active version. For an accepted agreement, returns agreement fields + `activeTermsHash` with `REGISTERED | ACCEPTED`, plus `UPDATE` when the active terms came from an update. Pre-acceptance, returns the stored RCA offer with `REGISTERED`. Identity (`payer`, `dataService`, `serviceProvider`) is read from agreement storage in both cases; these fields are now persisted in `offer()`. -- `VERSION_NEXT = 1` — the next queued version: a pending RCAU awaiting acceptance. Returns `REGISTERED | UPDATE` when present; empty once accepted (at which point it has moved to `VERSION_CURRENT`). - -`getAgreementOfferAt()` mirrors the same per-version semantics: `VERSION_CURRENT` returns the offer that produced `activeTermsHash` (RCA pre-update or RCAU post-update); `VERSION_NEXT` returns the pending RCAU when distinct from the active hash. - -`offer()` and `getAgreementDetails()` share a state composer keyed by version index, so both surfaces report identical flags. Flags split into per-version (`REGISTERED`, `ACCEPTED`, `UPDATE`, `SETTLED`) and per-agreement (`NOTICE_GIVEN`, `BY_PAYER`, `BY_PROVIDER`) groups. `ACCEPTED` is set only when the queried version equals `activeTermsHash`; `SETTLED` is scoped to the version's own claim (active or pending) so a non-zero claim on one version does not suppress `SETTLED` on the other. - -After `update()` promotes an RCAU to active, those bytes live in the RCAU slot. A subsequent `offer(OFFER_TYPE_UPDATE)` with a different hash overwrites that slot and the active RCAU's bytes, therefore they cannot be returned by `getAgreementOfferAt(id, VERSION_CURRENT)`. Resolving this without a hash-keyed terms store would require a third storage slot or a flexible-type slot, both judged disproportionate to the observability concern. - -## Mitigation Review - -The latest changes implement a more consistent viewing interface for the contracts, addressing the issues identified. - ---- diff --git a/packages/issuance/audits/PR1301/TRST-L-2.md b/packages/issuance/audits/PR1301/TRST-L-2.md deleted file mode 100644 index f3eee05c5..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-2.md +++ /dev/null @@ -1,30 +0,0 @@ -# TRST-L-2: Pending update over-reserves escrow with unrealistically conservative calculation - -- **Severity:** Low -- **Category:** Arithmetic issues -- **Source:** RecurringAgreementManager.sol -- **Status:** Fixed - -## Description - -In `offerAgreementUpdate()` (line 328), the pending update's `maxNextClaim` is computed via `_computeMaxFirstClaim()` using the full `maxSecondsPerCollection` window and the new `maxInitialTokens`. This amount is added to `sumMaxNextClaim` alongside the existing (non-pending) `maxNextClaim`, making both slots additive. - -This is overly conservative because only one set of terms is ever active at a time. While the update is pending, the RAM reserves escrow for both the current agreement terms and the proposed updated terms simultaneously. The correct calculation should take the maximum of the two rates multiplied by `maxSecondsPerCollection` plus the new `maxInitialTokens`, and add the old `maxInitialTokens` only if the initial collection has not yet occurred. - -The over-reservation reduces the effective capacity of the RAM, ties up capital that could serve other agreements, and in Full mode can trigger escrow mode degradation by inflating `totalEscrowDeficit`. Once the update is accepted or revoked, the excess is released, but during the pending window the impact on escrow accounting is significant for high-value agreements. Additionally, the over-reservation will trigger an unnecessary thaw as soon as the agreement update completes, since escrow will exceed the corrected target. - -## Recommended Mitigation - -The `pendingMaxNextClaim` should be computed as stated above, then reduced by the current `maxNextClaim` so that the total deficit is accurate. This reflects the reality that only one set of terms is active at any time, and the worst-case scenario where `collect()` is called before and after the agreement update. - -## Team Response - -Fixed. - -## Mitigation Review - -Refactored so that at any point, the accurate worst-case collection is reflected. - ---- - -Fixed. RAM now delegates all max-claim estimates to the collector via `IAgreementCollector.getMaxNextClaim(agreementId)`, which returns `max(active, pending)` — only the larger of current or pending terms is reserved, not both additively. The RC's `_getMaxNextClaimScoped` computes active and pending claims independently and returns the maximum, ensuring per-agreement escrow contribution reflects the worst-case single-term scenario. diff --git a/packages/issuance/audits/PR1301/TRST-L-3.md b/packages/issuance/audits/PR1301/TRST-L-3.md deleted file mode 100644 index 92a21e7e4..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-3.md +++ /dev/null @@ -1,32 +0,0 @@ -# TRST-L-3: Unsafe behavior of approveAgreement during pause - -- **Severity:** Low -- **Category:** Access control issues -- **Source:** RecurringAgreementManager.sol -- **Status:** Fixed - -## Description - -The `approveAgreement()` function (line 226) is a view function with no `whenNotPaused` modifier. During a pause, it continues to return the magic selector for authorized hashes, allowing the RecurringCollector to accept new agreements or apply updates even while the RAM is paused. - -A pause is typically an emergency measure intended to halt all state-changing operations. Allowing agreement acceptance during pause undermines this intent, as the accepted agreement creates obligations (escrow reservations, `maxNextClaim` tracking) that the paused RAM cannot manage. - -Similarly, `beforeCollection()` and `afterCollection()` do not check pause state. While blocking these during pause could prevent providers from collecting earned payments, allowing them could pose a security risk if the pause was triggered due to a discovered vulnerability in the escrow management logic. - -## Recommended Mitigation - -Add a pause check to `approveAgreement()` that returns `bytes4(0)` when the contract is paused, preventing new agreement acceptances and updates during emergency pauses. For `beforeCollection()` and `afterCollection()`, evaluate the trade-off: blocking them protects against exploitation of escrow logic bugs during pause, while allowing them ensures providers can still collect earned payments. Consider allowing collection callbacks only in a restricted mode during pause. - -## Team Response - -Fixed. - -## Mitigation Review - -Fixed. Underlying code has been refactored, addressing the issue. - ---- - -Fixed. RecurringCollector now has a pause mechanism with `whenNotPaused` modifier gating `accept`, `update`, `collect`, `cancel`, and `offer`. Pause guardians are managed by the governor via `setPauseGuardian`. This provides a middle layer between the RAM-level pause (agreement lifecycle only) and the Controller-level nuclear pause (all escrow operations protocol-wide). - -The `approveAgreement` callback has been removed entirely — stored-hash authorization replaced callback-based approval, so the pause-bypass vector no longer exists. Collection callbacks (`beforeCollection`, `afterCollection`) are wrapped in try/catch and cannot block collection regardless of pause state. diff --git a/packages/issuance/audits/PR1301/TRST-L-4.md b/packages/issuance/audits/PR1301/TRST-L-4.md deleted file mode 100644 index 4df8bbef9..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-4.md +++ /dev/null @@ -1,26 +0,0 @@ -# TRST-L-4: Pair tracking removal blocked by 1 wei escrow donation - -- **Severity:** Low -- **Category:** Donation attacks -- **Source:** RecurringAgreementManager.sol -- **Status:** Acknowledged - -## Description - -When the last agreement for a (collector, provider) pair is deleted, `_reconcilePairTracking()` is intended to remove the pair from the tracking sets (`collectorProviders`, `collectors`) and clean up the escrow state. However, an attacker can prevent this cleanup by depositing 1 wei of GRT into the pair's escrow account via `PaymentsEscrow.deposit()` just before the reconciliation occurs. - -The donation increases the escrow balance, which in turn updates the `escrowSnap` to a non-zero value during `_updateEscrow()`. The `_reconcilePairTracking()` function checks whether the `escrowSnap` is zero to determine if the pair can be safely removed. With the 1 wei donation, this check passes (snap != 0), and the pair is retained in the tracking sets even though it has no active agreements. - -This leaves orphaned entries in the `collectorProviders` and `collectors` tracking sets, preventing clean removal of the collector from the RAM's accounting. - -## Recommended Mitigation - -In `_reconcilePairTracking()`, base the removal decision on `pairAgreementCount` reaching zero rather than on `escrowSnap` being zero. If no agreements remain for a pair, remove it from tracking regardless of the escrow balance. Any residual escrow balance (from donations or rounding) can be handled by initiating a thaw before removal. - -## Team Response - -Accepted limitation. Orphaned tracking entries do not affect correctness or funds safety. - ---- - -Accepted limitation. Orphaned tracking entries do not affect correctness or funds safety. The proposed fix (removing pairs regardless of escrow balance) would sacrifice discoverability of unreclaimed escrow. Residual balances are handled through offline reconciliation. diff --git a/packages/issuance/audits/PR1301/TRST-L-5.md b/packages/issuance/audits/PR1301/TRST-L-5.md deleted file mode 100644 index 2533503e0..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-5.md +++ /dev/null @@ -1,30 +0,0 @@ -# TRST-L-5: The \_computeMaxFirstClaim function overestimates when deadline is before full collection window - -- **Severity:** Low -- **Category:** Logical flaw -- **Source:** RecurringAgreementManager.sol -- **Status:** Fixed - -## Description - -In `_computeMaxFirstClaim()` (line 645), the maximum first claim is computed as: `maxOngoingTokensPerSecond * maxSecondsPerCollection + maxInitialTokens`. This uses the full `maxSecondsPerCollection` window regardless of how much time actually remains until the agreement's `endsAt` deadline. - -In contrast, RecurringCollector's `getMaxNextClaim()` correctly accounts for the remaining time until the deadline, capping the collection window when the deadline is closer than `maxSecondsPerCollection`. The RAM's overestimate means `sumMaxNextClaim` is inflated for agreements near their end date, causing the RAM to reserve more escrow than the RecurringCollector would ever allow to be collected. - -The excess reservation is wasteful but not directly exploitable, as the collector enforces the actual cap during collection. However, it reduces the RAM's effective capacity and can contribute to unnecessary escrow mode degradation. - -## Recommended Mitigation - -Align `_computeMaxFirstClaim()` with the RecurringCollector's `getMaxNextClaim()` logic by accounting for the remaining time until the agreement's `endsAt`. Compute the collection window as `min(maxSecondsPerCollection, endsAt - lastCollectionAt)` when determining the maximum possible claim. This requires passing the `endsAt` parameter to the function. - -## Team Response - -Fixed. - -## Mitigation Review - -Fixed. The RecurringCollector now calculates the effective window correctly. - ---- - -RAM delegates to `IRecurringCollector.getMaxNextClaim(agreementId)` for all `maxNextClaim` calculations. The RC's `_maxClaimForTerms` correctly caps the collection window by remaining time until `endsAt`, eliminating the overestimate. diff --git a/packages/issuance/audits/PR1301/TRST-L-6.md b/packages/issuance/audits/PR1301/TRST-L-6.md deleted file mode 100644 index 7ce2cd7ed..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-6.md +++ /dev/null @@ -1,26 +0,0 @@ -# TRST-L-6: The cancel() function order sensitivity leaves RCAU offer unreachable - -- **Severity:** Low -- **Category:** Time-sensitivity issues -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -When a payer has both a pending RCA offer and a pending RCAU offer for the same `agreementId` and neither has been accepted, the order of cancellations matters. The `cancel()` overload that takes a terms hash delegates authorization to `_requirePayer()` (lines 480-497), which first checks the accepted agreement's payer and then the stored `rcaOffers` entry's payer. It does not fall back to `rcauOffers`. - -If the payer first cancels the RCA offer under `SCOPE_PENDING`, the entry in `rcaOffers` is deleted. A subsequent attempt to cancel the RCAU offer then fails: `_requirePayer()` finds no accepted agreement and no RCA offer, and reverts with `RecurringCollectorAgreementNotFound`. The orphaned RCAU offer remains in storage and unreachable by the payer. If the same parameters are later re-used to offer a new RCA, the orphaned RCAU is associated with it. The `updateNonce` check prevents immediate acceptance of the stale RCAU, but the payer has lost the ability to clean up state they own. - -## Recommended Mitigation - -Extend `_requirePayer()` to also check `rcauOffers` for a payer match when neither an accepted agreement nor an RCA offer is present. Alternatively, enforce symmetric cleanup so that deleting an RCA offer under `SCOPE_PENDING` also deletes any `rcauOffers` entry with the same `agreementId`. - -## Team Response - -Resolved by persisting `agreement.payer` from the first `offer()` instead of waiting until `accept()`. `_requirePayer` is replaced by an inline `agreement.payer` check at the `cancel()` call site, reading the persisted address directly without falling back through `rcaOffers`. `_offerUpdate` likewise reads `agreement.payer` instead of decoding the stored RCA bytes on every update offer. As a consequence, cancelling a pre-acceptance RCA offer and cancelling a pending RCAU offer are fully independent operations that may be performed in either order — neither path leaves the other unreachable, because the persistent `agreement.payer` continues to authorize the surviving offer. - -## Mitigation Review - -The restructuring of agreement data ensures no offer is orphaned and unreachable. - ---- diff --git a/packages/issuance/audits/PR1301/TRST-L-7.md b/packages/issuance/audits/PR1301/TRST-L-7.md deleted file mode 100644 index 4b66346bf..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-7.md +++ /dev/null @@ -1,28 +0,0 @@ -# TRST-L-7: EOA payer signatures cannot be revoked before deadline - -- **Severity:** Low -- **Category:** Functionality flaws -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -Payers approve agreements through two paths: an ECDSA signature consumed by `accept()` or `update()`, and a stored offer placed by a contract payer via `offer()` and consumed against the stored hash. Contract payers can revoke a pending offer by calling `cancel()` with `SCOPE_PENDING`, which deletes the matching entry from `rcaOffers` or `rcauOffers`. - -EOA payers have no equivalent revocation path. Once an RCA or RCAU has been signed, the signature is accepted by the collector at any time before the `deadline` field expires. A payer that wishes to cancel a signature-based offer before the deadline (for example, to renegotiate terms) has no mechanism to do so. The only remaining option to ensure no duplicate agreement risk is to wait out the deadline (and hope their unintended offer is not matched), or to revoke the signer via the Authorizable thawing and revocation flow, which affects all agreements authorized by that signer rather than an individual offer. - -## Recommended Mitigation - -Expose a `cancelSignature(bytes32 hash)` entry point that records the hash as invalidated on-chain, and have `_requireAuthorization()` reject any hash that has been invalidated. Alternatively, use a per-signer nonce that the payer can bump to invalidate all outstanding signatures for that signer. - -## Team Response - -Added `SCOPE_SIGNED` flag to `cancel()`, giving EOA signers an on-chain revocation path like contract payers already have via `SCOPE_PENDING`. The signer calls `cancel(agreementId, termsHash, SCOPE_SIGNED)` which records `cancelledOffers[msg.sender][termsHash] = agreementId`. When `accept()` or `update()` later processes a signature, `_requireAuthorization` recovers the signer via ECDSA and rejects if the stored agreementId matches. Self-authenticating (keyed by signer address), idempotent, reversible (calling again with `bytes16(0)` undoes the cancellation), and combinable with other scopes. Also made `cancel` no-op when nothing exists on-chain instead of reverting. - -## Mitigation Review - -The introduced alternative cancel path is sufficient. It should be clarified that whenever a payer is represented by a signer, `cancel()` should be called by the signer, not payer. - ---- - -Clarified in the `IAgreementCollector.cancel()` NatSpec: each scope's required caller is named explicitly (`SCOPE_SIGNED` → the ECDSA signer, `SCOPE_PENDING` / `SCOPE_ACTIVE` → the payer), and the combined-call case is noted as only useful when an EOA signs for itself as payer. Implementation `@dev` kept brief; per-scope caller behavior pulled in via `@inheritdoc`. diff --git a/packages/issuance/audits/PR1301/TRST-L-8.md b/packages/issuance/audits/PR1301/TRST-L-8.md deleted file mode 100644 index d2d5e62e8..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-8.md +++ /dev/null @@ -1,37 +0,0 @@ -# TRST-L-8: Callback gas precheck does not account for intermediate overhead - -- **Severity:** Low -- **Category:** Gas-related issues -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -Both `_preCollectCallbacks()` and `_postCollectCallback()` guard each payer callback with a precheck of the form `if (gasleft() < (MAX_PAYER_CALLBACK_GAS * 64) / 63) revert`. The intent is to ensure that `MAX_PAYER_CALLBACK_GAS` remains available to the callee after applying the EIP-150 63/64 rule. - -However, the precheck is performed before the CALL or STATICCALL opcode itself, and additional gas is consumed between the comparison and the opcode: local Solidity operations, stack and memory setup, calldata encoding, and the fixed cost of the CALL or STATICCALL instruction. The actual gas forwarded to the callee can fall below `MAX_PAYER_CALLBACK_GAS`. An honest callee may perform incorrect logic under the assumption of available gas. One can refer to Optimism's CrossDomainMessenger, which adds explicit buffer constants (`RELAY_GAS_CHECK_BUFFER` and `RELAY_CALL_OVERHEAD`) for this exact reason. - -## Recommended Mitigation - -Add explicit buffer constants to the precheck so that the comparison accounts for the CALL/STATICCALL cost and the intervening Solidity overhead. Size the buffer so that at least `MAX_PAYER_CALLBACK_GAS` is forwarded to the callee when the check passes. - -## Team Response - -Added `CALLBACK_GAS_OVERHEAD = 3_000` constant. All three prechecks now use: - -```solidity -if (gasleft() < (MAX_PAYER_CALLBACK_GAS * 64) / 63 + CALLBACK_GAS_OVERHEAD) - revert RecurringCollectorInsufficientCallbackGas(); -``` - -Sized to cover the worst-case pre-opcode cost. The eligibility STATICCALL is the first access to the payer account on the collect path, so the EIP-2929 cold-account access cost (2_600) dominates; the remaining headroom covers `abi.encodeCall` and stack/memory setup. Subsequent `beforeCollection` / `afterCollection` calls hit the payer warm (100 gas access), so the buffer is generous there. - -Follows the Optimism buffer-constant pattern as suggested. - -## Mitigation Review - -Issue has been addressed as suggested. Worst-case scenario tests should be introduced to ensure the defined overhead constant is sufficient in future builds. - ---- - -Boundary regression tests added on both sides of the precheck: warm path in Foundry, cold path in Hardhat (foundry/REVM does not apply EIP-2929 cold-access cost in this config, so a separate Hardhat test exercises real cold access). Sabotage-verified. diff --git a/packages/issuance/audits/PR1301/TRST-L-9.md b/packages/issuance/audits/PR1301/TRST-L-9.md deleted file mode 100644 index 1b9ba60d5..000000000 --- a/packages/issuance/audits/PR1301/TRST-L-9.md +++ /dev/null @@ -1,33 +0,0 @@ -# TRST-L-9: EIP-7702 payer code change enables callback gas griefing after acceptance - -- **Severity:** Low -- **Category:** Type confusion -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -Under EIP-7702, which is live on Ethereum mainnet and Arbitrum, an EOA can install arbitrary code via a delegation transaction. `_preCollectCallbacks()` and `_postCollectCallback()` dispatch the `beforeCollection()` and `afterCollection()` callbacks only when `payer.code.length != 0`. A payer who accepted an agreement as an EOA can later acquire code, and have the callbacks dispatched against delegated code that the service provider never considered at acceptance time. - -The callbacks are low level calls with a `MAX_PAYER_CALLBACK_GAS` budget, and they are vulnerable to the returndata bombing vector described in TRST-M-4, on top of the baseline call costs. Service providers estimate gas for `collect()` under the assumption that the payer is an EOA with no callbacks. If the payer is a contract at collection time, the provider's gas estimate may be insufficient and the transaction will revert with griefed gas. This is a distinct attack surface from TRST-H-4, which targeted the eligibility gate rather than the callback path. - -## Recommended Mitigation - -Use the introduced `CONDITION_ELIGIBILITY_CHECK` flag in place of the live `code.length` check in `_preCollectCallbacks()` and `_postCollectCallback()`. This freezes the contract-versus-EOA determination to the state the service provider observed at acceptance. - -## Team Response - -Reusing `CONDITION_ELIGIBILITY_CHECK` for callback dispatch avoided because the eligibility checking is a different concern with different trust assumptions. An agreement can legitimately have one without the other. - -Introduced `CONDITION_AGREEMENT_OWNER` flag that mirrors the eligibility pattern: - -- `_requirePayerInterfaceSupport` validates `IERC165(payer).supportsInterface(type(IAgreementOwner).interfaceId)` if the flag is set, alongside the existing eligibility check. -- `_preCollectCallbacks` and `_postCollectCallback` dispatch on `agreement.conditions & CONDITION_AGREEMENT_OWNER`, replacing the `payer.code.length` check. - -## Mitigation Review - -The root cause has been addressed. It is recommended to document that turning `CONDITION_ELIGIBILITY_CHECK` on an EOA is considered fully trusting it as it can upgrade to a contract that reverts the eligibility check. - ---- - -Expanded the NatSpec on `CONDITION_ELIGIBILITY_CHECK` in `RecurringCollector.sol`: the flag trusts the payer to apply correct eligibility logic in `isEligible()`. The acceptance-time interface check excludes a pure EOA, but a payer that did pass (contract, or EOA with a 7702 delegation at that moment) can later answer dishonestly and block collection. diff --git a/packages/issuance/audits/PR1301/TRST-M-1.md b/packages/issuance/audits/PR1301/TRST-M-1.md deleted file mode 100644 index bff9801e3..000000000 --- a/packages/issuance/audits/PR1301/TRST-M-1.md +++ /dev/null @@ -1,42 +0,0 @@ - - -# TRST-M-1: Micro-thaw griefing via permissionless depositTo() and reconcileAgreement() - -- **Severity:** Medium -- **Category:** Griefing attacks -- **Source:** RecurringAgreementManager.sol -- **Status:** Fixed - -## Description - -Three independently benign features combine into a griefing vector: - -1. `PaymentsEscrow.depositTo()` has no access control - anyone can deposit any amount for any (payer, collector, receiver) tuple. -2. `reconcileAgreement()` is permissionless - anyone can trigger a reconciliation which calls `_updateEscrow()`. -3. `PaymentsEscrow.adjustThaw()` with `evenIfTimerReset=false` is a no-op when increasing the thaw amount would reset the thawing timer. - -An attacker deposits 1 wei into an escrow account via `depositTo()`, then calls `reconcileAgreement()`. The reconciliation detects escrow is 1 wei above target and initiates a thaw of 1 wei via `adjustThaw()`. This starts the thawing timer. When the RAM later needs to thaw a larger amount (e.g., after an agreement ends or is updated), it calls `adjustThaw()` with `evenIfTimerReset=false`, which becomes a no-op because increasing the thaw would reset the timer. - -In cases where thaws are needed to mobilize funds from one escrow pair to another - for example, to fund a new agreement or agreement update for a different provider - this griefing prevents the rebalancing. New agreements or updates that require escrow from the blocked pair's thawed funds could fail to be properly funded, causing escrow mode degradation or preventing the offers entirely. - -## Recommended Mitigation - -Add a minimum thaw threshold in `_updateEscrow()`. Amounts below the threshold should be ignored rather than initiating a thaw. This prevents an attacker from starting a thaw timer with a dust amount. If they do perform the attack, they will donate a non-negligible amount in exchange for the one-round block. - -## Team Response - -Fixed. - -## Mitigation Review - -The griefing path remains reachable. Before any agreement is offered, a 1 wei donation to the (collector, provider) escrow account, followed by a permissionless call to `_reconcilePairTracking()` reaches `_updateEscrow()` with min and max at zero, and the thaw threshold is also at zero. Any positive excess passes the `thawThreshold <= excess` check, causing an `adjustThaw(thawTarget = 1)`. The same sequence also occurs after the final collection of an agreement, when `sumMaxNextClaim` transitions to zero via `afterCollection()` -> `_reconcileAndUpdateEscrow()` -> `_reconcileAgreement()`. There should be a nominal, non-negligible minimum thaw amount on top of the fraction check, applied in both `_reconcileProviderEscrow()` and `_withdrawAndRebalance()`. When `escrowBasis` is JustInTime, override the nominal skip so that dust can still be thawed out for solvency. - -## Team Response - -The zero-threshold path when `sumMaxNextClaim = 0` is acknowledged. Timer resets do not occur (`evenIfTimerReset=false` rejects increases), so the vector is limited to postponing pair tracking cleanup via repeated dust deposits. Added `minResidualEscrowFactor` (uint8, default 50, threshold = 2^value ≈ 0.001 GRT for default): pairs with no agreements and escrow below threshold are dropped from tracking. Untracked pairs can still have escrow drained via blind thaw/withdraw on `reconcileProvider`. - -## Mitigation Review - -The main finding is considered acknowledged. Introduction of `minResidualEscrowFactor` is used only in maintaining of view-related bookkeeping. No new concerns have been introduced. - ---- diff --git a/packages/issuance/audits/PR1301/TRST-M-2.md b/packages/issuance/audits/PR1301/TRST-M-2.md deleted file mode 100644 index df5ca47c6..000000000 --- a/packages/issuance/audits/PR1301/TRST-M-2.md +++ /dev/null @@ -1,32 +0,0 @@ -# TRST-M-2: The tempJit fallback in beforeCollection() is unreachable in practice - -- **Severity:** Medium -- **Category:** Logical flaw -- **Source:** RecurringAgreementManager.sol -- **Status:** Fixed - -## Description - -In `beforeCollection()` (line 236), when the escrow balance is insufficient for an upcoming collection, the function attempts a JIT (Just-In-Time) top-up by setting `$.tempJit = true` before returning. The `tempJit` flag forces `_escrowMinMax()` to return JustInTime mode, freeing escrow from other pairs to fund this collection. - -However, the JIT path is only entered when the escrow is insufficient to cover `tokensToCollect`. In the `RecurringCollector._collect()` flow, `beforeCollection()` is called before `PaymentsEscrow.collect()`. If `beforeCollection()` cannot top up the escrow (because the RAM lacks free balance and the `deficit >= balanceOf()` guard fails), it returns without action. The subsequent `PaymentsEscrow.collect()` then attempts to collect `tokensToCollect` from an escrow that is still insufficient, causing the entire `collect()` transaction to revert. - -This means `tempJit` is never set in the scenario where it would be most needed: when escrow is short and the collection will fail regardless. An admin cannot rely on `tempJit` being triggered automatically during the RecurringCollector collection flow and would need to manually set JIT mode to achieve the intended fallback behavior. This would cause a delay the first time the issue is encountered where presumably there is no reason for admin to intervene. - -## Recommended Mitigation - -The original intention cannot be truly fulfilled without major redesign of multiple contracts. It is in practice more advisable to take the scenario into account and introduce an off-chain monitoring bot which would set the `tempJit` when needed. - -## Team Response - -Fixed. - -## Mitigation Review - -The new setup is schematically sound. Admin intervention to trigger JustInTime may still be required to satisfy requests when the system is in OnDemand but insufficient liquidity is being thawed or minted into the contract. - ---- - -The `tempJit` mechanism has been replaced with threshold-based basis degradation. - -`_escrowMinMax()` now uses `minOnDemandBasisThreshold` and `minFullBasisMargin` parameters to automatically limit the effective escrow basis based on the ratio of spare balance to `sumMaxNextClaimAll`. This does not rely on a callback to activate and provides automatic, configurable transition boundaries. diff --git a/packages/issuance/audits/PR1301/TRST-M-3.md b/packages/issuance/audits/PR1301/TRST-M-3.md deleted file mode 100644 index 7654bbe6c..000000000 --- a/packages/issuance/audits/PR1301/TRST-M-3.md +++ /dev/null @@ -1,28 +0,0 @@ -# TRST-M-3: Instant escrow mode degradation from Full to OnDemand via agreement offer - -- **Severity:** Medium -- **Category:** Logical flaw -- **Source:** RecurringAgreementManager.sol -- **Status:** Acknowledged - -## Description - -Neither `offerAgreement()` nor `offerAgreementUpdate()` verify that the RAM has sufficient token balance to fund the new escrow obligation without degrading the escrow mode. An operator can offer an agreement whose `maxNextClaim`, when added to the existing `sumMaxNextClaim`, causes `totalEscrowDeficit` to exceed the RAM's balance. This instantly degrades the escrow mode from Full to OnDemand for ALL (collector, provider) pairs. - -The degradation occurs because `_escrowMinMax()` checks: `totalEscrowDeficit < balanceOf(address(this))`. When the new agreement pushes the deficit above the balance, this condition becomes false, and `min` drops to 0 for every pair - meaning no proactive deposits are made for any agreement, not just the new one. Existing providers who had fully-escrowed agreements silently lose their escrow guarantees. - -Whether intentional or by misfortune, this behavior can be triggered instantly by a single offer. If this degradation is desirable in some cases, it should only occur by explicit intention, not as a side effect of a routine operation. - -## Recommended Mitigation - -Add a separate configuration flag (e.g., `allowModeDegradation`) that must be explicitly set by the admin to permit offers that would degrade the escrow mode. When the flag is false, `offerAgreement()` and `offerAgreementUpdate()` should revert if the new obligation would push `totalEscrowDeficit` above the current balance. This ensures mode degradation is always a conscious decision. - -## Team Response - -Acknowledged. The risk is documented, including the operator caution about pre-offer headroom checks. - ---- - -Acknowledged. The risk is documented in [RecurringAgreementManager.md — Automatic Degradation](../../contracts/agreement/RecurringAgreementManager.md#automatic-degradation), including the operator caution about pre-offer headroom checks. - -An on-chain guard was prototyped but added ~2.7KB to the contract, exceeding the Spurious Dragon 24576-byte limit. The operator (AGREEMENT_MANAGER_ROLE holder) is a trusted role expected to verify escrow headroom before offering agreements. diff --git a/packages/issuance/audits/PR1301/TRST-M-4.md b/packages/issuance/audits/PR1301/TRST-M-4.md deleted file mode 100644 index 128055ad9..000000000 --- a/packages/issuance/audits/PR1301/TRST-M-4.md +++ /dev/null @@ -1,33 +0,0 @@ -# TRST-M-4: Returndata bombing via payer callbacks in \_preCollectCallbacks and \_postCollectCallback - -- **Severity:** Medium -- **Category:** Gas-related issues -- **Source:** RecurringCollector.sol -- **Status:** Fixed - -## Description - -All three payer callbacks reachable from `_collect()` (the eligibility staticcall in `_preCollectCallbacks()` at line 633, the `beforeCollection()` call in the same function at line 646, and the `afterCollection()` call in `_postCollectCallback()` at line 666) use Solidity's default low-level call pattern, which copies the full returndata buffer into the caller's memory. Note that RETURNDATACOPY is emitted even when the returned bytes are discarded via the `(bool ok, )` tuple pattern. - -With a forwarded budget of `MAX_PAYER_CALLBACK_GAS` (1,500,000) per callback, a malicious payer can expand callee memory and return roughly 850 KB of data. The caller's RETURNDATACOPY and the associated memory expansion then consume approximately 1,500,000 gas in the `_collect()` frame for each callback. Across the three callbacks, a single `collect()` call can be forced to burn about 4,500,000 gas beyond the nominal callback budget. - -The impact is an inflated collection cost that is not reflected in off-chain gas estimates. This is gas griefing rather than a collection block, and gas costs remain manageable. - -## Recommended Mitigation - -Replace the affected high-level call sites with inline assembly that performs the call and bounds the amount of returndata copied. For the eligibility check, copy at most 32 bytes into scratch memory and read the result. For `beforeCollection()` and `afterCollection()`, copy zero bytes since the return value is unused. - -## Team Response - -Replaced all three call sites with inline assembly that bounds returndata copy: - -- **Eligibility staticcall**: copies at most 32 bytes into scratch space (0x00), reads the `uint256` result from there. -- **beforeCollection / afterCollection**: copy 0 bytes (`retSize=0`), only the `bool success` from the CALL opcode is used. - -This prevents a malicious payer from forcing RETURNDATACOPY of ~850 KB per callback. - -## Mitigation Review - -Issue has been addressed as suggested. - ---- diff --git a/packages/issuance/audits/PR1301/TRST-R-1.md b/packages/issuance/audits/PR1301/TRST-R-1.md deleted file mode 100644 index 5f1457f71..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-1.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-1: Avoid redeployment of the RewardsEligibilityOracle by restructuring storage - -- **Severity:** Recommendation - -## Description - -The modified RewardsEligibilityOracle has two new state variables, as well as moving `eligibilityValidationEnabled` from the original slot to the end of the structure. Due to the relocation, an upgrade is needed, meaning all previous eligibility state will be lost. It is possible to only append storage slots to the original structure, and avoid a hard redeployment flow, by leveraging the upgradeability of the oracle. - ---- - -Acknowledged. The oracle is not yet deployed to production so the storage restructuring does not lose live state. The current layout preserves clean append-only expansion for future upgrades. diff --git a/packages/issuance/audits/PR1301/TRST-R-10.md b/packages/issuance/audits/PR1301/TRST-R-10.md deleted file mode 100644 index e1d200ba7..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-10.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-10: Document role-change semantics for existing agreements - -- **Severity:** Recommendation - -## Description - -Changes to `DATA_SERVICE_ROLE` and `COLLECTOR_ROLE` on the RecurringAgreementManager do not affect agreements that have already been offered or accepted through the previously authorized addresses. This is by design (revoking a role should not invalidate settled obligations), but the behavior is not documented. Record this invariant in the RAM documentation so that operators and integrators understand the effect of role changes. - ---- - -Documented in the `RecurringAgreementManager` contract header: role changes are not retroactive — revoking `COLLECTOR_ROLE` or `DATA_SERVICE_ROLE` does not invalidate tracked agreements, which continue to reconcile to orderly settlement. Role checks gate only new `offerAgreement` calls and discovery inside `_reconcileAgreement`. diff --git a/packages/issuance/audits/PR1301/TRST-R-11.md b/packages/issuance/audits/PR1301/TRST-R-11.md deleted file mode 100644 index f8169c789..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-11.md +++ /dev/null @@ -1,15 +0,0 @@ -# TRST-R-11: Remove or implement unused state flags in IAgreementCollector - -- **Severity:** Recommendation - -## Description - -`IAgreementCollector` defines state flag constants that are not currently used in the RecurringCollector implementation, including `NOTICE_GIVEN`, `SETTLED`, `BY_PAYER`, `BY_PROVIDER`, `BY_DATA_SERVICE`, `AUTO_UPDATE`, and `AUTO_UPDATED`. Unused public interface constants are a source of confusion for integrators, who may code against documented semantics that the implementation does not honor. Either remove the unused flags from the interface, or implement the behaviors they describe in the collector. - ---- - -Removed unused flags: `AUTO_UPDATE`, `AUTO_UPDATED`, `BY_DATA_SERVICE`, `WITH_NOTICE` and `IF_NOT_ACCEPTED` are dropped from the interface. - -NatSpec updated for remaining flags with new semantics. - -In RecurringCollector `NOTICE_GIVEN`, `SETTLED`, `BY_PAYER`, `BY_PROVIDER` are now set by `getAgreementDetails` to describe cancel origin and collectability (see TRST-R-12 fix). diff --git a/packages/issuance/audits/PR1301/TRST-R-12.md b/packages/issuance/audits/PR1301/TRST-R-12.md deleted file mode 100644 index 834cb66e8..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-12.md +++ /dev/null @@ -1,17 +0,0 @@ -# TRST-R-12: Document ACCEPTED state returned for cancelled agreements - -- **Severity:** Recommendation - -## Description - -In `getAgreementDetails()`, any agreement whose state is not `AgreementState.NotAccepted` is reported with state flag `ACCEPTED`. This includes agreements that have been cancelled (`CanceledByPayer` or `CanceledByServiceProvider`). Integrators inspecting the returned state cannot distinguish cancelled agreements from live ones without reading separate storage. Document this behavior in the interface, or extend the state bitmask with a `CANCELED` flag and return it for the non-active terminal states. - ---- - -Reusing the existing interface flags instead of adding a `CANCELED` flag. `getAgreementDetails` now composes cancel and collectability information: - -- `NOTICE_GIVEN` — set on cancelled agreements (collection window truncated). -- `BY_PAYER` / `BY_PROVIDER` — paired with `NOTICE_GIVEN` to identify the cancel origin. -- `SETTLED` — per-version: set when nothing is claimable under the queried version's terms (active claim for `VERSION_CURRENT`, pending claim for `VERSION_NEXT`). - -`ACCEPTED` is also narrowed: it is now only set on the active-slot version (`VERSION_CURRENT`) of agreements past `NotAccepted`, so pending updates (`VERSION_NEXT`) no longer report `ACCEPTED`. Integrators distinguish cancelled-vs-live by `NOTICE_GIVEN`, and stop-collecting-now via `SETTLED`. See the TRST-R-11 fix for the accompanying flag cleanup. diff --git a/packages/issuance/audits/PR1301/TRST-R-13.md b/packages/issuance/audits/PR1301/TRST-R-13.md deleted file mode 100644 index cefb73ec0..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-13.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-13: Document reclaim reason change for stale allocation force-close - -- **Severity:** Recommendation - -## Description - -Before the PR's refactor, `forceCloseStaleAllocation()` closed the allocation via `_closeAllocation()` and caused a reclaim with reason `CLOSE_ALLOCATION`. Post refactor, the force close path goes through `_resizeAllocation(allocationId, 0, ...)`, which triggers a reclaim with reason `STALE_POI` instead. The reclaim still occurs, but the reason code exposed to reclaim address configuration changes. Document this change so that operators are able to prepare accordingly and have funding paths line up with intention. - ---- - -Noted. The previous `CLOSE_ALLOCATION` reclaim behavior for this path has not shipped to production, so there is no live operator configuration to migrate. `STALE_POI` is the correct reason for the post-refactor semantics (the allocation is stale; it stays open as stakeless rather than closing). diff --git a/packages/issuance/audits/PR1301/TRST-R-14.md b/packages/issuance/audits/PR1301/TRST-R-14.md deleted file mode 100644 index ef6db21c2..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-14.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-14: Avoid magic numbers in production code - -- **Severity:** Recommendation - -## Description - -In the RecurringAgreementManager, `_getAgreementProvider()` calls `getAgreementDetails()` passing `0` as `index`. While in previous this was not used on the RecurringCollector, it is now handled as `VERSION_CURRENT` for correct logic of the collector. Consider using the constant from `IAgreementCollector` for futureproofing of the contract and clarifying the intention. - ---- - -Imported `VERSION_CURRENT` from `IAgreementCollector` and substituted it for the literal `0` at the single call site in `_getAgreementProvider`. diff --git a/packages/issuance/audits/PR1301/TRST-R-2.md b/packages/issuance/audits/PR1301/TRST-R-2.md deleted file mode 100644 index a9a30ff54..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-2.md +++ /dev/null @@ -1,14 +0,0 @@ -# TRST-R-2: Improve stale documentation - -- **Severity:** Recommendation - -## Description - -The functions below are mentioned in various documentation files but do not exist in the current codebase: - -- `acceptUnsignedIndexingAgreement()` -- `removeAgreement()` - ---- - -Updated documentation to remove references to `acceptUnsignedIndexingAgreement()` and `removeAgreement()`. diff --git a/packages/issuance/audits/PR1301/TRST-R-3.md b/packages/issuance/audits/PR1301/TRST-R-3.md deleted file mode 100644 index 0e012a072..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-3.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-3: Incorporate defensive coding best practices - -- **Severity:** Recommendation - -## Description - -In the RAM's `cancelAgreement()` function, the agreement state is required to not be not accepted. However, the logic could be more specific and require the agreement to be Accepted - rejecting previously cancelled agreements. There is no impact because corresponding checks in the RecurringCollector would deny such cancels, but it remains as a best practice. - ---- - -Fixed. The RAM's `cancelAgreement()` was refactored into a pass-through to `collector.cancel()`, which requires `agreement.state == AgreementState.Accepted` before proceeding. The defensive guard now lives in the single authoritative location for agreement state. diff --git a/packages/issuance/audits/PR1301/TRST-R-4.md b/packages/issuance/audits/PR1301/TRST-R-4.md deleted file mode 100644 index 7947adbdc..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-4.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-4: Document critical assumptions in the RAM - -- **Severity:** Recommendation - -## Description - -The `approveAgreement()` view checks if the agreement hash is valid, however it offers no replay protection for repeated agreement approvals. This attack vector is only stopped at the RecurringCollector as it checks the agreement does not exist and maintains unidirectional transitions from the agreement Accepted state. For future collectors this may not be the case, necessitating clear documentation of the assumption. - ---- - -Documented in the `RecurringAgreementManager` contract header (collector-trust section): collectors own agreement uniqueness, replay protection, and state transitions; RAM does not re-check them. diff --git a/packages/issuance/audits/PR1301/TRST-R-5.md b/packages/issuance/audits/PR1301/TRST-R-5.md deleted file mode 100644 index 0db3ff607..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-5.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-5: Ambiguous return value in getAgreementOfferAt() - -- **Severity:** Recommendation - -## Description - -`getAgreementOfferAt()` returns `(uint8 offerType, bytes memory offerData)`. The offer type constant `OFFER_TYPE_NEW` is defined as 0, which is also the default Solidity return value when no stored offer exists for the given `agreementId` and index. A caller receiving `offerType == 0` cannot distinguish between a stored new-type offer existing and no offer existing. Consider redefining offer type constants with 1-indexed values, or adding an explicit `bool found` return parameter. - ---- - -Using non-zero offer type constants as suggested: `OFFER_TYPE_NEW = 1`, `OFFER_TYPE_UPDATE = 2`. The zero value is declared explicitly as `OFFER_TYPE_NONE` so the "no stored offer" sentinel is part of the interface rather than a NatSpec-only convention. diff --git a/packages/issuance/audits/PR1301/TRST-R-6.md b/packages/issuance/audits/PR1301/TRST-R-6.md deleted file mode 100644 index 46215cc6b..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-6.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-6: Dead code guard in \_validateAndStoreUpdate() - -- **Severity:** Recommendation - -## Description - -In `_validateAndStoreUpdate()` (line 855), the guard `if (oldHash != bytes32(0))` is unreachable as a false branch. Only agreements in the Accepted state may be updated, and every accepted agreement has a non-zero `activeTermsHash` written during `accept()` or a prior `update()`. The guard can be removed or converted into an invariant comment documenting this assumption. - ---- - -Fixed. Removed the dead `if (oldHash != bytes32(0))` guard. Also dropped the unreachable `else if` for `rcauOffers` cleanup — `oldHash` can only survive in `rcaOffers` (from `accept()`), since `update()` always overwrites `rcauOffers` with the new RCAU hash before this point. diff --git a/packages/issuance/audits/PR1301/TRST-R-7.md b/packages/issuance/audits/PR1301/TRST-R-7.md deleted file mode 100644 index 65f7ae98c..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-7.md +++ /dev/null @@ -1,13 +0,0 @@ -# TRST-R-7: Remove consumed offers in accept() and update() - -- **Severity:** Recommendation - -## Description - -After `accept()` or `update()` consumes a stored offer, the corresponding entry in `rcaOffers` or `rcauOffers` becomes stale. Currently only `_validateAndStoreUpdate()` cleans up the previously active offer by looking up the old `activeTermsHash`; the offer whose terms were just accepted is not deleted. This is a storage hygiene concern: stale offer entries remain in storage indefinitely until explicitly replaced or matched by a future update. Consider deleting the consumed offer entry inside `accept()` and `update()` after it has been applied. - ---- - -Keeping consumed offers in storage is by design — offer data (including metadata, nonce, deadline) remains accessible on-chain via `getAgreementOfferAt()` until the terms are obsolete. Stale entries are cleaned up by `_validateAndStoreUpdate()` on the next update, overwritten by a new `offer()`, or removed by `cancel()`. Eagerly deleting on consumption would lose data that callers may still want to inspect. - -(Cleanup handling will be improved in combination with the response to TRST-L-11.) diff --git a/packages/issuance/audits/PR1301/TRST-R-8.md b/packages/issuance/audits/PR1301/TRST-R-8.md deleted file mode 100644 index 821e84823..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-8.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-8: Align pause documentation with callback behavior in the RAM - -- **Severity:** Recommendation - -## Description - -The RecurringAgreementManager documentation header states that pausing the contract "stops all permissionless escrow management". In practice, the `whenNotPaused` modifier also applies to `beforeCollection()` and `afterCollection()`, so pause also halts the callback path used during `collect()`. Update the documentation to reflect that callbacks are affected, or narrow the modifier application so that behavior matches the prose. - ---- - -Updated in the `RecurringAgreementManager` contract header: pause is described as blocking permissionless state changes "including collection callbacks and reconciliation", with a cross-reference to the existing cross-contract note describing the resulting escrow-accounting drift. diff --git a/packages/issuance/audits/PR1301/TRST-R-9.md b/packages/issuance/audits/PR1301/TRST-R-9.md deleted file mode 100644 index efa601a43..000000000 --- a/packages/issuance/audits/PR1301/TRST-R-9.md +++ /dev/null @@ -1,11 +0,0 @@ -# TRST-R-9: \_isAuthorized() override in RecurringCollector trusts itself for any authorizer - -- **Severity:** Recommendation - -## Description - -The `_isAuthorized(address authorizer, address signer)` override in RecurringCollector returns true whenever `signer == address(this)`, regardless of `authorizer`. This enables RecurringCollector to call `dataService.cancelIndexingAgreementByPayer()` on the payer's behalf. The semantics are safe in the current integration with SubgraphService, but they widen the trust surface: any future consumer that relies on `RecurringCollector.isAuthorized()` for access control will grant access when the signer is the collector itself. Consider tightening the override to scope trust to specific callers, or explicitly document the integration contract so it is not misapplied by future consumers. - ---- - -Added a `@custom:security` note at the `RecurringCollector` contract header: self-authorization requires the collector itself to perform the appropriate authorization check before any external call. diff --git a/packages/issuance/audits/PR1301/TRST-SR-1.md b/packages/issuance/audits/PR1301/TRST-SR-1.md deleted file mode 100644 index 1902b2ffd..000000000 --- a/packages/issuance/audits/PR1301/TRST-SR-1.md +++ /dev/null @@ -1,15 +0,0 @@ -# TRST-SR-1: JIT mode provider payment race condition - -- **Severity:** Systemic Risk - -## Description - -When the RecurringAgreementManager operates in JustInTime (JIT) escrow mode, escrow is not proactively funded for any (collector, provider) pair. Instead, funds are deposited into escrow only during the `beforeCollection()` callback, moments before `PaymentsEscrow.collect()` executes. Since the RAM holds a shared pool of GRT that backs all agreements, multiple providers collecting around the same time are effectively racing for the same pool of tokens. - -If the RAM's balance is sufficient to cover any single collection but not all concurrent collections, the provider whose data service submits the `collect()` transaction first will succeed, while subsequent providers' collections will revert because the RAM's balance has been depleted by the first collection's JIT deposit. This creates a first-come-first-served dynamic where providers must compete on transaction ordering to receive payment. - -This race condition is inherent to the JIT mode design and cannot be fully eliminated without proactive escrow funding. In extreme cases, a well-resourced provider could use priority gas auctions or private mempools to consistently front-run other providers' collections, creating an unfair payment advantage unrelated to service quality. - ---- - -Known architectural tradeoff. Full mode eliminates this entirely; OnDemand reduces its likelihood. JIT provides best-effort payment guarantees and is the fallback when the RAM's balance cannot sustain proactive escrow funding. diff --git a/packages/issuance/audits/PR1301/TRST-SR-2.md b/packages/issuance/audits/PR1301/TRST-SR-2.md deleted file mode 100644 index 5ad078675..000000000 --- a/packages/issuance/audits/PR1301/TRST-SR-2.md +++ /dev/null @@ -1,15 +0,0 @@ -# TRST-SR-2: Escrow thawing period creates prolonged fund immobility - -- **Severity:** Systemic Risk - -## Description - -The PaymentsEscrow thawing period (configurable up to `MAX_WAIT_PERIOD`, 90 days) creates a window during which escrowed funds are immobile. When the RAM needs to rebalance escrow across providers - for example, after an agreement ends and funds should be redirected to a new agreement - the thawing delay prevents immediate reallocation. During this window, the RAM effectively has reduced capacity. - -If multiple agreements end in a short period or the escrow mode degrades from Full to OnDemand, the RAM may enter a state where substantial funds are locked in thawing and unavailable for either existing or new obligations. This is compounded by the micro-thaw griefing vector (TRST-M-1), which can extend the immobility period by blocking thaw increases. - -The thawing period is a protocol-level parameter set on PaymentsEscrow and is outside the RAM's control. Changes to this parameter affect all users of the escrow system, not just the RAM. - ---- - -The thawing period protects providers from instant escrow drainage after service delivery. The minThawFraction fix (TRST-M-1) reduces griefing amplification and the snap-refresh fix (TRST-H-3) ensures accurate deficit tracking during rebalancing. The fundamental constraint is a protocol-level design decision outside the RAM's scope. diff --git a/packages/issuance/audits/PR1301/TRST-SR-3.md b/packages/issuance/audits/PR1301/TRST-SR-3.md deleted file mode 100644 index 91a3a71fc..000000000 --- a/packages/issuance/audits/PR1301/TRST-SR-3.md +++ /dev/null @@ -1,15 +0,0 @@ -# TRST-SR-3: Issuance distribution dependency for RAM solvency - -- **Severity:** Systemic Risk - -## Description - -The RAM relies on periodic issuance distribution (via the issuance allocator) to receive GRT tokens for funding escrow obligations. If the issuance system experiences delays, governance disputes, or contract upgrades that temporarily halt distributions, the RAM's free balance depletes as collections drain escrow without replenishment. - -Once the free balance reaches zero, the RAM cannot fund JIT top-ups in `beforeCollection()`, cannot proactively deposit in Full mode for new agreements, and existing escrow accounts gradually drain with each collection. Prolonged issuance interruption could cascade into escrow mode degradation (Full -> OnDemand -> JIT), ultimately affecting all providers' payment reliability. - -This is an external dependency that the RAM admin cannot mitigate beyond maintaining a buffer balance. - ---- - -Acknowledged. The RAM maintains a buffer balance and the escrow degradation mechanism (Full → OnDemand → JIT) provides graceful fallback. Issuance interruptions are visible on-chain, allowing operators to respond before provider payments are affected. diff --git a/packages/issuance/audits/PR1301/TRST-SR-4.md b/packages/issuance/audits/PR1301/TRST-SR-4.md deleted file mode 100644 index e9502f2ec..000000000 --- a/packages/issuance/audits/PR1301/TRST-SR-4.md +++ /dev/null @@ -1,21 +0,0 @@ -# TRST-SR-4: Try/catch callback pattern silently degrades state consistency - -- **Severity:** Systemic Risk - -## Description - -The RecurringCollector wraps all payer callbacks (`beforeCollection()`, `afterCollection()`) in try/catch blocks. While this design prevents malicious or buggy payer contracts from blocking collection, it means that any revert in these callbacks is silently discarded. The collection proceeds as if the callback succeeded, but the payer's internal state (escrow snapshots, deficit tracking, reconciliation) may not have been updated. - -This creates a systemic tension: the try/catch is necessary for liveness (ensuring providers can collect), but it trades state consistency for availability. Over time, if callbacks fail repeatedly (due to gas issues, contract bugs, or the stale snapshot issue in TRST-H-3), the divergence between the RAM's internal accounting and the actual escrow state can compound silently with no on-chain signal. - -There is no event emitted when a callback fails, making it difficult for off-chain monitoring to detect and respond to these silent failures. - -## Team Response - -TBD - ---- - -Non-reverting callbacks are intentional — collector liveness takes priority over payer state updates. Callbacks now use low-level `call`/`staticcall` with gas caps instead of try/catch. The snap-refresh fix (TRST-H-3) ensures the next successful `_reconcileProviderEscrow` call self-corrects any divergence. Permissionless `reconcileAgreement` and `reconcileProvider` provide external recovery paths. - -Failed callbacks emit `PayerCallbackFailed(agreementId, payer, stage)` with a `PayerCallbackStage` enum (`EligibilityCheck`, `BeforeCollection`, `AfterCollection`), giving off-chain monitoring a signal to detect failures and trigger reconciliation. From c8101b8865980337b842a5400644e31fd1069917 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Tue, 12 May 2026 16:09:49 +0000 Subject: [PATCH 19/29] docs(audit): prefix issuance audit PDFs with issue date and unnest from PR1301/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds YYYY-MM-DD_ prefix (date the report is signed on the cover page) and flattens packages/issuance/audits/PR1301/ — that sub- directory now contained a single PDF after the intermediate markdown was dropped. Renames: - Graph_PR1242_1243_v02.pdf → 2025-11-17_… - Graph_EligibilityOracle_v02.pdf → 2025-12-13_… - Graph_IssuanceAllocator_v03.pdf → 2025-12-28_… - Graph_PR1279_v02.pdf → 2026-02-15_… - PR1301/Graph_PR1334_v05.pdf → 2026-05-09_… --- ...v02.pdf => 2025-11-17_Graph_PR1242_1243_v02.pdf} | Bin ...f => 2025-12-13_Graph_EligibilityOracle_v02.pdf} | Bin ...f => 2025-12-28_Graph_IssuanceAllocator_v03.pdf} | Bin ...1279_v02.pdf => 2026-02-15_Graph_PR1279_v02.pdf} | Bin ...1334_v05.pdf => 2026-05-09_Graph_PR1334_v05.pdf} | Bin 5 files changed, 0 insertions(+), 0 deletions(-) rename packages/issuance/audits/{Graph_PR1242_1243_v02.pdf => 2025-11-17_Graph_PR1242_1243_v02.pdf} (100%) rename packages/issuance/audits/{Graph_EligibilityOracle_v02.pdf => 2025-12-13_Graph_EligibilityOracle_v02.pdf} (100%) rename packages/issuance/audits/{Graph_IssuanceAllocator_v03.pdf => 2025-12-28_Graph_IssuanceAllocator_v03.pdf} (100%) rename packages/issuance/audits/{Graph_PR1279_v02.pdf => 2026-02-15_Graph_PR1279_v02.pdf} (100%) rename packages/issuance/audits/{PR1301/Graph_PR1334_v05.pdf => 2026-05-09_Graph_PR1334_v05.pdf} (100%) diff --git a/packages/issuance/audits/Graph_PR1242_1243_v02.pdf b/packages/issuance/audits/2025-11-17_Graph_PR1242_1243_v02.pdf similarity index 100% rename from packages/issuance/audits/Graph_PR1242_1243_v02.pdf rename to packages/issuance/audits/2025-11-17_Graph_PR1242_1243_v02.pdf diff --git a/packages/issuance/audits/Graph_EligibilityOracle_v02.pdf b/packages/issuance/audits/2025-12-13_Graph_EligibilityOracle_v02.pdf similarity index 100% rename from packages/issuance/audits/Graph_EligibilityOracle_v02.pdf rename to packages/issuance/audits/2025-12-13_Graph_EligibilityOracle_v02.pdf diff --git a/packages/issuance/audits/Graph_IssuanceAllocator_v03.pdf b/packages/issuance/audits/2025-12-28_Graph_IssuanceAllocator_v03.pdf similarity index 100% rename from packages/issuance/audits/Graph_IssuanceAllocator_v03.pdf rename to packages/issuance/audits/2025-12-28_Graph_IssuanceAllocator_v03.pdf diff --git a/packages/issuance/audits/Graph_PR1279_v02.pdf b/packages/issuance/audits/2026-02-15_Graph_PR1279_v02.pdf similarity index 100% rename from packages/issuance/audits/Graph_PR1279_v02.pdf rename to packages/issuance/audits/2026-02-15_Graph_PR1279_v02.pdf diff --git a/packages/issuance/audits/PR1301/Graph_PR1334_v05.pdf b/packages/issuance/audits/2026-05-09_Graph_PR1334_v05.pdf similarity index 100% rename from packages/issuance/audits/PR1301/Graph_PR1334_v05.pdf rename to packages/issuance/audits/2026-05-09_Graph_PR1334_v05.pdf From 56ab1cfd73efbd6a232627dfc868d642ab04f5e6 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 10:21:52 +0000 Subject: [PATCH 20/29] feat(build): publish workspace as ghcr.io/graphprotocol/contracts image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dockerfile bakes `pnpm install --frozen-lockfile` + `pnpm build` into a node:24-bookworm-slim base with Foundry. No entrypoint — consumers layer their own (local-network's graph-contracts wrapper sets the deploy script). Workflow builds multi-arch (linux/amd64 on ubuntu-24.04, linux/arm64 on ubuntu-24.04-arm), pushes by per-platform digest, then merges to a manifest list. Triggers on push to main, deployment/**, and v* tags. Tag scheme: :, :sha-, :. docker-compose.yml + justfile add `just build-image` for local builds tagged `ghcr.io/graphprotocol/contracts:${CONTRACTS_TAG:-local}`. --- .dockerignore | 35 +++++++ .github/workflows/publish-image.yml | 148 ++++++++++++++++++++++++++++ Dockerfile | 27 +++++ docker-compose.yml | 13 +++ justfile | 8 ++ 5 files changed, 231 insertions(+) create mode 100644 .dockerignore create mode 100644 .github/workflows/publish-image.yml create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 justfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..e60b15876 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,35 @@ +# Patterns are path-anchored under packages/ rather than `**//` because +# BuildKit treats `/` as matching files too, so `**/build/` would also +# hide the per-package `scripts/build` entry scripts. + +.git +.github +**/node_modules +.pnpm-store + +# Build outputs (regenerated by `pnpm build`). +packages/*/artifacts +packages/*/cache +packages/*/cache_forge +packages/*/forge-artifacts +packages/*/out +packages/*/dist +packages/*/build +packages/*/typechain-types +packages/*/coverage +packages/*/types + +# Editor / OS noise +.vscode +.idea +.DS_Store + +# Local env / addresses (must not leak into a published image) +.env +**/.env +**/addresses-local*.json +**/localNetwork.json +**/.keystore + +# Docs and audit PDFs aren't needed at runtime +docs diff --git a/.github/workflows/publish-image.yml b/.github/workflows/publish-image.yml new file mode 100644 index 000000000..9304aa390 --- /dev/null +++ b/.github/workflows/publish-image.yml @@ -0,0 +1,148 @@ +# Builds the workspace image multi-arch (linux/amd64 + linux/arm64) and pushes +# to ghcr.io/graphprotocol/contracts. Consumed by local-network's +# graph-contracts wrapper via CONTRACTS_VERSION (pin a `:sha-` for +# reproducibility). +# +# Native runner per platform (no QEMU), per-platform digest push, manifest +# merge in a separate job. Runs independently of build-test.yml — they share +# `pnpm install + pnpm build` but stay decoupled so test feedback isn't tied +# to release packaging. + +name: Publish container image + +permissions: + contents: read + +on: + workflow_dispatch: + push: + branches: + - main + - 'deployment/**' + tags: + - 'v*' + +env: + IMAGE: ghcr.io/graphprotocol/contracts + +jobs: + build: + name: Build (${{ matrix.platform }}) + strategy: + fail-fast: false + matrix: + include: + - platform: linux/amd64 + runner: ubuntu-24.04 + - platform: linux/arm64 + runner: ubuntu-24.04-arm + runs-on: ${{ matrix.runner }} + permissions: + contents: read + packages: write + attestations: write + id-token: write + steps: + - name: Prepare platform pair + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + submodules: recursive + + - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker labels + id: meta + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 + with: + images: ${{ env.IMAGE }} + + - name: Build and push by digest + id: build + uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0 + with: + context: . + file: Dockerfile + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + pull: true + cache-from: type=gha,scope=${{ env.PLATFORM_PAIR }} + cache-to: type=gha,mode=max,scope=${{ env.PLATFORM_PAIR }} + outputs: type=image,name=${{ env.IMAGE }},push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }} + + - name: Export digest + if: github.event_name != 'pull_request' + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: github.event_name != 'pull_request' + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + name: Merge into multi-arch manifest + needs: build + # Avoids orphan per-platform digest blobs if a `need` is skipped or fails. + if: | + !cancelled() + && needs.build.result == 'success' + && github.event_name != 'pull_request' + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true + + - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker tags + id: meta + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 + with: + images: ${{ env.IMAGE }} + tags: | + type=ref,event=tag + # Moving per-branch tag for casual use; pin :sha- for reproducibility. + type=ref,event=branch + # Ensures workflow_dispatch from any branch yields a usable tag. + type=sha,enable=true + + # Glob `*` expands to the digest-named files from the build job. + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create \ + $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.IMAGE }}:${{ steps.meta.outputs.version }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..2d3ce01df --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +# Workspace base image: deps + `pnpm install` + `pnpm build`, no entrypoint. +# Consumers (e.g. local-network's graph-contracts wrapper) layer their own +# deploy script on top, or `docker run` to invoke pnpm/hardhat directly. + +FROM node:24-bookworm-slim + +# libudev-dev / libusb-1.0-0-dev: native deps of hardhat-secure-accounts. +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + curl git jq python3 make g++ libudev-dev libusb-1.0-0-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=ghcr.io/foundry-rs/foundry:stable \ + /usr/local/bin/forge /usr/local/bin/cast /usr/local/bin/ + +ENV COREPACK_ENABLE_STRICT=1 +RUN corepack enable + +# Husky's postinstall needs .git and is pointless in an image build. +ENV HUSKY=0 + +WORKDIR /opt/contracts + +COPY . . + +RUN pnpm install --frozen-lockfile \ + && pnpm build diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..267d0e258 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +# Local build of the workspace image. Pair with local-network's +# CONTRACTS_VERSION=local to consume this build from there. +# +# `docker compose build` (or `just build-image`) produces +# `ghcr.io/graphprotocol/contracts:${CONTRACTS_TAG:-local}`. Override +# CONTRACTS_TAG to distinguish multiple in-flight checkouts. + +services: + contracts: + image: ghcr.io/graphprotocol/contracts:${CONTRACTS_TAG:-local} + build: + context: . + dockerfile: Dockerfile diff --git a/justfile b/justfile new file mode 100644 index 000000000..8c3362811 --- /dev/null +++ b/justfile @@ -0,0 +1,8 @@ +default: + @just --list + +# Build the workspace image locally as `ghcr.io/graphprotocol/contracts:local`. +# Override the tag with `CONTRACTS_TAG=foo just build-image`. Consumed by +# local-network's graph-contracts wrapper when CONTRACTS_VERSION=local. +build-image: + docker compose build From fd15b17c86fb6eeb42eafcef2c394922a3206ce0 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 19:58:50 +0000 Subject: [PATCH 21/29] fix(deployment): address PR1338 reviewer feedback - C1: drop orphan toolshed test - C2: dedupe IRecurringCollector interfaces export - C3: fix MockRewardsEligibilityOracle NatSpec (IProviderEligibility) - C4: gate DirectAllocation_Implementation metadata write on a real txHash; backfill addresses.json - C5+C7: dedupe updateXAddressBook; add subgraph-service route - C6: parse deployment .json5 via JSON5.parse Introduces buildDeploymentMetadata, getAddressBookForType, and graph.updateAddressBookForContract so the fixes are systemic. --- .../deploy/allocate/direct/01_impl.ts | 19 +- packages/deployment/lib/address-book-utils.ts | 23 +++ .../deployment/lib/deploy-implementation.ts | 22 +-- packages/deployment/lib/deployment-config.ts | 11 +- .../deployment/lib/deployment-metadata.ts | 54 ++++++ .../deployment/lib/issuance-deploy-utils.ts | 45 ++--- packages/deployment/lib/sync-utils.ts | 43 +--- packages/deployment/rocketh/deploy.ts | 100 ++++------ .../test/deployment-metadata.test.ts | 73 +++++-- packages/interfaces/src/types/horizon.ts | 1 - packages/issuance/addresses.json | 5 +- .../mocks/MockRewardsEligibilityOracle.sol | 2 +- .../toolshed/test/recurring-collector.test.ts | 183 ------------------ 13 files changed, 211 insertions(+), 370 deletions(-) create mode 100644 packages/deployment/lib/deployment-metadata.ts delete mode 100644 packages/toolshed/test/recurring-collector.test.ts diff --git a/packages/deployment/deploy/allocate/direct/01_impl.ts b/packages/deployment/deploy/allocate/direct/01_impl.ts index ca465ae66..08d709bd2 100644 --- a/packages/deployment/deploy/allocate/direct/01_impl.ts +++ b/packages/deployment/deploy/allocate/direct/01_impl.ts @@ -1,6 +1,7 @@ import { getLibraryResolver, loadDirectAllocationArtifact } from '@graphprotocol/deployment/lib/artifact-loaders.js' import { computeBytecodeHash } from '@graphprotocol/deployment/lib/bytecode-utils.js' import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { buildDeploymentMetadata } from '@graphprotocol/deployment/lib/deployment-metadata.js' import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' import { requireDeployer, @@ -54,16 +55,14 @@ const func: DeployScriptModule = async (env) => { artifact.deployedLinkReferences, resolver, ) - - await graph.updateIssuanceAddressBook(env, { - name: Contracts.issuance.DirectAllocation_Implementation.name, - address: result.address, - deployment: { - txHash: result.transaction?.hash ?? '', - argsData: result.argsData, - bytecodeHash, - }, - }) + const metadata = buildDeploymentMetadata(result, bytecodeHash) + if (metadata) { + await graph.updateIssuanceAddressBook(env, { + name: Contracts.issuance.DirectAllocation_Implementation.name, + address: result.address, + deployment: metadata, + }) + } } showDeploymentStatus(env, Contracts.issuance.DirectAllocation_Implementation, result) diff --git a/packages/deployment/lib/address-book-utils.ts b/packages/deployment/lib/address-book-utils.ts index 1ab196ac7..d77987e70 100644 --- a/packages/deployment/lib/address-book-utils.ts +++ b/packages/deployment/lib/address-book-utils.ts @@ -28,7 +28,9 @@ import { } from '@graphprotocol/toolshed/deployments' import { config as rockethConfig } from '../rocketh/config.js' +import type { AnyAddressBookOps } from './address-book-ops.js' import { AddressBookOps } from './address-book-ops.js' +import type { AddressBookType } from './contract-registry.js' const require = createRequire(import.meta.url) @@ -436,3 +438,24 @@ export function getIssuanceAddressBook(chainId?: number): AddressBookOps(raw) } catch { return {} } diff --git a/packages/deployment/lib/deployment-metadata.ts b/packages/deployment/lib/deployment-metadata.ts new file mode 100644 index 000000000..201284b3c --- /dev/null +++ b/packages/deployment/lib/deployment-metadata.ts @@ -0,0 +1,54 @@ +import type { DeploymentMetadata } from '@graphprotocol/toolshed/deployments' + +/** + * Subset of rocketh's `Deployment` / `DeployContractResult` shape needed + * to materialize a `DeploymentMetadata` entry. `receipt.blockNumber` may be + * a hex string (`DeployResult`), a bigint (viem receipt) or a number. + */ +type DeploymentResult = { + transaction?: { hash?: string } + argsData?: string + receipt?: { blockNumber?: `0x${string}` | bigint | number } +} + +/** + * Optional overrides for fields rocketh's result may not carry directly. + * `blockNumber` overrides any value extracted from `result.receipt.blockNumber`. + */ +type MetadataOverrides = { + blockNumber?: number + timestamp?: string +} + +function toBlockNumber(raw: `0x${string}` | bigint | number | undefined): number | undefined { + if (raw === undefined) return undefined + if (typeof raw === 'string') return Number(BigInt(raw)) + return Number(raw) +} + +/** + * Build a `DeploymentMetadata` entry from a rocketh deployment result. + * + * Returns `undefined` when the essential fields (txHash, argsData) are missing — + * callers should skip recording rather than write a half-populated entry with + * an empty sentinel txHash. + * + * @param result - Rocketh deployment / pending-impl result + * @param bytecodeHash - Pre-computed bytecode hash (hashing inputs vary by caller) + * @param overrides - Optional blockNumber / timestamp (e.g. fetched from a separate receipt query) + */ +export function buildDeploymentMetadata( + result: DeploymentResult, + bytecodeHash: string, + overrides?: MetadataOverrides, +): DeploymentMetadata | undefined { + if (!result.transaction?.hash || !result.argsData) return undefined + const blockNumber = overrides?.blockNumber ?? toBlockNumber(result.receipt?.blockNumber) + return { + txHash: result.transaction.hash, + argsData: result.argsData, + bytecodeHash, + ...(blockNumber !== undefined && { blockNumber }), + ...(overrides?.timestamp && { timestamp: overrides.timestamp }), + } +} diff --git a/packages/deployment/lib/issuance-deploy-utils.ts b/packages/deployment/lib/issuance-deploy-utils.ts index a7ac62727..925368c3e 100644 --- a/packages/deployment/lib/issuance-deploy-utils.ts +++ b/packages/deployment/lib/issuance-deploy-utils.ts @@ -3,7 +3,6 @@ import type { Environment } from '@rocketh/core/types' import type { PublicClient } from 'viem' import { encodeFunctionData } from 'viem' -import type { AnyAddressBookOps } from './address-book-ops.js' import { Contracts, type RegistryEntry } from './contract-registry.js' import { getGovernor } from './controller-utils.js' import { @@ -15,7 +14,8 @@ import { import { loadTransparentProxyArtifact } from './artifact-loaders.js' import { INITIALIZE_GOVERNOR_ABI, OZ_PROXY_ADMIN_ABI } from './abis.js' import { computeBytecodeHash } from './bytecode-utils.js' -import { getTargetChainIdFromEnv } from './address-book-utils.js' +import { getAddressBookForType, getTargetChainIdFromEnv } from './address-book-utils.js' +import { buildDeploymentMetadata } from './deployment-metadata.js' import { deploy, execute, graph } from '../rocketh/deploy.js' /** ERC1967 admin slot: keccak256("eip1967.proxy.admin") - 1 */ @@ -178,20 +178,14 @@ export async function updateProxyAddressBook( proxyAdminAddress?: string, implementationDeployment?: DeploymentMetadata, ) { - const update = { + await graphUtils.updateAddressBookForContract(env, contract, { name: contract.name, address: proxyAddress, - proxy: 'transparent' as const, + proxy: 'transparent', proxyAdmin: proxyAdminAddress, implementation: implAddress, implementationDeployment, - } - - if (contract.addressBook === 'horizon') { - await graphUtils.updateHorizonAddressBook(env, update) - } else { - await graphUtils.updateIssuanceAddressBook(env, update) - } + }) } /** @@ -322,18 +316,17 @@ export async function deployProxyContract( if (onChainImpl.toLowerCase() !== implDep.address.toLowerCase()) { // Shared implementation changed — store as pending for governance upgrade const targetChainId = await getTargetChainIdFromEnv(env) - const addressBook: AnyAddressBookOps = - contract.addressBook === 'horizon' - ? graph.getHorizonAddressBook(targetChainId) - : graph.getIssuanceAddressBook(targetChainId) + const addressBook = getAddressBookForType(contract.addressBook, targetChainId) // Get deployment metadata from the shared implementation's address book entry const implMetadata = addressBook.getDeploymentMetadata(sharedImplementation.name) - addressBook.setPendingImplementationWithMetadata( - contract.name, - implDep.address, - implMetadata ?? { txHash: '', bytecodeHash: '' }, - ) + if (!implMetadata) { + throw new Error( + `${contract.name}: deployment metadata missing for ${sharedImplementation.name}. ` + + `Run ${sharedImplementation.name}'s deploy script (or sync) before re-running.`, + ) + } + addressBook.setPendingImplementationWithMetadata(contract.name, implDep.address, implMetadata) env.showMessage(``) env.showMessage(`⚠️ UPGRADE REQUIRED`) @@ -456,15 +449,9 @@ async function deployProxyWithOwnImpl( }) // Build implementation deployment metadata for address book (only if we have required fields) - let implementationDeployment: DeploymentMetadata | undefined - if (implResult.transaction?.hash && implResult.argsData && implResult.deployedBytecode) { - implementationDeployment = { - txHash: implResult.transaction.hash, - argsData: implResult.argsData, - bytecodeHash: computeBytecodeHash(implResult.deployedBytecode), - ...(implResult.receipt?.blockNumber && { blockNumber: Number(implResult.receipt.blockNumber) }), - } - } + const implementationDeployment: DeploymentMetadata | undefined = implResult.deployedBytecode + ? buildDeploymentMetadata(implResult, computeBytecodeHash(implResult.deployedBytecode)) + : undefined // Update address book with per-proxy ProxyAdmin and deployment metadata await updateProxyAddressBook( diff --git a/packages/deployment/lib/sync-utils.ts b/packages/deployment/lib/sync-utils.ts index a5022a177..6c7ac9836 100644 --- a/packages/deployment/lib/sync-utils.ts +++ b/packages/deployment/lib/sync-utils.ts @@ -5,6 +5,7 @@ import type { DeploymentMetadata } from '@graphprotocol/toolshed/deployments' import { autoDetectForkNetwork, + getAddressBookForType, getForkNetwork, getForkStateDir, getForkTargetChainId, @@ -215,34 +216,6 @@ export function reconstructDeploymentRecord( } } -/** - * Create deployment metadata from a deployment result - * - * Helper to create DeploymentMetadata from rocketh deployment results - * for storage in address book. - * - * @param txHash - Transaction hash of deployment - * @param argsData - ABI-encoded constructor arguments - * @param deployedBytecode - Deployed bytecode for hash computation - * @param blockNumber - Block number of deployment - * @param timestamp - Block timestamp (ISO 8601) - */ -export function createDeploymentMetadata( - txHash: string, - argsData: string, - deployedBytecode: string, - blockNumber?: number, - timestamp?: string, -): DeploymentMetadata { - return { - txHash, - argsData, - bytecodeHash: computeBytecodeHash(deployedBytecode), - ...(blockNumber !== undefined && { blockNumber }), - ...(timestamp && { timestamp }), - } -} - /** * Check if local artifact bytecode differs from what was last deployed. * @@ -1092,20 +1065,6 @@ export async function syncContractGroups( return { success: failures.length === 0, totalSynced, failures } } -/** - * Resolve address book instance for a given address book type and chain ID - */ -function getAddressBookForType(addressBookType: AddressBookType, chainId: number) { - switch (addressBookType) { - case 'horizon': - return graph.getHorizonAddressBook(chainId) - case 'subgraph-service': - return graph.getSubgraphServiceAddressBook(chainId) - case 'issuance': - return graph.getIssuanceAddressBook(chainId) - } -} - /** * Sync a single component from the contract registry with on-chain state. * diff --git a/packages/deployment/rocketh/deploy.ts b/packages/deployment/rocketh/deploy.ts index 384150c88..f230b0490 100644 --- a/packages/deployment/rocketh/deploy.ts +++ b/packages/deployment/rocketh/deploy.ts @@ -5,8 +5,10 @@ import { deployViaProxy } from '@rocketh/proxy' import { execute, read, tx } from '@rocketh/read-execute' import { createPublicClient, custom } from 'viem' +import type { AnyAddressBookOps } from '../lib/address-book-ops.js' import { autoDetectForkNetwork, + getAddressBookForType, getForkTargetChainId, getHorizonAddressBook, getIssuanceAddressBook, @@ -14,6 +16,7 @@ import { getTargetChainIdFromEnv, isForkMode, } from '../lib/address-book-utils.js' +import type { RegistryEntry } from '../lib/contract-registry.js' import { accounts, data } from './config.js' /** @@ -36,9 +39,6 @@ export interface DeploymentUpdate { deployment?: DeploymentMetadata } -/** @deprecated Use DeploymentUpdate */ -export type IssuanceDeploymentUpdate = DeploymentUpdate - /** * Graph Protocol deployment helpers * @@ -106,75 +106,53 @@ export const graph = { /** * Update horizon address book after deploying a contract. * Supports both standalone and proxied contracts. - * - * @param env - Rocketh environment (used to get chain ID from provider) - * @param update - Deployment update details */ updateHorizonAddressBook: async (env: Environment, update: DeploymentUpdate) => { const chainId = await getTargetChainIdFromEnv(env) - const addressBook = getHorizonAddressBook(chainId) - - if (update.proxy) { - addressBook.setProxy( - update.name as Parameters[0], - update.address, - update.implementation!, - update.proxyAdmin!, - update.proxy, - ) - if (update.implementationDeployment) { - addressBook.setImplementationDeploymentMetadata( - update.name as Parameters[0], - update.implementationDeployment, - ) - } - } else { - addressBook.setContract(update.name as Parameters[0], update.address) - if (update.deployment) { - addressBook.setDeploymentMetadata( - update.name as Parameters[0], - update.deployment, - ) - } - } + await applyDeploymentUpdate(getHorizonAddressBook(chainId), update) + }, + + /** + * Update subgraph-service address book after deploying a contract. + * Supports both standalone and proxied contracts. + */ + updateSubgraphServiceAddressBook: async (env: Environment, update: DeploymentUpdate) => { + const chainId = await getTargetChainIdFromEnv(env) + await applyDeploymentUpdate(getSubgraphServiceAddressBook(chainId), update) }, /** * Update issuance address book after deploying a contract. * Call this after rocketh's deployViaProxy or deploy to sync the address book. - * - * @param env - Rocketh environment (used to get chain ID from provider) - * @param update - Deployment update details */ - updateIssuanceAddressBook: async (env: Environment, update: IssuanceDeploymentUpdate) => { + updateIssuanceAddressBook: async (env: Environment, update: DeploymentUpdate) => { const chainId = await getTargetChainIdFromEnv(env) - const addressBook = getIssuanceAddressBook(chainId) - - if (update.proxy) { - addressBook.setProxy( - update.name as Parameters[0], - update.address, - update.implementation!, - update.proxyAdmin!, - update.proxy, - ) - // Store implementation deployment metadata for verification - if (update.implementationDeployment) { - addressBook.setImplementationDeploymentMetadata( - update.name as Parameters[0], - update.implementationDeployment, - ) - } - } else { - addressBook.setContract(update.name as Parameters[0], update.address) - if (update.deployment) { - addressBook.setDeploymentMetadata( - update.name as Parameters[0], - update.deployment, - ) - } - } + await applyDeploymentUpdate(getIssuanceAddressBook(chainId), update) }, + + /** + * Update the address book for a contract, choosing the correct book from + * `contract.addressBook`. Single dispatch point — adding a new address book + * type will surface as a TypeScript error in `getAddressBookForType`. + */ + updateAddressBookForContract: async (env: Environment, contract: RegistryEntry, update: DeploymentUpdate) => { + const chainId = await getTargetChainIdFromEnv(env) + await applyDeploymentUpdate(getAddressBookForType(contract.addressBook, chainId), update) + }, +} + +function applyDeploymentUpdate(addressBook: AnyAddressBookOps, update: DeploymentUpdate): void { + if (update.proxy) { + addressBook.setProxy(update.name, update.address, update.implementation!, update.proxyAdmin!, update.proxy) + if (update.implementationDeployment) { + addressBook.setImplementationDeploymentMetadata(update.name, update.implementationDeployment) + } + } else { + addressBook.setContract(update.name, update.address) + if (update.deployment) { + addressBook.setDeploymentMetadata(update.name, update.deployment) + } + } } // Re-export rocketh functions for convenience diff --git a/packages/deployment/test/deployment-metadata.test.ts b/packages/deployment/test/deployment-metadata.test.ts index 2661ccda4..c3347d0f2 100644 --- a/packages/deployment/test/deployment-metadata.test.ts +++ b/packages/deployment/test/deployment-metadata.test.ts @@ -2,7 +2,8 @@ import { expect } from 'chai' import { AddressBookOps } from '../lib/address-book-ops.js' import { computeBytecodeHash } from '../lib/bytecode-utils.js' -import { checkShouldSync, createDeploymentMetadata, reconstructDeploymentRecord } from '../lib/sync-utils.js' +import { buildDeploymentMetadata } from '../lib/deployment-metadata.js' +import { checkShouldSync, reconstructDeploymentRecord } from '../lib/sync-utils.js' /** * Deployment Metadata Tests @@ -303,30 +304,68 @@ describe('Sync Change Detection', () => { }) }) - describe('createDeploymentMetadata', () => { + describe('buildDeploymentMetadata', () => { + const bytecode = '0x608060405234801561001057600080fd5b50' + it('creates metadata with all required fields', () => { - const bytecode = '0x608060405234801561001057600080fd5b50' const expectedHash = computeBytecodeHash(bytecode) + const metadata = buildDeploymentMetadata( + { transaction: { hash: '0xtxhash' }, argsData: '0xargsdata' }, + expectedHash, + { blockNumber: 12345678, timestamp: '2024-01-15T10:30:00Z' }, + ) + + expect(metadata).to.exist + expect(metadata!.txHash).to.equal('0xtxhash') + expect(metadata!.argsData).to.equal('0xargsdata') + expect(metadata!.bytecodeHash).to.equal(expectedHash) + expect(metadata!.blockNumber).to.equal(12345678) + expect(metadata!.timestamp).to.equal('2024-01-15T10:30:00Z') + }) + + it('creates metadata without optional fields', () => { + const metadata = buildDeploymentMetadata( + { transaction: { hash: '0xtxhash' }, argsData: '0xargsdata' }, + computeBytecodeHash(bytecode), + ) + + expect(metadata).to.exist + expect(metadata!.txHash).to.equal('0xtxhash') + expect(metadata!.argsData).to.equal('0xargsdata') + expect(metadata!.bytecodeHash).to.be.a('string') + expect(metadata!.blockNumber).to.be.undefined + expect(metadata!.timestamp).to.be.undefined + }) - const metadata = createDeploymentMetadata('0xtxhash', '0xargsdata', bytecode, 12345678, '2024-01-15T10:30:00Z') + it('prefers explicit blockNumber over receipt.blockNumber', () => { + const metadata = buildDeploymentMetadata( + { transaction: { hash: '0xtxhash' }, argsData: '0xargsdata', receipt: { blockNumber: '0x1' } }, + computeBytecodeHash(bytecode), + { blockNumber: 12345678 }, + ) - expect(metadata.txHash).to.equal('0xtxhash') - expect(metadata.argsData).to.equal('0xargsdata') - expect(metadata.bytecodeHash).to.equal(expectedHash) - expect(metadata.blockNumber).to.equal(12345678) - expect(metadata.timestamp).to.equal('2024-01-15T10:30:00Z') + expect(metadata!.blockNumber).to.equal(12345678) }) - it('creates metadata without optional fields', () => { - const bytecode = '0x608060405234801561001057600080fd5b50' + it('extracts blockNumber from a hex-string receipt', () => { + const metadata = buildDeploymentMetadata( + { transaction: { hash: '0xtxhash' }, argsData: '0xargsdata', receipt: { blockNumber: '0x2a' } }, + computeBytecodeHash(bytecode), + ) - const metadata = createDeploymentMetadata('0xtxhash', '0xargsdata', bytecode) + expect(metadata!.blockNumber).to.equal(42) + }) + + it('returns undefined when txHash is missing', () => { + const metadata = buildDeploymentMetadata({ argsData: '0xargsdata' }, computeBytecodeHash(bytecode)) + + expect(metadata).to.be.undefined + }) + + it('returns undefined when argsData is missing', () => { + const metadata = buildDeploymentMetadata({ transaction: { hash: '0xtxhash' } }, computeBytecodeHash(bytecode)) - expect(metadata.txHash).to.equal('0xtxhash') - expect(metadata.argsData).to.equal('0xargsdata') - expect(metadata.bytecodeHash).to.be.a('string') - expect(metadata.blockNumber).to.be.undefined - expect(metadata.timestamp).to.be.undefined + expect(metadata).to.be.undefined }) }) }) diff --git a/packages/interfaces/src/types/horizon.ts b/packages/interfaces/src/types/horizon.ts index afed43e2c..7bd9ca1db 100644 --- a/packages/interfaces/src/types/horizon.ts +++ b/packages/interfaces/src/types/horizon.ts @@ -23,7 +23,6 @@ export { IGraphProxyAdmin as GraphProxyAdmin, IGraphTallyCollectorToolshed as GraphTallyCollector, IHorizonStakingToolshed as HorizonStaking, - IRecurringCollector, IL2CurationToolshed as L2Curation, IL2GNSToolshed as L2GNS, IGraphToken as L2GraphToken, diff --git a/packages/issuance/addresses.json b/packages/issuance/addresses.json index 28942d3e1..24d2a2893 100644 --- a/packages/issuance/addresses.json +++ b/packages/issuance/addresses.json @@ -162,9 +162,10 @@ "DirectAllocation_Implementation": { "address": "0xd5de0951759b8306226fa370a9ecca40a31aa2d3", "deployment": { - "txHash": "", + "txHash": "0x8e52d51f893a7fe465e475c20ade5911a3cdb7a8e7b2b625564f49d8ee93bb67", "argsData": "0x000000000000000000000000f8c05dcf59e8b28bfd5eed176c562bebcfc7ac04", - "bytecodeHash": "0xf11b102de39fbe66879f57214393c7ff7438e050f77802e2c08c71a000002003" + "bytecodeHash": "0xf11b102de39fbe66879f57214393c7ff7438e050f77802e2c08c71a000002003", + "blockNumber": 258322238 } } } diff --git a/packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol b/packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol index 92e811ce5..7d06ba768 100644 --- a/packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol +++ b/packages/issuance/contracts/eligibility/mocks/MockRewardsEligibilityOracle.sol @@ -42,7 +42,7 @@ contract MockRewardsEligibilityOracle is BaseUpgradeable { } /// @notice ERC165 interface detection. - /// @dev Supports IRewardsEligibility (0x66e305fd) and inherited interfaces. + /// @dev Supports IProviderEligibility (0x66e305fd) and inherited interfaces. /// @param interfaceId The interface identifier to check. /// @return True if the interface is supported. function supportsInterface(bytes4 interfaceId) public view override returns (bool) { diff --git a/packages/toolshed/test/recurring-collector.test.ts b/packages/toolshed/test/recurring-collector.test.ts deleted file mode 100644 index 9a8e7efd7..000000000 --- a/packages/toolshed/test/recurring-collector.test.ts +++ /dev/null @@ -1,183 +0,0 @@ -import assert from 'node:assert/strict' - -import { ethers } from 'ethers' - -import { - decodeAcceptIndexingAgreementMetadata, - decodeIndexingAgreementTermsV1, - decodeSignedRCA, - encodeCollectIndexingFeesData, -} from '../dist/core/index.js' - -const coder = ethers.AbiCoder.defaultAbiCoder() - -// -- decodeSignedRCA round-trip -- - -{ - const rca = { - deadline: 1000000n, - endsAt: 2000000n, - payer: '0x1111111111111111111111111111111111111111', - dataService: '0x2222222222222222222222222222222222222222', - serviceProvider: '0x3333333333333333333333333333333333333333', - maxInitialTokens: 500n * 10n ** 18n, - maxOngoingTokensPerSecond: 1n * 10n ** 15n, - minSecondsPerCollection: 3600n, - maxSecondsPerCollection: 86400n, - conditions: 0n, - nonce: 42n, - metadata: '0xdeadbeef', - } - const signature = '0x' + 'ab'.repeat(65) - - const encoded = coder.encode( - [ - 'tuple(tuple(uint64 deadline, uint64 endsAt, address payer, address dataService, address serviceProvider, uint256 maxInitialTokens, uint256 maxOngoingTokensPerSecond, uint32 minSecondsPerCollection, uint32 maxSecondsPerCollection, uint16 conditions, uint256 nonce, bytes metadata) rca, bytes signature)', - ], - [{ rca, signature }], - ) - - const decoded = decodeSignedRCA(encoded) - - assert.equal(decoded.rca.deadline, rca.deadline) - assert.equal(decoded.rca.endsAt, rca.endsAt) - assert.equal(decoded.rca.payer, rca.payer) - assert.equal(decoded.rca.dataService, rca.dataService) - assert.equal(decoded.rca.serviceProvider, rca.serviceProvider) - assert.equal(decoded.rca.maxInitialTokens, rca.maxInitialTokens) - assert.equal(decoded.rca.maxOngoingTokensPerSecond, rca.maxOngoingTokensPerSecond) - assert.equal(decoded.rca.minSecondsPerCollection, rca.minSecondsPerCollection) - assert.equal(decoded.rca.maxSecondsPerCollection, rca.maxSecondsPerCollection) - assert.equal(decoded.rca.conditions, rca.conditions) - assert.equal(decoded.rca.nonce, rca.nonce) - assert.equal(decoded.rca.metadata, rca.metadata) - assert.equal(decoded.signature, signature) - console.log('PASS: decodeSignedRCA round-trip') -} - -// -- decodeSignedRCA with empty metadata -- - -{ - const rca = { - deadline: 100n, - endsAt: 200n, - payer: '0x' + '00'.repeat(20), - dataService: '0x' + '00'.repeat(20), - serviceProvider: '0x' + '00'.repeat(20), - maxInitialTokens: 0n, - maxOngoingTokensPerSecond: 0n, - minSecondsPerCollection: 0n, - maxSecondsPerCollection: 0n, - conditions: 0n, - nonce: 0n, - metadata: '0x', - } - const signature = '0x' - - const encoded = coder.encode( - [ - 'tuple(tuple(uint64 deadline, uint64 endsAt, address payer, address dataService, address serviceProvider, uint256 maxInitialTokens, uint256 maxOngoingTokensPerSecond, uint32 minSecondsPerCollection, uint32 maxSecondsPerCollection, uint16 conditions, uint256 nonce, bytes metadata) rca, bytes signature)', - ], - [{ rca, signature }], - ) - - const decoded = decodeSignedRCA(encoded) - assert.equal(decoded.rca.metadata, '0x') - assert.equal(decoded.signature, '0x') - console.log('PASS: decodeSignedRCA with empty metadata') -} - -// -- decodeAcceptIndexingAgreementMetadata round-trip -- - -{ - const subgraphDeploymentId = ethers.id('my-subgraph') - const version = 0n // V1 = 0 in the enum - const terms = coder.encode(['uint256', 'uint256'], [1000n, 2000n]) - - const encoded = coder.encode( - ['tuple(bytes32 subgraphDeploymentId, uint8 version, bytes terms)'], - [{ subgraphDeploymentId, version, terms }], - ) - - const decoded = decodeAcceptIndexingAgreementMetadata(encoded) - - assert.equal(decoded.subgraphDeploymentId, subgraphDeploymentId) - assert.equal(decoded.version, version) - assert.equal(decoded.terms, terms) - console.log('PASS: decodeAcceptIndexingAgreementMetadata round-trip') -} - -// -- decodeAcceptIndexingAgreementMetadata with empty terms -- - -{ - const encoded = coder.encode( - ['tuple(bytes32 subgraphDeploymentId, uint8 version, bytes terms)'], - [{ subgraphDeploymentId: ethers.ZeroHash, version: 0, terms: '0x' }], - ) - - const decoded = decodeAcceptIndexingAgreementMetadata(encoded) - assert.equal(decoded.terms, '0x') - console.log('PASS: decodeAcceptIndexingAgreementMetadata with empty terms') -} - -// -- decodeAcceptIndexingAgreementMetadata with unknown version -- - -{ - const encoded = coder.encode( - ['tuple(bytes32 subgraphDeploymentId, uint8 version, bytes terms)'], - [{ subgraphDeploymentId: ethers.ZeroHash, version: 255, terms: '0x' }], - ) - - const decoded = decodeAcceptIndexingAgreementMetadata(encoded) - assert.equal(decoded.version, 255n) - console.log('PASS: decodeAcceptIndexingAgreementMetadata with unknown version') -} - -// -- decodeIndexingAgreementTermsV1 round-trip -- - -{ - const tokensPerSecond = 1000n * 10n ** 18n - const tokensPerEntityPerSecond = 5n * 10n ** 15n - - const encoded = coder.encode( - ['tuple(uint256 tokensPerSecond, uint256 tokensPerEntityPerSecond)'], - [{ tokensPerSecond, tokensPerEntityPerSecond }], - ) - - const decoded = decodeIndexingAgreementTermsV1(encoded) - - assert.equal(decoded.tokensPerSecond, tokensPerSecond) - assert.equal(decoded.tokensPerEntityPerSecond, tokensPerEntityPerSecond) - console.log('PASS: decodeIndexingAgreementTermsV1 round-trip') -} - -// -- encodeCollectIndexingFeesData round-trip -- - -{ - const agreementId = '0x' + 'ab'.repeat(16) - const entities = 1000n - const poi = ethers.id('test-poi') - const poiBlockNumber = 12345n - const metadata = '0xdeadbeef' - const maxSlippage = 100n - - const encoded = encodeCollectIndexingFeesData(agreementId, entities, poi, poiBlockNumber, metadata, maxSlippage) - - // Decode outer: (bytes16, bytes) - const [decodedAgreementId, innerData] = coder.decode(['bytes16', 'bytes'], encoded) - assert.equal(decodedAgreementId, agreementId) - - // Decode inner: CollectIndexingFeeDataV1 - const [decodedEntities, decodedPoi, decodedPoiBlockNumber, decodedMetadata, decodedMaxSlippage] = coder.decode( - ['uint256', 'bytes32', 'uint256', 'bytes', 'uint256'], - innerData, - ) - assert.equal(decodedEntities, entities) - assert.equal(decodedPoi, poi) - assert.equal(decodedPoiBlockNumber, poiBlockNumber) - assert.equal(decodedMetadata, metadata) - assert.equal(decodedMaxSlippage, maxSlippage) - console.log('PASS: encodeCollectIndexingFeesData round-trip') -} - -console.log('\nAll tests passed.') From 2a451441d7efb99d933d45767c33648b3bb7264f Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 19:59:07 +0000 Subject: [PATCH 22/29] refactor(deployment): centralize address-book routing Replace the ad-hoc addressBook-type ternaries across 7 sites with getAddressBookForType (and graph.updateAddressBookForContract for the deploy-standalone update path). Fixes a latent gap where deploy-standalone silently no-op'd subgraph-service contracts, and throws on missing shared-impl metadata in upgrade-implementation instead of writing an empty sentinel. --- .../deployment/deploy/gip/0088/10_status.ts | 7 ++---- .../deploy/gip/0088/upgrade/04_upgrade.ts | 10 ++------- .../deploy/gip/0088/upgrade/10_status.ts | 7 ++---- packages/deployment/lib/deploy-standalone.ts | 16 ++++---------- packages/deployment/lib/status-detail.ts | 8 ++----- packages/deployment/lib/task-utils.ts | 9 ++------ .../deployment/lib/upgrade-implementation.ts | 22 ++++++++----------- 7 files changed, 23 insertions(+), 56 deletions(-) diff --git a/packages/deployment/deploy/gip/0088/10_status.ts b/packages/deployment/deploy/gip/0088/10_status.ts index f55ac1713..8da7509a8 100644 --- a/packages/deployment/deploy/gip/0088/10_status.ts +++ b/packages/deployment/deploy/gip/0088/10_status.ts @@ -4,7 +4,7 @@ import { PROVIDER_ELIGIBILITY_MANAGEMENT_ABI, SUBGRAPH_SERVICE_CLOSE_GUARD_ABI, } from '@graphprotocol/deployment/lib/abis.js' -import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' +import { getAddressBookForType, getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' import { addressEquals, isRewardsManagerUpgraded } from '@graphprotocol/deployment/lib/contract-checks.js' import { Contracts, type RegistryEntry } from '@graphprotocol/deployment/lib/contract-registry.js' import { GoalTags } from '@graphprotocol/deployment/lib/deployment-tags.js' @@ -53,10 +53,7 @@ export default createStatusModule(GoalTags.GIP_0088, async (env) => { const rm = env.getOrNull('RewardsManager') for (const contract of upgradeContracts) { - const ab = - contract.addressBook === 'subgraph-service' - ? graph.getSubgraphServiceAddressBook(targetChainId) - : graph.getHorizonAddressBook(targetChainId) + const ab = getAddressBookForType(contract.addressBook, targetChainId) const result = await getContractStatusLine(client, contract.addressBook, ab, contract.name) env.showMessage(` ${result.line}`) diff --git a/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts b/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts index 2dbc35825..cdec30636 100644 --- a/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts +++ b/packages/deployment/deploy/gip/0088/upgrade/04_upgrade.ts @@ -6,8 +6,7 @@ import { REWARDS_MANAGER_ABI, REWARDS_MANAGER_DEPRECATED_ABI, } from '@graphprotocol/deployment/lib/abis.js' -import type { AnyAddressBookOps } from '@graphprotocol/deployment/lib/address-book-ops.js' -import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' +import { getAddressBookForType, getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' import { checkConfigurationStatus } from '@graphprotocol/deployment/lib/apply-configuration.js' import { getREOConditions } from '@graphprotocol/deployment/lib/contract-checks.js' import { @@ -122,12 +121,7 @@ async function collectProxyUpgrades(env: Environment, builder: TxBuilder, target const addressBooks: AddressBookType[] = ['horizon', 'subgraph-service', 'issuance'] for (const abType of addressBooks) { const bookRegistry = CONTRACT_REGISTRY[abType] - const ab: AnyAddressBookOps = - abType === 'subgraph-service' - ? graph.getSubgraphServiceAddressBook(targetChainId) - : abType === 'issuance' - ? graph.getIssuanceAddressBook(targetChainId) - : graph.getHorizonAddressBook(targetChainId) + const ab = getAddressBookForType(abType, targetChainId) for (const [name, metadata] of Object.entries(bookRegistry)) { const meta = metadata as ContractMetadata diff --git a/packages/deployment/deploy/gip/0088/upgrade/10_status.ts b/packages/deployment/deploy/gip/0088/upgrade/10_status.ts index 352b04d4f..fdf49394d 100644 --- a/packages/deployment/deploy/gip/0088/upgrade/10_status.ts +++ b/packages/deployment/deploy/gip/0088/upgrade/10_status.ts @@ -1,5 +1,5 @@ import { IISSUANCE_TARGET_INTERFACE_ID } from '@graphprotocol/deployment/lib/abis.js' -import { getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' +import { getAddressBookForType, getTargetChainIdFromEnv } from '@graphprotocol/deployment/lib/address-book-utils.js' import { checkConfigurationStatus } from '@graphprotocol/deployment/lib/apply-configuration.js' import { getREOConditions, @@ -60,10 +60,7 @@ const func: DeployScriptModule = async (env) => { const rm = env.getOrNull('RewardsManager') for (const contract of upgradeContracts) { - const ab = - contract.addressBook === 'subgraph-service' - ? graph.getSubgraphServiceAddressBook(targetChainId) - : graph.getHorizonAddressBook(targetChainId) + const ab = getAddressBookForType(contract.addressBook, targetChainId) const result = await getContractStatusLine(client, contract.addressBook, ab, contract.name) env.showMessage(` ${result.line}`) diff --git a/packages/deployment/lib/deploy-standalone.ts b/packages/deployment/lib/deploy-standalone.ts index 0b7b2c9fd..4593cbaa0 100644 --- a/packages/deployment/lib/deploy-standalone.ts +++ b/packages/deployment/lib/deploy-standalone.ts @@ -59,18 +59,10 @@ export async function deployStandaloneContract( env.showMessage(`\n✓ ${contract.name} unchanged at ${result.address}`) } - // Update address book based on which book the contract belongs to - if (contract.addressBook === 'horizon') { - await graph.updateHorizonAddressBook(env, { - name: contract.name, - address: result.address, - }) - } else if (contract.addressBook === 'issuance') { - await graph.updateIssuanceAddressBook(env, { - name: contract.name, - address: result.address, - }) - } + await graph.updateAddressBookForContract(env, contract, { + name: contract.name, + address: result.address, + }) return { address: result.address, diff --git a/packages/deployment/lib/status-detail.ts b/packages/deployment/lib/status-detail.ts index b460271ce..a9a4cede8 100644 --- a/packages/deployment/lib/status-detail.ts +++ b/packages/deployment/lib/status-detail.ts @@ -20,7 +20,7 @@ import { REWARDS_MANAGER_ABI, } from './abis.js' import type { AddressBookOps } from './address-book-ops.js' -import { getTargetChainIdFromEnv } from './address-book-utils.js' +import { getAddressBookForType, getTargetChainIdFromEnv } from './address-book-utils.js' import { checkIssuanceAllocatorActivation, checkOperatorRole, @@ -986,11 +986,7 @@ export async function showDetailedComponentStatus( // Resolve address books const horizonBook = graph.getHorizonAddressBook(chainId) const addressBook = - contract.addressBook === 'horizon' - ? horizonBook - : contract.addressBook === 'subgraph-service' - ? graph.getSubgraphServiceAddressBook(chainId) - : graph.getIssuanceAddressBook(chainId) + contract.addressBook === 'horizon' ? horizonBook : getAddressBookForType(contract.addressBook, chainId) // Resolve ownership context const ownershipCtx = await resolveOwnershipContext(client, env, chainId) diff --git a/packages/deployment/lib/task-utils.ts b/packages/deployment/lib/task-utils.ts index 72473073e..62826905d 100644 --- a/packages/deployment/lib/task-utils.ts +++ b/packages/deployment/lib/task-utils.ts @@ -8,8 +8,8 @@ import { configVariable } from 'hardhat/config' +import { getAddressBookForType } from './address-book-utils.js' import { type AddressBookType, CONTRACT_REGISTRY } from './contract-registry.js' -import { graph } from '../rocketh/deploy.js' /** * Convert network name to env var prefix: arbitrumSepolia → ARBITRUM_SEPOLIA @@ -88,12 +88,7 @@ export function resolveContractFromRegistry( * Get contract address from address book */ export function getContractAddress(addressBook: AddressBookType, contractName: string, chainId: number): string | null { - const book = - addressBook === 'issuance' - ? graph.getIssuanceAddressBook(chainId) - : addressBook === 'horizon' - ? graph.getHorizonAddressBook(chainId) - : graph.getSubgraphServiceAddressBook(chainId) + const book = getAddressBookForType(addressBook, chainId) // Address book type is a union — cast to access entryExists/getEntry with a runtime name // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/deployment/lib/upgrade-implementation.ts b/packages/deployment/lib/upgrade-implementation.ts index 3b35d482d..81b5fc814 100644 --- a/packages/deployment/lib/upgrade-implementation.ts +++ b/packages/deployment/lib/upgrade-implementation.ts @@ -1,8 +1,7 @@ import type { Environment } from '@rocketh/core/types' import { encodeFunctionData } from 'viem' -import { getTargetChainIdFromEnv } from './address-book-utils.js' -import type { AnyAddressBookOps } from './address-book-ops.js' +import { getAddressBookForType, getTargetChainIdFromEnv } from './address-book-utils.js' import { GRAPH_PROXY_ADMIN_ABI, OZ_PROXY_ADMIN_ABI } from './abis.js' import { type AddressBookType, type ProxyType, type RegistryEntry } from './contract-registry.js' import { getOnChainImplementation } from './deploy-implementation.js' @@ -148,12 +147,7 @@ export async function buildUpgradeTxs( const { contractName, proxyAdminName, proxyType = 'graph', addressBook = 'horizon' } = config const targetChainId = await getTargetChainIdFromEnv(env) - const addressBookInstance: AnyAddressBookOps = - addressBook === 'subgraph-service' - ? graph.getSubgraphServiceAddressBook(targetChainId) - : addressBook === 'issuance' - ? graph.getIssuanceAddressBook(targetChainId) - : graph.getHorizonAddressBook(targetChainId) + const addressBookInstance = getAddressBookForType(addressBook, targetChainId) // Check for pending implementation const contractEntry = addressBookInstance.getEntry(contractName) @@ -169,11 +163,13 @@ export async function buildUpgradeTxs( if (onChainImpl.toLowerCase() !== implDep.address.toLowerCase()) { // Shared implementation changed — auto-set pendingImplementation const implMetadata = addressBookInstance.getDeploymentMetadata(implDepName) - addressBookInstance.setPendingImplementationWithMetadata( - contractName, - implDep.address, - implMetadata ?? { txHash: '', bytecodeHash: '' }, - ) + if (!implMetadata) { + throw new Error( + `${contractName}: deployment metadata missing for ${implDepName}. ` + + `Run the implementation deploy script (or sync) before invoking upgrade.`, + ) + } + addressBookInstance.setPendingImplementationWithMetadata(contractName, implDep.address, implMetadata) env.showMessage(` ⚠️ ${contractName}: shared implementation changed, setting pending upgrade`) // Fall through to process the upgrade } else { From 7d2fea2cf96588afd33c69d078be20edc74814ed Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 19:59:17 +0000 Subject: [PATCH 23/29] fix(deployment): record proxyDeployment metadata at deploy time Deploy-time only recorded implementationDeployment; the proxy's own deployment record was left to sync's backfill. Add proxyDeployment to DeploymentUpdate and capture it in both deployProxyWithOwnImpl and deployProxyWithSharedImpl. --- .../deployment/lib/issuance-deploy-utils.ts | 28 +++++++++++++++++-- packages/deployment/rocketh/deploy.ts | 5 ++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/deployment/lib/issuance-deploy-utils.ts b/packages/deployment/lib/issuance-deploy-utils.ts index 925368c3e..6b7cc8165 100644 --- a/packages/deployment/lib/issuance-deploy-utils.ts +++ b/packages/deployment/lib/issuance-deploy-utils.ts @@ -177,6 +177,7 @@ export async function updateProxyAddressBook( implAddress?: string, proxyAdminAddress?: string, implementationDeployment?: DeploymentMetadata, + proxyDeployment?: DeploymentMetadata, ) { await graphUtils.updateAddressBookForContract(env, contract, { name: contract.name, @@ -184,6 +185,7 @@ export async function updateProxyAddressBook( proxy: 'transparent', proxyAdmin: proxyAdminAddress, implementation: implAddress, + proxyDeployment, implementationDeployment, }) } @@ -453,6 +455,12 @@ async function deployProxyWithOwnImpl( ? buildDeploymentMetadata(implResult, computeBytecodeHash(implResult.deployedBytecode)) : undefined + // Build proxy deployment metadata from the proxy artifact bytecode + const proxyDeployment = buildDeploymentMetadata( + proxyResult, + computeBytecodeHash(proxyArtifact.deployedBytecode ?? '0x'), + ) + // Update address book with per-proxy ProxyAdmin and deployment metadata await updateProxyAddressBook( env, @@ -462,6 +470,7 @@ async function deployProxyWithOwnImpl( implResult.address, proxyAdminAddress, implementationDeployment, + proxyDeployment, ) if (proxyResult.newlyDeployed) { @@ -532,8 +541,23 @@ async function deployProxyWithSharedImpl( abi: implDep.abi, }) - // Update address book with per-proxy ProxyAdmin - await updateProxyAddressBook(env, graph, contract, proxyResult.address, implDep.address, proxyAdminAddress) + // Build proxy deployment metadata from the proxy artifact bytecode + const proxyDeployment = buildDeploymentMetadata( + proxyResult, + computeBytecodeHash(proxyArtifact.deployedBytecode ?? '0x'), + ) + + // Update address book with per-proxy ProxyAdmin and proxy deployment metadata + await updateProxyAddressBook( + env, + graph, + contract, + proxyResult.address, + implDep.address, + proxyAdminAddress, + undefined, + proxyDeployment, + ) if (proxyResult.newlyDeployed) { env.showMessage(`✓ ${contract.name} proxy deployed at ${proxyResult.address}`) diff --git a/packages/deployment/rocketh/deploy.ts b/packages/deployment/rocketh/deploy.ts index f230b0490..e2d4eed0f 100644 --- a/packages/deployment/rocketh/deploy.ts +++ b/packages/deployment/rocketh/deploy.ts @@ -33,6 +33,8 @@ export interface DeploymentUpdate { implementation?: string /** Proxy type if this is a proxied contract */ proxy?: 'transparent' | 'graph' + /** Proxy deployment metadata (for verification of the proxy contract itself) */ + proxyDeployment?: DeploymentMetadata /** Implementation deployment metadata (for verification of proxied contracts) */ implementationDeployment?: DeploymentMetadata /** Deployment metadata (for verification of non-proxied contracts) */ @@ -144,6 +146,9 @@ export const graph = { function applyDeploymentUpdate(addressBook: AnyAddressBookOps, update: DeploymentUpdate): void { if (update.proxy) { addressBook.setProxy(update.name, update.address, update.implementation!, update.proxyAdmin!, update.proxy) + if (update.proxyDeployment) { + addressBook.setProxyDeploymentMetadata(update.name, update.proxyDeployment) + } if (update.implementationDeployment) { addressBook.setImplementationDeploymentMetadata(update.name, update.implementationDeployment) } From c881da28586cfd424ae02a2277254079096de77f Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 19:59:30 +0000 Subject: [PATCH 24/29] refactor(deployment): canonical computeArtifactBytecodeHash helper Library resolution was added to computeBytecodeHash but only the new-code sites adopted the linkReferences + resolver args. deployProxyWithOwnImpl and sync-utils' backfill paths kept calling the 1-arg form, diverging from checkShouldSync's artifact-side hash for library-using contracts. Introduce computeArtifactBytecodeHash + tryComputeArtifactBytecodeHash; route every deploy-time and sync callsite through them. Side-touch: replace verify-contract's private getAddressBook switch with getAddressBookForType. --- .../deploy/allocate/direct/01_impl.ts | 13 ++--- .../deployment/lib/deploy-implementation.ts | 43 +++++++++++++--- .../deployment/lib/issuance-deploy-utils.ts | 16 +++--- packages/deployment/lib/sync-utils.ts | 49 ++++++++----------- packages/deployment/tasks/verify-contract.ts | 29 +++-------- 5 files changed, 77 insertions(+), 73 deletions(-) diff --git a/packages/deployment/deploy/allocate/direct/01_impl.ts b/packages/deployment/deploy/allocate/direct/01_impl.ts index 08d709bd2..6ff6d6a56 100644 --- a/packages/deployment/deploy/allocate/direct/01_impl.ts +++ b/packages/deployment/deploy/allocate/direct/01_impl.ts @@ -1,6 +1,6 @@ -import { getLibraryResolver, loadDirectAllocationArtifact } from '@graphprotocol/deployment/lib/artifact-loaders.js' -import { computeBytecodeHash } from '@graphprotocol/deployment/lib/bytecode-utils.js' +import { loadDirectAllocationArtifact } from '@graphprotocol/deployment/lib/artifact-loaders.js' import { Contracts } from '@graphprotocol/deployment/lib/contract-registry.js' +import { computeArtifactBytecodeHash } from '@graphprotocol/deployment/lib/deploy-implementation.js' import { buildDeploymentMetadata } from '@graphprotocol/deployment/lib/deployment-metadata.js' import { ComponentTags, DeploymentActions, shouldSkipAction } from '@graphprotocol/deployment/lib/deployment-tags.js' import { @@ -49,13 +49,10 @@ const func: DeployScriptModule = async (env) => { // Persist to address book — only write metadata on new deployments // to avoid overwriting stored hash with current artifact when deploy was a no-op if (result.newlyDeployed) { - const resolver = getLibraryResolver('issuance') - const bytecodeHash = computeBytecodeHash( - artifact.deployedBytecode ?? '0x', - artifact.deployedLinkReferences, - resolver, + const metadata = buildDeploymentMetadata( + result, + computeArtifactBytecodeHash(Contracts.issuance.DirectAllocation_Implementation.artifact!), ) - const metadata = buildDeploymentMetadata(result, bytecodeHash) if (metadata) { await graph.updateIssuanceAddressBook(env, { name: Contracts.issuance.DirectAllocation_Implementation.name, diff --git a/packages/deployment/lib/deploy-implementation.ts b/packages/deployment/lib/deploy-implementation.ts index 1b6623a2d..9206f3c80 100644 --- a/packages/deployment/lib/deploy-implementation.ts +++ b/packages/deployment/lib/deploy-implementation.ts @@ -156,6 +156,42 @@ export function loadArtifactFromSource(source: ArtifactSource): Artifact { } } +/** + * Compute the bytecode hash for an artifact source, with library resolution. + * + * This is the canonical bytecodeHash recorded in address-book deployment metadata — + * deploy-time, sync backfill, and `checkShouldSync` all agree on this fingerprint. + * + * Use this instead of calling `computeBytecodeHash` directly on rocketh's linked + * `deployedBytecode`: linked bytecode has real library addresses substituted in, + * so its hash diverges from the placeholder-fingerprint hash this helper produces + * for any library-using contract. + * + * Throws if the artifact cannot be loaded. + */ +export function computeArtifactBytecodeHash(source: ArtifactSource): string { + const artifact = loadArtifactFromSource(source) + return computeBytecodeHash( + artifact.deployedBytecode ?? '0x', + artifact.deployedLinkReferences, + getLibraryResolver(source.type), + ) +} + +/** + * Like {@link computeArtifactBytecodeHash}, but returns `undefined` instead of + * throwing if the artifact can't be loaded. Intended for sync-style flows where + * a missing artifact shouldn't abort the whole pass. + */ +export function tryComputeArtifactBytecodeHash(source: ArtifactSource | undefined): string | undefined { + if (!source) return undefined + try { + return computeArtifactBytecodeHash(source) + } catch { + return undefined + } +} + /** * Build ImplementationDeployConfig from registry metadata * @@ -288,12 +324,7 @@ export async function deployImplementation( const addressBookInstance = getAddressBookForType(addressBook, targetChainId) // Compute local artifact bytecode hash (for storing with deployment) - const resolver = getLibraryResolver(artifactSource.type) - const localBytecodeHash = computeBytecodeHash( - artifact.deployedBytecode ?? '0x', - artifact.deployedLinkReferences, - resolver, - ) + const localBytecodeHash = computeArtifactBytecodeHash(artifactSource) // 3) Pre-check: skip deployment if bytecodeHash and constructor args match // Rocketh's comparison can false-positive when sync creates bare records (e.g., wrong diff --git a/packages/deployment/lib/issuance-deploy-utils.ts b/packages/deployment/lib/issuance-deploy-utils.ts index 6b7cc8165..704bde2e2 100644 --- a/packages/deployment/lib/issuance-deploy-utils.ts +++ b/packages/deployment/lib/issuance-deploy-utils.ts @@ -5,16 +5,17 @@ import { encodeFunctionData } from 'viem' import { Contracts, type RegistryEntry } from './contract-registry.js' import { getGovernor } from './controller-utils.js' +import { loadTransparentProxyArtifact } from './artifact-loaders.js' +import { INITIALIZE_GOVERNOR_ABI, OZ_PROXY_ADMIN_ABI } from './abis.js' +import { computeBytecodeHash } from './bytecode-utils.js' +import { getAddressBookForType, getTargetChainIdFromEnv } from './address-book-utils.js' import { + computeArtifactBytecodeHash, deployImplementation, getImplementationConfig, getOnChainImplementation, loadArtifactFromSource, } from './deploy-implementation.js' -import { loadTransparentProxyArtifact } from './artifact-loaders.js' -import { INITIALIZE_GOVERNOR_ABI, OZ_PROXY_ADMIN_ABI } from './abis.js' -import { computeBytecodeHash } from './bytecode-utils.js' -import { getAddressBookForType, getTargetChainIdFromEnv } from './address-book-utils.js' import { buildDeploymentMetadata } from './deployment-metadata.js' import { deploy, execute, graph } from '../rocketh/deploy.js' @@ -450,10 +451,9 @@ async function deployProxyWithOwnImpl( abi: implArtifact.abi, }) - // Build implementation deployment metadata for address book (only if we have required fields) - const implementationDeployment: DeploymentMetadata | undefined = implResult.deployedBytecode - ? buildDeploymentMetadata(implResult, computeBytecodeHash(implResult.deployedBytecode)) - : undefined + // Build implementation deployment metadata. Hash from the artifact (with library resolution) + // so the stored value stays in lockstep with sync's artifact-side comparison. + const implementationDeployment = buildDeploymentMetadata(implResult, computeArtifactBytecodeHash(contract.artifact!)) // Build proxy deployment metadata from the proxy artifact bytecode const proxyDeployment = buildDeploymentMetadata( diff --git a/packages/deployment/lib/sync-utils.ts b/packages/deployment/lib/sync-utils.ts index 6c7ac9836..5c85f6c37 100644 --- a/packages/deployment/lib/sync-utils.ts +++ b/packages/deployment/lib/sync-utils.ts @@ -14,7 +14,6 @@ import { isForkMode, } from './address-book-utils.js' import { - getLibraryResolver, loadContractsArtifact, loadHorizonBuildArtifact, loadIssuanceArtifact, @@ -32,7 +31,11 @@ import { getContractsByAddressBook, } from './contract-registry.js' import { SpecialTags } from './deployment-tags.js' -import { getOnChainImplementation } from './deploy-implementation.js' +import { + computeArtifactBytecodeHash, + getOnChainImplementation, + tryComputeArtifactBytecodeHash, +} from './deploy-implementation.js' import { graph } from '../rocketh/deploy.js' import type { AnyAddressBookOps } from './address-book-ops.js' @@ -128,20 +131,12 @@ export function checkShouldSync( // Check bytecode hash if deployment metadata exists const metadata = addressBook.getDeploymentMetadata(contractName) if (metadata?.bytecodeHash && artifact) { - const loadedArtifact = loadArtifactFromSource(artifact) - if (loadedArtifact?.deployedBytecode) { - const libResolver = getLibraryResolver(artifact.type) - const localHash = computeBytecodeHash( - loadedArtifact.deployedBytecode, - loadedArtifact.deployedLinkReferences, - libResolver, - ) - if (metadata.bytecodeHash !== localHash) { - return { - shouldSync: false, - reason: 'local bytecode changed since deployment', - warning: `${contractName}: local bytecode differs from deployed (hash mismatch)`, - } + const localHash = tryComputeArtifactBytecodeHash(artifact) + if (localHash && metadata.bytecodeHash !== localHash) { + return { + shouldSync: false, + reason: 'local bytecode changed since deployment', + warning: `${contractName}: local bytecode differs from deployed (hash mismatch)`, } } } @@ -194,12 +189,7 @@ export function reconstructDeploymentRecord( } if (deploymentMetadata.bytecodeHash && loadedArtifact.deployedBytecode) { - const libResolver = getLibraryResolver(artifact.type) - const localHash = computeBytecodeHash( - loadedArtifact.deployedBytecode, - loadedArtifact.deployedLinkReferences, - libResolver, - ) + const localHash = computeArtifactBytecodeHash(artifact) if (deploymentMetadata.bytecodeHash !== localHash) { // Bytecode has changed - cannot reconstruct reliably return undefined @@ -234,10 +224,7 @@ function checkCodeChanged( if (!artifactSource) return { codeChanged: false } const localArtifact = loadArtifactFromSource(artifactSource) - const resolver = getLibraryResolver(artifactSource.type) - const localHash = localArtifact?.deployedBytecode - ? computeBytecodeHash(localArtifact.deployedBytecode, localArtifact.deployedLinkReferences, resolver) - : undefined + const localHash = tryComputeArtifactBytecodeHash(artifactSource) const deploymentMetadata = addressBook.getDeploymentMetadata(contractName) if (deploymentMetadata?.bytecodeHash && localHash) { @@ -780,10 +767,13 @@ export async function syncContract( rockethBlockNumber > bookBlockNumber) if (rockethIsNewer) { + // Hash from the artifact (with library resolution) so the stored value stays + // in lockstep with checkShouldSync's artifact-side comparison. Hashing + // rocketh's linked `deployedBytecode` would diverge for library-using impls. const metadata: DeploymentMetadata = { txHash: rockethImpl.transaction?.hash ?? '', argsData: rockethImpl.argsData, - bytecodeHash: rockethImpl.deployedBytecode ? computeBytecodeHash(rockethImpl.deployedBytecode) : '', + bytecodeHash: tryComputeArtifactBytecodeHash(spec.proxy.artifact) ?? '', ...(rockethBlockNumber !== undefined && { blockNumber: rockethBlockNumber }), } // Write to correct location based on pending vs current @@ -925,10 +915,13 @@ export async function syncContract( rockethBlockNumber > addressBookBlockNumber) if (rockethIsNewer) { + // Hash from the artifact (with library resolution) so the stored value stays in lockstep + // with checkShouldSync's artifact-side comparison. Hashing rocketh's linked + // `deployedBytecode` would diverge for library-using contracts. const deploymentMetadata: DeploymentMetadata = { txHash: rockethRecord.transaction?.hash ?? '', argsData: rockethRecord.argsData, - bytecodeHash: rockethRecord.deployedBytecode ? computeBytecodeHash(rockethRecord.deployedBytecode) : '', + bytecodeHash: tryComputeArtifactBytecodeHash(spec.artifact) ?? '', ...(rockethBlockNumber !== undefined && { blockNumber: rockethBlockNumber }), } addressBook.setDeploymentMetadata(spec.name, deploymentMetadata) diff --git a/packages/deployment/tasks/verify-contract.ts b/packages/deployment/tasks/verify-contract.ts index 921465dae..e6195008e 100644 --- a/packages/deployment/tasks/verify-contract.ts +++ b/packages/deployment/tasks/verify-contract.ts @@ -8,8 +8,7 @@ import path from 'path' import { decodeAbiParameters } from 'viem' import type { AnyAddressBookOps } from '../lib/address-book-ops.js' -import { getLibraryResolver } from '../lib/artifact-loaders.js' -import { computeBytecodeHash } from '../lib/bytecode-utils.js' +import { getAddressBookForType } from '../lib/address-book-utils.js' import { type AddressBookType, type ArtifactSource, @@ -17,10 +16,9 @@ import { getContractMetadata, getContractsByAddressBook, } from '../lib/contract-registry.js' -import { loadArtifactFromSource } from '../lib/deploy-implementation.js' +import { computeArtifactBytecodeHash, loadArtifactFromSource } from '../lib/deploy-implementation.js' import { checkEtherscanVerified, verifyOZProxy } from '../lib/oz-proxy-verify.js' import { resolveConfigVar } from '../lib/task-utils.js' -import { graph } from '../rocketh/deploy.js' const ADDRESS_BOOK_TYPES: AddressBookType[] = ['horizon', 'subgraph-service', 'issuance'] @@ -294,20 +292,6 @@ async function runVerify( }) } -/** - * Get address book for a given type and chainId - */ -function getAddressBook(addressBookType: AddressBookType, chainId: number): AnyAddressBookOps { - switch (addressBookType) { - case 'horizon': - return graph.getHorizonAddressBook(chainId) - case 'subgraph-service': - return graph.getSubgraphServiceAddressBook(chainId) - case 'issuance': - return graph.getIssuanceAddressBook(chainId) - } -} - /** * Check if local artifact bytecode matches stored bytecodeHash * @@ -334,10 +318,9 @@ function checkBytecodeMatch( return { matches: false, reason: 'no deployment metadata (not deployed by this system)' } } - // Compare local artifact bytecodeHash with stored hash - // Must pass linkReferences and resolver to match how hash was computed at deployment - const resolver = getLibraryResolver(metadata.artifact!.type) - const localBytecodeHash = computeBytecodeHash(artifact.deployedBytecode, artifact.deployedLinkReferences, resolver) + // Compare local artifact bytecodeHash with stored hash. Uses the same artifact-side + // hashing as deploy-time so library-using contracts round-trip correctly. + const localBytecodeHash = computeArtifactBytecodeHash(metadata.artifact!) if (localBytecodeHash !== deploymentMetadata.bytecodeHash) { return { matches: false, @@ -371,7 +354,7 @@ async function verifySingleContract( proxyOnly: boolean, implOnly: boolean, ): Promise { - const addressBook = getAddressBook(addressBookType, chainId) + const addressBook = getAddressBookForType(addressBookType, chainId) // Check if deployed if (!addressBook.entryExists(contractName)) { From 941379380d2e944fb3cb9e89f1af160fed6f9c0a Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 19:59:40 +0000 Subject: [PATCH 25/29] refactor(deployment): drop unused setPendingImplementation The minimal setPendingImplementation landed alongside setPendingImplementationWithMetadata but was never wired up. Drop it and update doc references. --- .../deployment/docs/address-book/README.md | 22 +++---- packages/deployment/lib/address-book-ops.ts | 58 +------------------ 2 files changed, 14 insertions(+), 66 deletions(-) diff --git a/packages/deployment/docs/address-book/README.md b/packages/deployment/docs/address-book/README.md index cf9e48b0a..c7ffe7616 100644 --- a/packages/deployment/docs/address-book/README.md +++ b/packages/deployment/docs/address-book/README.md @@ -16,7 +16,7 @@ const addressBook = graph.getIssuanceAddressBook(chainId) // Write operations addressBook.setProxy('RewardsManager', proxyAddr, implAddr, adminAddr, 'transparent') -addressBook.setPendingImplementation('RewardsManager', newImplAddr, { txHash: '0x...' }) +addressBook.setPendingImplementationWithMetadata('RewardsManager', newImplAddr, deploymentMetadata) // Read operations const entry = addressBook.getEntry('RewardsManager') @@ -26,16 +26,16 @@ const entry = addressBook.getEntry('RewardsManager') ### Write Operations -| Method | Purpose | -| ------------------------------------------------- | ---------------------------------------- | -| `setContract(name, address)` | Non-proxied contract | -| `setProxy(name, proxy, impl, admin, type)` | All proxy fields | -| `setImplementation(name, impl)` | Active implementation | -| `setProxyAdmin(name, admin)` | Proxy admin | -| `setPendingImplementation(name, impl, metadata?)` | Pending implementation | -| `promotePendingImplementation(name)` | Move pending → active | -| `clearPendingImplementation(name)` | Clear pending | -| `setImplementationAndClearIfMatches(name, impl)` | Set impl + auto-clear pending if matches | +| Method | Purpose | +| ------------------------------------------------------------ | ---------------------------------------- | +| `setContract(name, address)` | Non-proxied contract | +| `setProxy(name, proxy, impl, admin, type)` | All proxy fields | +| `setImplementation(name, impl)` | Active implementation | +| `setProxyAdmin(name, admin)` | Proxy admin | +| `setPendingImplementationWithMetadata(name, impl, metadata)` | Pending implementation | +| `promotePendingImplementation(name)` | Move pending → active | +| `clearPendingImplementation(name)` | Clear pending | +| `setImplementationAndClearIfMatches(name, impl)` | Set impl + auto-clear pending if matches | ### Read Operations diff --git a/packages/deployment/lib/address-book-ops.ts b/packages/deployment/lib/address-book-ops.ts index 66927b862..9f6f506f3 100644 --- a/packages/deployment/lib/address-book-ops.ts +++ b/packages/deployment/lib/address-book-ops.ts @@ -17,7 +17,7 @@ * * // Write operations * addressBook.setProxy('RewardsManager', proxyAddr, implAddr, adminAddr, 'transparent') - * addressBook.setPendingImplementation('RewardsManager', newImplAddr, { txHash: '0x...' }) + * addressBook.setPendingImplementationWithMetadata('RewardsManager', newImplAddr, metadata) * ``` */ @@ -143,56 +143,6 @@ export class AddressBookOps { }) } - /** - * Set pending implementation - * - * Stores an implementation address in the pendingImplementation field. - * Only one pending implementation can exist at a time (replaces any existing pending). - * - * @example - * ```typescript - * ops.setPendingImplementation('RewardsManager', '0xNewImpl...', { - * txHash: '0xabc...', - * }) - * ``` - * - * @throws Error if contract not found in address book - * @throws Error if contract is not a proxy - */ - setPendingImplementation( - name: ContractName, - implementationAddress: string, - metadata?: { - txHash?: string - timestamp?: string - }, - ): void { - const entry = this.addressBook.getEntry(name as string) - - if (!entry) { - throw new Error(`Contract ${name} not found in address book`) - } - - if (!entry.proxy) { - throw new Error(`Contract ${name} is not a proxy contract`) - } - - const pendingImplementation: PendingImplementation = { - address: implementationAddress, - deployment: { - txHash: metadata?.txHash ?? '', - argsData: '0x', - bytecodeHash: '', - ...(metadata?.timestamp && { timestamp: metadata.timestamp }), - }, - } - - this.addressBook.setEntry(name, { - ...entry, - pendingImplementation, - }) - } - /** * Promote pending implementation to active * @@ -379,10 +329,8 @@ export class AddressBookOps { } /** - * Set pending implementation with full deployment metadata - * - * Enhanced version of setPendingImplementation that includes full deployment metadata - * for verification and record reconstruction. + * Set pending implementation with full deployment metadata for verification + * and record reconstruction. * * @example * ```typescript From 85e8289c130acfcfb6e19466d4c226263296ac28 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 19:59:50 +0000 Subject: [PATCH 26/29] refactor(deployment): unify block-number + artifact-load helpers sync-utils had its own near-duplicates of two helpers from elsewhere in the package. Export tryLoadArtifactFromSource (parallel to loadArtifactFromSource) and toBlockNumber; route sync-utils' three blockNumber sites and seven artifact-load sites through them. --- .../deployment/lib/deploy-implementation.ts | 15 ++++- .../deployment/lib/deployment-metadata.ts | 7 ++- packages/deployment/lib/sync-utils.ts | 59 ++++--------------- 3 files changed, 33 insertions(+), 48 deletions(-) diff --git a/packages/deployment/lib/deploy-implementation.ts b/packages/deployment/lib/deploy-implementation.ts index 9206f3c80..dbaacc92b 100644 --- a/packages/deployment/lib/deploy-implementation.ts +++ b/packages/deployment/lib/deploy-implementation.ts @@ -139,7 +139,7 @@ export interface ImplementationDeployResult { } /** - * Load artifact based on source configuration + * Load artifact based on source configuration. Throws if the artifact can't be loaded. */ export function loadArtifactFromSource(source: ArtifactSource): Artifact { switch (source.type) { @@ -156,6 +156,19 @@ export function loadArtifactFromSource(source: ArtifactSource): Artifact { } } +/** + * Like {@link loadArtifactFromSource}, but returns `undefined` instead of throwing. + * Intended for sync-style flows where a missing artifact shouldn't abort the pass. + */ +export function tryLoadArtifactFromSource(source: ArtifactSource | undefined): Artifact | undefined { + if (!source) return undefined + try { + return loadArtifactFromSource(source) + } catch { + return undefined + } +} + /** * Compute the bytecode hash for an artifact source, with library resolution. * diff --git a/packages/deployment/lib/deployment-metadata.ts b/packages/deployment/lib/deployment-metadata.ts index 201284b3c..936b445c3 100644 --- a/packages/deployment/lib/deployment-metadata.ts +++ b/packages/deployment/lib/deployment-metadata.ts @@ -20,7 +20,12 @@ type MetadataOverrides = { timestamp?: string } -function toBlockNumber(raw: `0x${string}` | bigint | number | undefined): number | undefined { +/** + * Coerce rocketh's `receipt.blockNumber` (hex string, bigint, or number) to a plain + * number. Returns `undefined` for missing values. Use this everywhere instead of + * inline `parseInt`/`Number` so the conversion stays consistent. + */ +export function toBlockNumber(raw: `0x${string}` | bigint | number | undefined): number | undefined { if (raw === undefined) return undefined if (typeof raw === 'string') return Number(BigInt(raw)) return Number(raw) diff --git a/packages/deployment/lib/sync-utils.ts b/packages/deployment/lib/sync-utils.ts index 5c85f6c37..dd8734d12 100644 --- a/packages/deployment/lib/sync-utils.ts +++ b/packages/deployment/lib/sync-utils.ts @@ -1,6 +1,6 @@ import { existsSync } from 'node:fs' -import type { Artifact, Environment } from '@rocketh/core/types' +import type { Environment } from '@rocketh/core/types' import type { DeploymentMetadata } from '@graphprotocol/toolshed/deployments' import { @@ -13,13 +13,6 @@ import { getTargetChainIdFromEnv, isForkMode, } from './address-book-utils.js' -import { - loadContractsArtifact, - loadHorizonBuildArtifact, - loadIssuanceArtifact, - loadOpenZeppelinArtifact, - loadSubgraphServiceArtifact, -} from './artifact-loaders.js' import { computeBytecodeHash } from './bytecode-utils.js' import { type AddressBookType, @@ -35,7 +28,9 @@ import { computeArtifactBytecodeHash, getOnChainImplementation, tryComputeArtifactBytecodeHash, + tryLoadArtifactFromSource, } from './deploy-implementation.js' +import { toBlockNumber } from './deployment-metadata.js' import { graph } from '../rocketh/deploy.js' import type { AnyAddressBookOps } from './address-book-ops.js' @@ -58,28 +53,6 @@ function formatAddress(address: string): string { } } -/** - * Load artifact from any supported source type - */ -function loadArtifactFromSource(source: ArtifactSource): Artifact | undefined { - try { - switch (source.type) { - case 'contracts': - return loadContractsArtifact(source.path, source.name) - case 'horizon': - return loadHorizonBuildArtifact(source.path) - case 'subgraph-service': - return loadSubgraphServiceArtifact(source.name) - case 'issuance': - return loadIssuanceArtifact(source.path) - case 'openzeppelin': - return loadOpenZeppelinArtifact(source.name) - } - } catch { - return undefined - } -} - // ============================================================================ // Sync Change Detection & Record Reconstruction // ============================================================================ @@ -183,7 +156,7 @@ export function reconstructDeploymentRecord( } // Verify bytecode hash matches if available - const loadedArtifact = loadArtifactFromSource(artifact) + const loadedArtifact = tryLoadArtifactFromSource(artifact) if (!loadedArtifact) { return undefined } @@ -223,7 +196,7 @@ function checkCodeChanged( ): { codeChanged: boolean; localHash?: string } { if (!artifactSource) return { codeChanged: false } - const localArtifact = loadArtifactFromSource(artifactSource) + const localArtifact = tryLoadArtifactFromSource(artifactSource) const localHash = tryComputeArtifactBytecodeHash(artifactSource) const deploymentMetadata = addressBook.getDeploymentMetadata(contractName) @@ -594,7 +567,7 @@ export async function syncContract( // The artifact is for the implementation, not the proxy itself let abi: readonly unknown[] = [] if (spec.artifact) { - const artifact = loadArtifactFromSource(spec.artifact) + const artifact = tryLoadArtifactFromSource(spec.artifact) if (artifact?.abi) { abi = artifact.abi } @@ -612,7 +585,7 @@ export async function syncContract( let abi: readonly unknown[] = existing.abi as readonly unknown[] // Update ABI from artifact if available (ABI doesn't affect change detection) if (spec.artifact) { - const artifact = loadArtifactFromSource(spec.artifact) + const artifact = tryLoadArtifactFromSource(spec.artifact) if (artifact?.abi) { abi = artifact.abi } @@ -645,9 +618,7 @@ export async function syncContract( const existingProxyDeployment = env.getOrNull(proxyDeploymentName) if (existingProxyDeployment?.argsData && existingProxyDeployment.argsData !== '0x') { const entry = spec.proxy.addressBook.getEntry(spec.name) - const proxyRockethBlockNumber = existingProxyDeployment.receipt?.blockNumber - ? parseInt(existingProxyDeployment.receipt.blockNumber as string) - : undefined + const proxyRockethBlockNumber = toBlockNumber(existingProxyDeployment.receipt?.blockNumber) const proxyAddressBookBlockNumber = entry.proxyDeployment?.blockNumber // Backfill if: @@ -687,7 +658,7 @@ export async function syncContract( let proxyAdminAbi: readonly unknown[] = [] const proxyAdminMetadata = getContractMetadata(spec.addressBookType, proxyAdminDeploymentName) if (proxyAdminMetadata?.artifact) { - const proxyAdminArtifact = loadArtifactFromSource(proxyAdminMetadata.artifact) + const proxyAdminArtifact = tryLoadArtifactFromSource(proxyAdminMetadata.artifact) if (proxyAdminArtifact?.abi) { proxyAdminAbi = proxyAdminArtifact.abi } @@ -750,9 +721,7 @@ export async function syncContract( // Backfill address book metadata from rocketh if rocketh is newer const rockethImpl = env.getOrNull(`${spec.name}_Implementation`) if (rockethImpl?.argsData && rockethImpl.argsData !== '0x') { - const rockethBlockNumber = rockethImpl.receipt?.blockNumber - ? parseInt(rockethImpl.receipt.blockNumber as string) - : undefined + const rockethBlockNumber = toBlockNumber(rockethImpl.receipt?.blockNumber) const bookBlockNumber = implDeployment?.blockNumber // Backfill if: @@ -846,7 +815,7 @@ export async function syncContract( let bytecode: `0x${string}` = '0x' let deployedBytecode: `0x${string}` | undefined if (spec.artifact) { - const artifact = loadArtifactFromSource(spec.artifact) + const artifact = tryLoadArtifactFromSource(spec.artifact) if (artifact?.abi) { abi = artifact.abi } @@ -876,7 +845,7 @@ export async function syncContract( // Address changed - update address but preserve existing bytecode let abi: readonly unknown[] = existing.abi as readonly unknown[] if (spec.artifact) { - const artifact = loadArtifactFromSource(spec.artifact) + const artifact = tryLoadArtifactFromSource(spec.artifact) if (artifact?.abi) { abi = artifact.abi } @@ -902,9 +871,7 @@ export async function syncContract( // eslint-disable-next-line @typescript-eslint/no-explicit-any const addressBook: any = getAddressBookForType(spec.addressBookType, chainId) const entry = addressBook.getEntry(spec.name) - const rockethBlockNumber = rockethRecord.receipt?.blockNumber - ? parseInt(rockethRecord.receipt.blockNumber as string) - : undefined + const rockethBlockNumber = toBlockNumber(rockethRecord.receipt?.blockNumber) const addressBookBlockNumber = entry.deployment?.blockNumber const rockethIsNewer = From fcd9094e64761a91d31ed8024af01b242ae22e14 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 20:13:24 +0000 Subject: [PATCH 27/29] chore: drop personal/external references from comments and docs Five comments/docs introduced during GIP-0088 work named the 'rem-local-network' setup as if it were the project's canonical local network, and one TODO pointed at a /sync/notes/ path that isn't part of the repo. Both are personal dev infrastructure that doesn't belong in committed source. Reword in terms of the actual network (chainId 1337, Graph local network) and drop the external note pointer; the surrounding text stands on its own. --- packages/deployment/docs/LocalForkTesting.md | 10 +++++----- packages/deployment/hardhat.config.ts | 7 +++---- packages/deployment/lib/address-book-utils.ts | 8 ++++---- .../payments/collectors/RecurringCollector.todo.md | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/deployment/docs/LocalForkTesting.md b/packages/deployment/docs/LocalForkTesting.md index d6dbcdc09..f7247fba4 100644 --- a/packages/deployment/docs/LocalForkTesting.md +++ b/packages/deployment/docs/LocalForkTesting.md @@ -138,9 +138,9 @@ npx hardhat deploy:reset-fork --network fork - **Foundry**: Install via `curl -L https://foundry.paradigm.xyz | bash && foundryup` -## Local Network (rem-local-network) +## Local Network -The `localNetwork` network targets the Graph local network docker-compose stack (chain ID 1337). +The `localNetwork` network targets a Graph local network at chain ID 1337. Unlike fork mode, contracts are deployed fresh from scratch. ```bash @@ -155,15 +155,15 @@ npx hardhat deploy --tags GIP-0088:upgrade,deploy --network localNetwork - Chain ID 1337 (not 31337) - No `FORK_NETWORK` env var needed -- Address books use `addresses-local-network.json` files (symlinked to mounted config) +- Address books use `addresses-local-network.json` files that the dev environment must provide - Deployer is also governor (direct execution, no governance batch files) - Uses standard test mnemonic (`test test test ... junk`) **Environment:** - RPC: `http://chain:8545` (override with `LOCAL_NETWORK_RPC`) -- Address books are populated by Phase 1 (hardhat-graph-protocol deploys Horizon + SubgraphService) -- Phase 2+ deployment scripts use this package to deploy additional contracts (e.g., issuance) +- Address books must be populated by an upstream step that deploys Horizon + SubgraphService +- This package then deploys contracts on top (e.g., issuance) ## See Also diff --git a/packages/deployment/hardhat.config.ts b/packages/deployment/hardhat.config.ts index 2be1995ba..43256ddca 100644 --- a/packages/deployment/hardhat.config.ts +++ b/packages/deployment/hardhat.config.ts @@ -188,7 +188,7 @@ const config: HardhatUserConfig = { // Chain descriptors for fork execution and local development chainDescriptors: { - // Graph Local Network (rem-local-network, docker-compose stack) + // Graph Local Network (chainId 1337) 1337: { name: 'Graph Local Network', hardforkHistory: { @@ -276,9 +276,8 @@ const config: HardhatUserConfig = { } : undefined, }, - // Graph Local Network (rem-local-network docker-compose stack) - // Contracts deployed fresh with hardhat-graph-protocol (Phase 1) - // Address books use addresses-local-network.json files + // Graph Local Network — chainId 1337, contracts deployed fresh by an + // upstream step that populates addresses-local-network.json files. localNetwork: { type: 'http', url: process.env.LOCAL_NETWORK_RPC || 'http://chain:8545', diff --git a/packages/deployment/lib/address-book-utils.ts b/packages/deployment/lib/address-book-utils.ts index d77987e70..086b5eb34 100644 --- a/packages/deployment/lib/address-book-utils.ts +++ b/packages/deployment/lib/address-book-utils.ts @@ -168,11 +168,11 @@ export function getForkNetwork(networkName?: string): string | null { // ============================================================================ /** - * Check if running against the Graph local network (rem-local-network). + * Check if running against the Graph local network (chainId 1337). * - * The local network uses chainId 1337 and deploys contracts from scratch. - * Address books use addresses-local-network.json files which are symlinked - * to mounted config files in the Docker container (populated by Phase 1). + * The local network deploys contracts from scratch. Address books use + * addresses-local-network.json files that the orchestrating dev environment + * is expected to symlink (or otherwise create) before this code path runs. */ export function isLocalNetworkMode(): boolean { return process.env.HARDHAT_NETWORK === 'localNetwork' diff --git a/packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md b/packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md index 4b05a6737..bbfe4499b 100644 --- a/packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md +++ b/packages/horizon/contracts/payments/collectors/RecurringCollector.todo.md @@ -13,7 +13,7 @@ Code-clarity / micro-bytecode wins. Deployed bytecode is **22,558 / 24,576 bytes ## Offer-keyed terms storage -Architectural restructure considered — defer to next storage-level pass. Split `AgreementData` so identity + terms live in `offers[hash]` (per-version, immutable) and lifecycle lives in `agreements[id]` (per-agreement, mutates). Decode once at store time; all internal reads go through `offers[hash]`. Collapses the three-way dispatch in `_getMaxNextClaimScoped`, folds `_getMaxNextClaim(_a)` into it, removes the double-write in `_validateAndStoreAgreement` / `_offerNew` (agreement-storage terms + `rcaOffers` blob), simplifies `_validateAndStoreUpdate`. Preserves `offers[hash].data` / `offerType` for API compat. See `/sync/notes/tasks/20260421_OfferKeyedTermsStorage.md` for the full sketch and the synthesizing-getter path for keeping `getAgreement(id)`'s return shape stable. Prototype preserved at `archive/indexing-payments-management-unified-terms-storage` (`a9c2737038`) — see "Related archived branches" below. +Architectural restructure considered — defer to next storage-level pass. Split `AgreementData` so identity + terms live in `offers[hash]` (per-version, immutable) and lifecycle lives in `agreements[id]` (per-agreement, mutates). Decode once at store time; all internal reads go through `offers[hash]`. Collapses the three-way dispatch in `_getMaxNextClaimScoped`, folds `_getMaxNextClaim(_a)` into it, removes the double-write in `_validateAndStoreAgreement` / `_offerNew` (agreement-storage terms + `rcaOffers` blob), simplifies `_validateAndStoreUpdate`. Preserves `offers[hash].data` / `offerType` for API compat. A synthesizing getter keeps `getAgreement(id)`'s return shape stable. Prototype preserved at `archive/indexing-payments-management-unified-terms-storage` (`a9c2737038`) — see "Related archived branches" below. ## Related archived branches From 1237b95e8ed4d0173c46a04302f129af7f969d98 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 21:04:51 +0000 Subject: [PATCH 28/29] chore: exclude forge core dumps from docker build context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A forge crash leaves a multi-hundred-MB ELF core file (mode 0600) at `packages//core`. It's already in .gitignore (`**/core`), but without a matching .dockerignore entry BuildKit tries to send it into the build context and fails on the xattr probe — restrictive mode and large size both unhelpful. Anchor the pattern at `packages/*/core` so it matches only the dump file at the package root, not directories named `core` deeper in the tree (notably `packages/toolshed/src/core/`, toolshed's main entry). --- .dockerignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.dockerignore b/.dockerignore index e60b15876..4cef3c944 100644 --- a/.dockerignore +++ b/.dockerignore @@ -19,6 +19,11 @@ packages/*/typechain-types packages/*/coverage packages/*/types +# Forge crash dumps (also gitignored). Match only the per-package `core` file at the +# package root — NOT `**/core`, which would also exclude `packages/toolshed/src/core/` +# and other directories named `core` deeper in the tree. +packages/*/core + # Editor / OS noise .vscode .idea From 67c3428307e14752054f60121ac20f98fa7e6951 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Wed, 13 May 2026 21:04:24 +0000 Subject: [PATCH 29/29] chore: bump publishable package versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Touched-content changes since the previous publish: - @graphprotocol/interfaces 0.7.1-dips.0 → 0.7.2 Removed the duplicate `IRecurringCollector` export from horizon types (kept only the I-prefix-stripped alias). Dropping the -dips prerelease qualifier on the way to a clean publish. - @graphprotocol/issuance 1.0.0 → 1.0.1 Backfilled DirectAllocation_Implementation deployment metadata (txHash + blockNumber) in arbitrumSepolia addresses.json. Mock NatSpec touch is cosmetic. - @graphprotocol/address-book 1.2.0 → 1.2.1 Re-publishes packages/issuance/addresses.json via symlink, so the same content change applies. - @graphprotocol/toolshed 1.2.1-dips.2 → 1.2.2 No published artefact change in this PR (only a test file deletion that was never in the npm bundle); bump drops the -dips qualifier alongside interfaces. --- packages/address-book/package.json | 2 +- packages/interfaces/package.json | 2 +- packages/issuance/package.json | 2 +- packages/toolshed/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/address-book/package.json b/packages/address-book/package.json index 329309a01..f0e85dbd0 100644 --- a/packages/address-book/package.json +++ b/packages/address-book/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/address-book", - "version": "1.2.0", + "version": "1.2.1", "publishConfig": { "access": "public" }, diff --git a/packages/interfaces/package.json b/packages/interfaces/package.json index a25e678a1..17d2d8994 100644 --- a/packages/interfaces/package.json +++ b/packages/interfaces/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/interfaces", - "version": "0.7.1-dips.0", + "version": "0.7.2", "publishConfig": { "access": "public" }, diff --git a/packages/issuance/package.json b/packages/issuance/package.json index 2030a0006..535b53d85 100644 --- a/packages/issuance/package.json +++ b/packages/issuance/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/issuance", - "version": "1.0.0", + "version": "1.0.1", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/toolshed/package.json b/packages/toolshed/package.json index 375bb36ff..430fa8144 100644 --- a/packages/toolshed/package.json +++ b/packages/toolshed/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/toolshed", - "version": "1.2.1-dips.2", + "version": "1.2.2", "publishConfig": { "access": "public" },

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

^GBW(MaW45$Wtps}g(~JnZo-p{ z;iq}yoHF@QURf^CVql9|21Kt|Y77YRbrz4t$TEqo&Fvf0R(IRxO!a73!Xl0`cZ7Sw ze&AgyoynlTH%|OY;9y&#Ix)1jx%==?G#JF=w3H%2pGX(R;&FFPhtJ<#>xtIFIBXAi z=Yv4s16Uk8j&hRXz$?0a-loymf(!VDtO>K}PO8$b6)@D%YI2 zBt>!T3ev!()}7?RHB=m^IfdIuaGg8y0PmhN%O2v*M@q|dLH#aY+p1Lc%V=081WPr) zh=W#L;eKtTy*ijldgOAc+8eE|cR%z{sBeE~H*kb*r@A_QHGUmIVOC41rNXFSl{%~4 zqE^c22OjF4TT>D4p03k$_nX2sPH5Bp#CPy#7&}&ntw-a~S}mqFF5u%?O-0ZveYonN z_YvbG6*Kn3>KQbCkryV8ypeofm~f!4l0M8=9jx#^!dDoIhi#K8wf-0el{*4>j11#D&5)p z>*m}W@D2B8-MAYT%#|u~?yIm&bSgh5$Ov%G^RG-t((gI2Bzx*v=W)YyH!GyS<;ZO+P&-R-j) zE#B4*DSN_jPNDcpW4$e6Q#IDuqc&B%HgUVp+}{~(^s&@WEk<3`9M2`KDy7`SY0U&f z7=jJna7T^97_4=N+nlO|)z@S)rlW~m%Er*$ef#Ax?lENwmwS!dl2dJEj2Q%wl#;*rYxco%0?r9i|T#6SLFh%gKN6~IV zc6wPr9#ZE@+1SJh04DT0(BafK_;L|i=zW-CFBG4wY8*)#iC>kZwISD&h!q|x?w9vJ z6=8qtSQ=QWtw2u+`Yn`+ofV|li2nq<90pzy78kM3Tew;DUO!)2;Rhy2ThH;9Ecyz( zj`bxd7rINHy}m5-^UpMEH58xNU}b5Qw<_-O#;ZI_&rFyZDMJw8&-n_cGg9GlV#MN) z@W0|p@QhwyP5VV3AOFeeh!TU{hzWT9)^kC}to~8@Dri5^b3QLTXs~htB4a+7b)^$Z zG}Y9)JHiZW)fsH8Bw6ciFR8i3=QAazt9#d(ZK*`U+_2>EtD^gkA<%vMzwR9tUru1E@<} zn^lkB3D+wFC{rf4Jj~AdJ}h_(WoxstmWKgorhOkSx(Dx^u2)Aq9vM268=CF)h6awV z={wjP_#hi-iC46Q^>Djp9r@Re+0j^N;6P8u%t&RV|3GiJr`Bn&>8Y&fu5nDmr{(d# z5g!9j3%#6e!YF=~9FpIFyc|7dfG&=_D&eAN+bnmqO;qI_M1$~{KxuK{`=g=1}(r^_k z2H>bXR8PR7>Z-)he&p*!YrYbTLth7Y1>pU!6WxGoTDt!VAdMBM3-q%#$=DroQx%^3X&R}#1$ zeVGdK>S%k+tYBHC$)M6HX->;}Lw1kJ6wcO$nxjUUQY8o9Xq2>yQ$?&!pV=5dD`)!v zy`G{U$C83ibO!UeLXhj6j#ap3LXTJ!kLYHik4gj^bpe$`c>axV`~dm*2G@)(^ayX! zWp#>2c-@R7`l#sQqePoxoi^m&t@M7Dc}URNhsW@z7`f5uVYjSZqfjW6gN*3=-VOE? zce^XBL55;zg5->50D7oR0BS&$zteaSdOshar8Gr>KOaE8(eJC1ETzyQnf?ZGg4P3! zCalmb^9kzgfW3*vCnF=XrdjvXB^ST6Jb|$Mm3V^E{dAdgUxG8sefzQ?lW|#$i8x{L zX-z7+YG;ysWoyOnusuixj(>k~5z~T?anE2+GS8zSYy4h~a#3AH0)`coBGa zdMqTaTc-5@;Csis&Li~zWHFglNZcNe$~vn$jLiyNByLGq&CqKvty@<5Ug#jj5EDMNzys3cw_{}sGP2X+mbC*$^18xskA47^NM;n8cG z^ioMni#`KKA~h0y-E5*oPujw>w!_6Y6P9%?En$Y1Ei0~J2G=t~JY0EQ`TDLaUpjR8 z_b>ZMo&X{#A*m-wsm^1yc?>e*AWrNgWqP=$my@5ONQuU(H`z53;#z{Z3YTyegTbO^ z$Quaa5H8gSWKyu|GBWK{DhnT7BAS|0l!&HO;*SdgAY}?u3ULo=Zy2DZb%2Hm?680? zy!bq3#{8hSmc`BB2Qw*@3-~?rMnys)U%<};-_Y$-L}q;o+A*ssfha`AZq0@1Y$g%XOC-cFjdO0R*{PEf*L;AK0c3A=bIcb%&ETxt zYH?_!HWe(sD^DmN|Qcb@ea-7=$o0lzz|lpF1{1{pgmJ49Y30>|ac`3Y8D zUUrtb6nYRB|E;elmm)7^E4Hm6qZK9xi&KNIN^rH)Y6gA_b&|M^U^EW1*~#KG!KxIL zR3$$}7+JlNA|y&h;V6NBP$CB^rObbs$|1YfudOa*g9Pl5VbLznl=3T&loK?s? znnx`&tnVZAA<$7h2mUWx$SkY&STv9F;0)UL5gwca%HS~0N_OEc7Ko-?lK(G-8X?@xoJP*R{&%ztsFc;KBu0Z-&a#{WAF$fgU|(yp=F zg1<^n1E?Fp0w@EM4%h}cSa$7auq^30I*>*CaA4tQFO>s0GFX~Yx*Ve8UjbgM!C==) zG`Q5@v)gXc9~k7tbvM}D&=Yq9Iz7AiSNwzI zLuj^EQdl!pzd#&2FL(MZ12hYy@IvMSN+p6Mg2%Ef5=C%$6+cU}l0F}V9CU{v2g7d2 z!Ik@@+g%B{SLyb~;5K$K>=6zCc3PE6YYb545%81;0c8|eM0iGKVez?hN_-GV^8f}P zF#2^!CRvsoKo2J_&Rr7agNfGWIQ%`(lZbbLUuZ)r$fNjS`WirQn@H~-(3VKfXl#-})D(0Aqm4O@U z(b`q6#Tw!a^@I1&{&S=Pv~PB6C=&l8Ft>JaFAYh59xkZLKukP@mR1GY2ixz$=ZQGc zf`Oh=SOZC-$Ws^$d_Y3ZQ;IwfS1l|>G6asG5N%wmDNJj@Km1ct74W?N9&);ZK_{cJ z0y=dOouJ(dgoHc<5a@jv4lGWdB8U^T8ZMzxE))%*(pk~fZI=9?tT=Z)4iS1 zX|+1?>oOL2w{=0EFBtI2G`7XX#lH{}p!L@QUyfirc&}RvpTYl!z8muiT9Gx7Fxi2G zlWRy6(k2Zq#jRKdrfH&-65DCGZ_c2sN(MNhT2pBu(>RH`5`n<@A2v^I-bmwWhed1E zDapFg2D>Xgn!*7*G@9%jL2vtZVd9k^7AC)=)F@~Gedt}^`_a$l=3f2r_jgkaLo#yI z16~K7@HgNIJy?fe-L*nSlvbQ80Jmr1lWO5YfG`;Yv&w}hjwZ!Nh6lt)hEiV4nW)p& z)(|CZV$|Zlu{Vs=kxHFaYjvn_deijuG(~WBlfkZ$61$HQmbst(=zF_pDMQc-jq=~{ z&;0Ne{4?K{adPmq40WL}1fF+&;j2U^eFHWmteu)wWipO$>2%VXp9cGWDg|6j2upmo zpy-h(!;!wd*WefSV{vrjka?UW0;*bk@{# zMmV{_W2%s;WmI92GpVE$9$k0CzLz@JW*G`BUx^>O>;+ z;0rwXz8z4fopb(_=T@T*;HaS(<0)F@dQ^u4(g~0YWeSwO5(o7leGqwe!tSD?!Kcf|XOWOeND;b?xhuI!H^{M-%m&Q7yr#)bREk zq6R@qRU$RCRe&0OM|R{C^2(0!zOPQK6R4r(OlnDyrd@FhEoD)qfLj(>`~_+rXk?WT z<>2s7Vhm;le*umn$kRX}F_<>}#w)L()!|QpeZj;P^-;g7K7M_mZ=jb_In7#&PC-_- z$BgE9dj$cU5(B`g6!oD`7e4#cslq@1lUyUGA*NpYg{RJJnwo$5pV!hrTxdD0_;ww5 zx@XYSB?WDC;U73{V6kTjEvCh2u)|vA=<&eAal-R~1Lnj#D4&zWpD|UoR}u;>Fc(f0 zPWAQX1}Ktsn1Ej;B`VtEX8g5HXP){3co?95;2EF5*PnU{AOEyWEvHEeJnla~Jr6AE zt&0?}Xuky(?gTak_OAo`zd`%gqy6=ZHlUwB1N%3j{i9%iC)&Rm^;91x9wRr9(be71q7^UTNdp@ynG?K`u&z4F&c=Q8P25Dnpwsq*TVv%&B*&LoxcWNaGpn3bf$%BR-J?Fj{n26-K9i_;>2;CXpf3GTd>ro zR>0mtT{O7% z<|*&+hK-eaw^=FSTo$8CFVlIdow1IDOD@+cfF3E`R((}=UAkgw@8OQj+?Ih_2OeTw zF<0;QW}6}2U0vIoFdp%B?&^rF>B-t^c5j&oBs(J7!fW`t`t4I2D(l7vx_qs38&bjU z?JZ5)Hf>BsCMGw8ZC!)I5x*RCD};nqSsM7=(_w#=Q%Ok87K@XWOVz&SxVJH4GDcd5 zwvmLbp`|+->B?sPj@pRX7Hhs3u34Y)X&ez#Z0okIad#$@C2tk^M=eq}V*S`=Yz{kA ztYOi<=KxK~TUtge_Bd5H@KvH7lVf_qh^@ye@O)P8malia*UQPeEek|rR*wY&E$w^a z_5&7rMB20QFYKWmI~Q=(>7KpS3wZ6Rmc7DEqn9DS0sml}7ELhV(9~0nDV@@Yl3-lc z61(v)JZP&2Ha5@q>}`R~o#tEiiZhL#j|vT5Miz`lQ>j-+vcO1Sm_rZ+YDpA`RYjpr zl!WU{^%L#(sFO`>ylHIoXrJHNeP~_#hc`L>w8mjJx%ASy*w|JbfG`YBP)ff^7ipR3 z3~t_csA21a+mg5s`lX#4sc zy`|pL&JR}j+s137Lj!}6-dnpvd+U7wJkx|!t#ppvlWD2OWoEO^!pUR`nX^9Ot_kR? z*Bv2lRQX~JUQa_+%xFz`^~P}B#q*W9I%hH*9_$|s+mhAQ#J5DAOBR?#!0lVGhp|Vn zH-y>cyKXqPfm*wFZU5Em;RPabe(M9Yyp`&|_gNx}?FIHIdgj*2tw1H;$|~8ddv9gg zTla3I`fbnRuVXQ+2A5{d`h)bY2grlRTIDxT8$#e`@~%G}d}QS6f5BzgB-Vy2fti4q z1PTHiQ-RDgr8yyRFU(p3(vTKq0)EsK1>=;yW&zy7!RrrZSKj2{U4P=iZ6>c?z-4Fn z$+c|@xbhUgR)988MwaenH_9no6H$oG!y``y(Y$M&vm_EdCFr?P$F zjrZ@KynZxraW*n^xNrDlJuTN9-WT_`#;o{%>MA;_YjZJuV=6V(6MgF=l&5EAyw8{1 zv2`L?d&fWh>&!pl_){BG<5%7Op|1X2Z9bVqqt&RT`t-!nuC330_TD{>Gv6(|{MGAU zefF`|ss@IkDWyrPvub3p^wD5PZ_XHL8QRv+ws%9XYu(4&T90mQhz;(zsD{QSS{a$z zv8UFYZ0aO#cBd<>u2j~YJl5?#*+aM_zMbu>%&>)iKV(WKKrtdOaRx{kcYgH|;se$Nk2g5MPl^PpwW^mP9p_-QCh zWs(G2k48b`OBt4>Zbc9tU{C7B2rJ1z0is0XvdVI{ek4Q;O5`sJBa*p#oVi95Y@NJ% zFw$KYkc9hlU7l!r%5Rpd-3?=h2HZ_`Nvnpk2LYa-i3zT%BhsD(AUkpBYxiBXaLERw&b3Z(8$g;o_%r3RlC#^3#IHY8bNi#8`0(vJ8;9=u z_vf;mk+#wGBd)$-jV~P{N1;R%E;9GiK5QD>hHc0G9bukrJ>An=um${hR@J>V*SmJh zma%597cMgR@28uqdY{E#!p1NSej)3s+V&rtdwR^=1U|7N^k;{|yaxMo+Ya+zqdVk( zuHU{51LDD<|FA}No_l@@a4`+TtUrGZMKoaHaZ3V4I1)few4#{wZ2J!$wu?>Ra&lsa zBlKq;w%yi-{h4pu5jFpnkM5|K|CxukFasgs#Q&)LEDTh_+XzcQpdto@Xl|(0q+rSJ z2&4X<62ccpT1*lj>A~rE-9VKwd+T@azx~_yPt_Yusj=&x*xz+@A`STr{2GR9-THx! zuNMCPM6aX!>a%Zs<_R1>H67V_|2|*XD5Wxm+cG4h@mQT66+z=6Qe}>~{ZXruJWkw) zhu`{FT-mzqSnJLI@z8L`kw?F9etqAaS8weKa5_$+HfvN`wMwDaskeRUk009g;}_4~ zIW+O5!o|;yf9dWGltd+e{Bw+)p%|r(CGw!-0+vfH+g!Mg>;wJ*ws;ND`A30&@KJ0( zz_|X!H_0E;dTauC3)iB4$T2*+zNPmUleNrbjb!65oD~}9B>3@njQZD^)`_tcI5#l` zmva#}8I&jsubk}t1&=OuZu|wm;#zar#Zh!EtUO-C%|24dl!c#)19zU%r_w}4T`|b2 zD`xR{#7}UL-$;X9@J2F~w$Hl3OcqhO-0T1Ng5Mh1V+xnzftEa4&++P)cu$ zT+8Zo>>UwYqH&tcc9yEZjUimhIn5@An#RM2S>44`VcbwbUZpX!lES>xi?*MKQ%cbE zlJ(`E9q?NzKHzlwoOqi=SR;}te6{?uYfE7sAAo*_1MuK~sUS846zPYM2j{FK!);X7 zwt#=|N4)Kh_m1^mVHSrttUQ2lCn+-w;gYp2W|;Bz+Cp9*Bn{W4j*z4JWAKI6d+!Yfxn!20!kmo$fulJ(pu4o+!>-P89q9@;`{fu;JmhU-77A>&UP8 z6-{4(!%UIE;6rg>w%$|vRN`v!L%on4D3N%IhFnr)@BeDqliph)#~ya!j0Un+%izw! zZ@?bs5cXWRv05$ri1#jd+DDw8gvkyV?!qk&!j&*NI10Dl!fG#m#EV-!#LvCOxNKJ4N3`3!ho%!W^|^jeS4?3a_riH z>y)gFqNS{2wta7J$XYvG+qA7O33_1(MNm>h)4Bth$vY-v?$(WsnS*1A6C-!;X*RlC z3YEcW)LB@@6Lfo9*Qe^nGhPX2H2}Ac@nt6JBE5AkU&KdqHY01)sPzG#DZch-cgx<< z1|>l!M-Kw6_b$q*B(U2RSX|7di+i{Qf|(Cd6c$?`=<~)X=h+yyg%)trS#C| zrB`4HaUhN`Lzm>6k_-fdc1*GBuXhwOO=vWU>B)(+3g(J zCWE0ODJy&X9v>NayC780!pMD;8)zUeNLW4o!?WRJIH|NP5Iv_crF#L#&NMdCbqjdY z>B>ptl2D0LYRVGLPBp@_&+_2(N_hS}UpYw|%Y~>ok0!8s9jekiIgJ=5g1w4IOxP#) zb$#HAyVJWyYV~p&7Lp3I@9fL$ABuVVuUYR(g#0?Y+2tUdGPQ!%>k7@DoPXw1dsAok ze|n~YHJJ4w4+ngEv)$zG+}oR(YITw{WepIV+bz}Eb^dVSA&RWqdI#*ePb}uipU`eB ziFISUk@bwUED)XZN~=|wS|Ga4W6JnqLj&yxuX|cI(Y}Biiao#*QHt}7WDP)}z{xsz z_B^kfpyByTT|#MUQHdl}YQ?e~k`?6|i)AiUz< zJ1(qK%=#eqoM9M~W`XECgPCZ}0^WSaI;q%#RZh;t;1?nzjXnc4GEkC+$Y!B zwV?o`wL_nHJK*T|X%FbfYq2hDzmS6vCoGsA3lo;C+{yY-zKXo=S)vnk@L8fWtCXjj z=;%euM90MvbA=Q;!Cy_Mi&;i2IMEWl$Xh1pj*DfCO|R(gFCA1RQARh4@zmAnYLK@p zOduq`-*V{5ecL}V*Af{#(A_+h^;GYCbl0|fr{bQr>8769{_sx@@7sUamfp~^^I+81 zwYw{`CF8pN*6VM>2iDy@8HoYJ_1Lk`&qjtjt95eV7)fQ}*0I{H_e{nJYumv3sskq{LpA)9hp+wQw(wKlj;-0Y z>1Mm7abx?y2k{rjzVL~Ab~Vd6oz7u{vjcz+)_>y3O{~MHYTR|t$oj{w?w_V8Z3t>W&fC){jVnS096Pn%=CM3UE&42O4ji1{Q zsXFk*6E}QrXXI&f%ifW`J#7wiGuk={EiYoi11~^K_^lJ;kIZBm_dPf+Zh^*r38=y+ zs0irSMg)zG5Y{ZKacUIc2Q%xmzKs!}nffBa`Wb+S#X@ZG70&ClS#Syi&shRg)}LKi z38qq>Rp273IYoYgk*g#ZH%XKVh5;QCu3m;6wPvl^tz}-9s%3O1tl9@UZ=KevkrBT` zAkw5UYZT0LMG*P+ahb*nZP6j{W{&}`Gz!`O5J~Pom+*lftagF8c3xpjFo68&GZmY- z+A<6&s&pBE1SeL&GtctiRHk+rbSz(?eK~Fnmcblq1#Enb2A1k#t=hm!NI9#-&3%*A z+}7Bpq`bGF|&2J+dnwz4tt~;yUyw{`hAvg zKi^)zbDszoacnn0iw^)Aj2F>jHPM$y>$Xw9CKGL@~DC39sT9dV%_@$ix0FO`TYL2x$#C;%8+W6tafas zvwcUWH#&Ch;4wfi38PTU<`7h@8L4gDI*^njM~{}M8`mE0n7m^nfQpk%9W%qRTgLC( zU2kwYS+(9_@Y`HLm$!9Ys%~NlD0;IK^^shi%L{-aYcpz0TBX|Ww=DrhNzKT9Xbaq+ z2mDVFDNZjTMU#jW@jnBkDEDj(+2T<1DTx0-Uzl1ID5CRVrDD@rUN{qUjH&mG6UqP7 zYafv6Jg_*E?Ba_sdID>5;(1E%j=4NlF7^S=SokDfXvV*>0w+36dZ*Q_A_pW&RGUQl z_MIi1xD)gT4r3SMvkv< z84n`R*aE#Yy|&=+^;XS1Ig>uU=kb|Ft;MWTX{;KpO(V59Ew1)GeXW}_F6DC2NE5YN z?*g*0AM^`f0hqA{%V95wYr!l&mo>4(;Fdl-dNhOY%HSOtye5PDGk9i!=*a4ocDwSr zT6|wE-d~G1*5c7x99XN4bF&!k21JL2cvxY%h4Y{ptV)S17Z%^l%E6AZaj~k34hjIY z^AZ3Woq9PMotk~yOG z|Ma>~T)P~UvRZ|T)u|CI)u;z<_?!q!@7&V3x!n(8>5X678><@G35d2G=;TvCQXR`t zsR5wU-DfZZt%a!6yecX+YY{3nUlEm-QrO6+5Gak)tjTZn1~mkOzkcySoen_KKV1fr zhW$YVNJ(rINXs(_kJe*7xLD7p4i*{H-~)BA+89h0t6dO})E1A_6pz#tkDyZMnx&HH zy)eHF3SBQ=RXnGvSiY?M2wDcEY5|~Mi$099=)$Ntn)ulbz6~!B=ByQBV?b_L*dP9Z zD7gWh(*P@G865av1G-Q=2rq1ShUmbs#h1@Ov0W15=g#QGEhlb;RYjhghY4}*ur`q# zw$WY%8f`B=bbIlk+r@`&hsvXo!wNm}+7>znAbQs_h%VM#ds!&*RaPe(ZMd?k`cNOR zsQ3>6dC;6ChJbw6dj;~vX;7CU`DdEvp4`9V;|CkV{Rg|6HvuHS9U=KjSOBGGra$x} zN5fbxKLfCQ^G?3P+qJthv$@4}>n%6jj1R26c`{xxdd;AS8SHYI<$2 z8)5m)6`fTUh~}Hqu9_1UKNat9Yw@^R5t@h5fKgz*pG0WBQy6Jmj^;b&1JHZ}TacAi zWC0$KRFp&dGUL4j>!IzgK$j?acNSs*aM5yPUuL;i1^3G)4^o#v-Y4}{BgZ}m(0zMC zF9rBeDzC_lRByd|yppIrxrKjlB9z?s#G#Q7Y|4f-PkGz7WZE`0*)71u4fb`k;4iNI zX93^q^&UL{kWx;|_Fex^n_N{*yYCrY|Iw?ufm?OgeK8l0O8fA=)IRBd^JG$yCA|>1ADsn-6Q;0(}zAkbKui_ZR70c zXW{ls;ht@cojW_cp`L9`a7&nPeCfV{wp+e)&y6qLJCMEQ#gj)qwk6!S@8L~g8)@42 zFkEJ1@lE_yDuj8k#?q*-?u-YG`nH|1@1$Xv;NlC=>_IM`R>DEwws{_X18v?5ml^Xd z&T_|JmFwMRlgl9e6=zV=Bqf*rU7<7Cv}Tt^VwMVN)>3lIjdDWeFlkI0CG}B>OqdP? zo^KPt=}{_)HDfbHoW6Bw#P_D+h;Plgl#z+=g2TPFr&Ll2vSMz^0jmP7)x5Y<|gZvh)%+a3BegD9IOC zXG4I5v_HwRA=&*Pg@kxRu>75S-<#1$mJRHe-T!}oe{r$qzWZ)H=iGD7z4yF(>hfgh zVlhf2WlMX8ONOrQ&#~3dZ+n3JnT~B?Z9174bVj4gYF53}G`+Pe%Ttwav3qP1)?rW? zSe4f0H0F1XRYb?;Zrbz@L3Cdi(3>CY?boOD_VSDL_E^l6Qr!OnO8Xl~=N>oxg{Q#F zYwR(rptAo3sq1fGb$y&M{Ut@7D|L19|5{h~S0?WpF5B5&r~$FBR48&AcGOgEsdjNq ziI!QkuoKBu(qwc~okySB5H8-_T!1clM*!890YG~WZpd+!bQM(ZZt#)0Z3p@bv}PN+ z8r#5GK@GEo8?tkoLsqfcYCz}nwn%dhSC(V3d2Ec@s@E8`Dvirw@HURr7Hw=Skkd?V z!xos;feY``$3#9*P$R;wZX`={hP-ep$S_3s4Eaz@V+z_M=R^frTCF@QE}z6742N|U zNMB!}tjDyVsYlKwGqPGzc|l=M9gAIFTX#`dT|cJNd`@C;o6udVOZl)oWYD^nyh&_u z=eax~m+EuK&Ufka)Y84=9TR;H5RDEBFr!3!HT}(hTSputvA}Ty>6}9V6%~L zNwF2UQns{TWwtqW+wUALA%`{{+a6Z12DyT@>5<7YYhtX-4Bygi5kc&xvpBKcTA+^tIi0KJs>6@XDo^iWlzH|EV*q;TK zFSt`*wbg45mA;u2vg>{4lKOEb_UE(|5XyY$&ECKY#d@-6^p5TA`v)q$S~jmGamOxK zePy0jN{QuCc~)UVZqIb9mok<$b_6#c?GHXYJmIXViW*&I8=}#kA`3a#b;GW*th%i; zH+Hn%e%;JKM554Wtrqk-uUsjw96r*dG_mq<|9s!}2^nirj~?6L@l^F7ItpKSk5;eL zsOtrdx&~>~EO6YDmNCWT8X7fv2O2ecxt2y9U8zy4(PjEe3nI12Yt0I>4Ec}e&#|md zOWlb+zMy}ib6CyF_a9T>PhPYNIuY>s&{+=J;q3%mCIFX6qwXXY_#NH|Md2M@Dr1MY z{29s!!n}bpfeu;TP*W1g7BhLTTE|;o6_A^{5@Gc=uOXG&n)hnbI?lAdn#S#_ixDop z*UL-%OchbUZ=!Va-jR_{jzrwCUG<<2S_`({vTN%NoANBtfvOlxf){s>6?H_+hDdMK z$R^HOwzZ*QVfEcpm}B-LNXv zpCYtcq7KapU5?Rct9&=q@TSiv360y%Nmg@>jO||&{)3d1qB!>R@ByQ)9V3wL!I5Oo=3NMi!{(j&$zp@KdJphIap!YX*Xm-FNP8 znI5S2vk$o{`ii36QR_(DRZ|_MD(XIV{lexFrBIdF?ka5h}n138dipxKzjGL z_>#N7`HV~Sv3-g#;Vgby%+1PrNw6@Iyu@f67K77bQc@!dmKTNR6CBlf{#CRG3^KnU zQ|4EJ%+HPHMv=@f=Vg8+mieLDH#{CDG-i4CgJgcFl9&0O+BcH82xEEoL(BZN&UCTR z7xw20s`lMCT)nF$SAj0U6oJt9RBx-V+|l53HH^2p3v;|k>{}@0s}wtaUD|GI%HDbB zt_V3ebZlE#Z7|4`tj(Y?sU!vvXVDGi;g*P1B%)0mc?QHjCQjLb+F-A z9*?B_&HQo8o03do|K%$c0;PKzeua;4%im1qk4r3XrUdwhKfD#KKD@2f<}~lUYb2+= zDxj57Vg)h?>@3_c+vX(=(YlV@T}QjK3U=H++%Yp)=21Ur2Y8kD6dLv6&hnONs-oeR z>*j}wWNNL->NHq2Kqacm;cJ?a5*r$vYiYk0&x7e33P(Y5`>T7h3)+hv-jq!rlZDhm zqJyU$BNYZRaZ}+Fgxq$9l%LQH_~7R_GbG6G#b5IFEgJOpR8lj5EI;HYl91t2`#Z*q z&HCz&eC_J1P9G?*Ir7z`SHtg#+}`<)%~y0}<@C*UZn~l~i@NsiKRvo@=%I6efA6^` zb`3pz?hDF0U%0la`=+n$7k*QAeT;csHjr<93W?o!Z7msy9+`CxrTBDZcSYd(N%EpcUPZ)e-`-p(~oDcJG~etRc` zw|556_D=S3@nGim&g%2nr}#o>lP4r>@(kcjp6nAzD4Ds*v)19P{zDk`q0`y&lu_S% zn-gWM16ECyyW7HY7&AkOWo+fpRPD~&c7#l=H|#r0h0y_Rht8pwNwhAL!DTk9Ncr|p zUNMrF*InuH1hb^9)2KGHYOUXAE7^Xyx%R3%AK(8&nNILNNgo0zWt`GRFWT+dnsG|2 zz^Al-M7uTvCU_Lc^246eD)>{{KjLkl0dz{MNE7bgdgtd*#r{Y3*UxOKV5JPLQY)f; zQ!OcjzC)=~+Uc}G-*88-M!kLPb2Zf zHkToLK2J^-x@=2j)@gKEK6`j@zO^Q?p+Z41MT5LO-+LkvW5D{~__F?|O6h-pJ!!%x zv;b&9uj`j@yrc?vl0T(Y#1zSl+-qrp86I{nY1Jn(=w6T-@M*2|{F`a3z84rnR>ycI8Hu3@T+HCjI>qt(D(7hp9$Rt|tcGy|!U8zdO8}|J;i~8aDPJznyFlx{P z52W^f7SnoQQF`wuKPC&+{t+p48!RhH>k_IUE~5lh@Q+v(+S6zbAAi5@*}^v_lwgNTC-W9)H@7Xt5#}uSUin;I%;>; zxJB5|Pm{&Tbok8n9*QE#l97+YT0yY%qr~)cgy3a`J_2yd(1JD!T2Kknf?y3)aMHFx zv2hJ82)zR>2)+E9*tCfjbxylg{nzg)wdk@Bbbu(+JM@77IzoiL3pQ=g_iqpcw%K}% zJ_DQu*=%j(zY0gkI)BQKy@O=;0H8{CT(T0wNV@CrG5nvBp4dBB$Pb`n9NCGaWG$rr zH`-`XPY*o$g+z*=XI;k8QNR_{QAPFY`89)x(XxWg9Jk zgr3MF6&MoMRW8r{DVOI3$d!yAotGAn8P3d2$eB6v8f8GonFb4rJwp|s1wQZOlM{|x zIl%)pC%BG+-`}9SaD3>NajGCDlXHNO7(pW^;V~JM2+Mor6oI`O!INCeACW$XPxT2o zAuq_c^E!w>LkB_rSMd2Ia=W7a<&I2m^!N}n!*9AhrKI>jNJ#-?i86E)5&fO;zAs;U z_<`}fNb<|qTnWElR@?KcyCWO-)Rtoj>m2@lbojml z8_TSHw|+JGi5IV_^fm6BJw~ML%|KTPkxGmOpU*}5oTSe|dhMjoM*6HIa=BtAb1-&v z$O}yb!9s-)5+Ml$d?H8itC}N#JV)@>l_P*WM{skKa|SdawabDESrq86f)&o5;TNAp zv%=YPM*4H83hbat1|`10k}TQ^sXOWI&(WSCB`Ng;?S=?Wqt50n<`w?|N53T;ATN6_ z+L78SsXLv7D#WOcWld$R&62;lsT}><-E!VkPKy*Yk%&ZJCjIpeWGW|E%3&?-1>tU! zQZmm)<~WhRsMwj5$x4hgq1j-^8UIhQK55`^hIli+Y6Owr-fpqmZ~j#t9YgF#_6+E@#U4i zY>!muGHOg(wbAFbV5RTMJD!-uN*~^rd7J(u()!3&Uao8fKsykiw~~cY0A(R!JB1k9 zg$UY(AaG)Gq!#vA^kjDo`8^9jmH=|HmDUuc+LVuRT+)t8+J)%=YGlD_?B)p>5S>EY zMJ{gl;_`PhAy*$Ep~14^&0sX(3Dx-Xh~8D5Kap6!!1+O4{}U>!uLF>S>B) zq3fcnNCo{-Rn=vGZ2zy=6jEZTzH;MqEYqftoZWKAc$v}ZR%4?=2j>TEbz@Q4=2(Wd zx}_`|eSMORjSA5Ryn3LN(BOigtx8JzkgY}pG?15hZI#5glf){KQ?~*#m{0nGq%T1F z9b~{xdNKR-TS&i|44BA(kqj6}P$Pgyd<^Lmk$H9!^HLqpOAAaEh?o$IH3?*ZexCyD zn;fB#_RNL%V@}ASMbjSL*8+c#PdFq5wdlGn?K2ch1PKw(Nkt&Q(6kp}=W*~_B#MMD zuSN?##PS5M*XTR%v-o#;=CAtiZ>wz6FC)`P1Miyo{J$%;DhAybN&bM*yYgLGg)Z$U zS>w{*^UC&2R$%G(Dc6Z4s2(nh9-ZmaI&_s10~+`H-}X}fcD|Cgj(nTG2eigo;(eZ{ z2Fu7`Dbh0nH0G&K@+`GX;G1R0qDcYMs_bciX*M7!8&b2;9L!et7EKo&EuxE@2oX+% z2q&K0PBgilPgBJN0ksHP!)at#71KlPDP$_eoAH2#o?rPV&O;(|%2kT}4qoreBeg#i zX6NFLSNMs_qXFR|ZJC)LW0RiBKP3qd%u`(3MG8N}#xq2p6C!gNG6#F6 z%ngtMIoX7m6^B651R_zDl7`O1g=9rxdtsuG&MPEAEW(KX%G`(E9?3U=|Ox{XU7H@eQ>hldUWbvlRuIVrS z5EgHpw^C0JKKl7vCaV-$oz87D+0=|ir$OJdxFc2Lw+>un?^aSZ(&R5dxN4&osh=>v zrX(T;G{etAikEtkTwwkcQp7?^C-o9Ff%8a&lzJ$&1*b@b6hHMMb((n{Qe;9(Gvpa$ zegY|SA!Qq++=ojkgp?vEwHxPArrTPi?!|djLP`^)+<;TmLdphO4fV7_ibhD;L?59J ziC%*gR!G@Rb&#Xt8A#CyDVrf>J5JG~6ueH%p?*SjVN1WXkBgJo$HfWcBQaff$2tPux+v)ejS0fNqp!1g$TJowWq%7{tA&r zK7I;s{+=QACmmNXR|;Qs^BcgzSKazkN&G7PRX1}v3%>=a&W^6Gm)xz^$^iGa&6W2Qc$+s)HpQ_owtAqNEil5Kl)YX7`Gc6MrQO$3 z?rUlBmD6hL8S;-Y8=>yVjhSq1xlerG^$Qo}axszT>kpZ}ArKT6#(5QM*z4IlT)9sq z376JInP@0hA9+4me~2-CBTaCE+^vYL@oi1%YBjht!}2Pv1B;OgOl`^Qoofkqm2qen zR<0CtMU6RK{g%SENSjoSHX7xU=7G)CHNLvSELe6@G^5O~Y75lvsB!jmXE#S3#`4Y8 zoRVcF3XNH3a_9_fb(u5FX~k+-2^o~)hN@7h-mJGcRXUYSX*Q@G(bl}SF)c+q3u72g~r?DCha`Gv$1kxlR zM6)^avrBj{q#3AYkg5Y6aeL|unrl7%Ve{sFgDWYm8w~}9G20b14uMFwZ>DL%|+a5sm?@pn+;O6 zS?%ObQKY+SBhmx50SxYgnG+&n{7(GwVA&b+%ctZPi#&XWd?IEh;w-Ql-*lWQ{6DDwX)_Hx(M3zSx!;Pl;D=F*I*2HJkj!Kp90a2X+HxxOtCp==S_~ zc>6l?PoV1D*yw#UX*@(%KANP{cujo{$8V;uI(|2qGLPR^oW4`{e*X4`y`9-xHv7v0 z22ayOQ`2ajtE+wEj)!aOVzrvABLBQqAFRptmw2@8-CgbE-hIf8W$S1Tn-eb2%I_?3 z*$SI;>xO+f!(?M9KaykeaxQK8($}m(uSc)vd_i-xFpMa@37~ZYKnrQSW2rALfYOl- zT@^%Prl2O~j!_q4WbASDA@y_lhb+%ZRuX!K6`kG_dz}A>`nhEOA&KSLq~szx7p>Y3 zS-mqKqBEUt-Jo<^I@Ek&IPIz4e=l%XYWsl#hPAvVLp1 z)f6mtWJSGtGd`7?qwXUg1sdY-q;ZJOkk`j#2BpJdctQ#)V7U0~`Lo5T8}4Irhec_4 zA}Ni*D@(Z8b~f*9@iHIhT`e#B=HZ<)!5`{AR`H@UE6eqwLZepvlPfFB`Jz&Lr_=V5 zT%nM^WOLe_-$PDHzvl!@ZMyIVb%?AXRD_*~^0%xKYKc+)xJdVyg$Td>L*T&0_+HqU zLL`4YDY95}k0mYW<~r@SFS^;>#IAUv4gtf|D>Nz<`L;@(87C!9o6Tu;I+xx<5t|*I z4ewrhf*hq@P2F3JZdE>lZ&khq-KtDJa?&+qFJO=WoC6&B~3kb;Jxdv|LY;N<3WiSQSFgyuWxF) z;o75h6uS0Is({{YhTd(*y^E%9RX&1mRR$)2ZdJbKq{b%ayN9k-#@g};l*0GVzkIK9 z6x|9Q4P@S{yj|xl@z64jNo}$y=&Fi}DvDBC^sGrOCOsuS{WqGfzxGHi^o&9qGKc?i z!*%Z+fC%)Bq3Vuadjnvy{K6loICammHXqX&2$x)IC9O|rj=F&ZJ;7WD6AYLROs?l& zd0x=wpGazsGTtYW@bbfctwY53y>(C=-SR&SNpN>}2=2DHySux)y9M{) z?(Xg$BtUTY;O=fgeoLPFeBZi%yj8cDWxM-y_v!w0pMjd)IYXRsES`W7ms`k95?>aj zS)kHid-yB`{Uq@egAYZ^TpLS=Arprx@d=brrW+eG4Q^9I61JG-NiADA-5XSKPlT~b z+Uo1LoH2n)n}9Z-fL@@!R*-+j(JGkpGw?E2_;=p8Aa0AS^>+nl&kV_Kmh!n=>K?QR zqc`G|a+Y06s1^O!UsF+>>WUX&!z;^~_w_o3N>x-2>H;N;R#BYMr?u?ZBQ4;Ojh=5lcs*c~v>wX%93jRnDVwuHQKGe>fR$~M2dno>l?O!alqB zZYOj5^TK!YVCM84)JT0I{+XyXwG~W?3;KqWuAkMX>A16M(46_QY3cKtHm+GADppk* zmCI&IjFN$x1!`dtFr5Zfx+IFn^U%?XRErH%R=Uv}8i_lJ5!TB~)ob=!Jmn$na3{}3 zqwR0elsfO`(q_;rzloS`YjgVv;`BNy&oA_5(I2*qMb{C^E>4(leXx)Iuu6)QY{IJ7 z-_j2c1fWU`*iBnDEN(+;?qxa7Yt6ZJdkyX{#hj|dGFQA3Z^~*W$WoI(gpqc3^c8t9 zFL&O4{&eE(mwP)m6y~@d@J206)Mg&iq!ApVhPOCeuEvb~D!ogE!08dA022&*H1G>+brqBo0QRK%ri> zkc%ooYN*!8k;~jF#R)A%b(^05y;fsrk0|029LnEaO}LoF%Hci!CV6P0Q&+Fw8i;>j)mPd`Kbee@*%879#dL!D2qpaV6H>Z` zeS)m7BqNAE+66O-ViN~{pZ1*7kz3fv@&6%pcqjh@`(>!`jzY=L4;-9YmFO})ou~be z2XLpLB4wmShJ`r>+?^E#Mnwgo%tmL?T;gcqIC_WIhwmCY6_jjEC*qY2jr zCNTw9pd~G_oL+&%weRK_xtuIG#6CvvK9O!IM>ro1ojJQkPE7 zD`~s=j`PvzjGQ@A5ATWc6yy zB;#y{_vBZSSnIcOXYdS_8BXgua=3t@nPnyl2jQ0cz$!wQS^YY}qAtV?PP9BWN`yOL zgrWqKmyA>z6O8b0PcAorjWtA4j3A83293wi2u_47MBP+mBl`Kdhy@U%BYq{6O`JJI zROn6=+)pW+C>V>uN&ga+Z72z8BndIA=MJyOm5XssHYGL9k&%3wZ0IIK+WyLI7d%^> zS6kqgW>WHLqy+SDAD<;w*9#=+Qi_aJ(;aF48`& zr`+zdwwd@IRFOJ)W$2WsZM9seq8wQgqxhsc>=pbq9q${>gr@6BxSUHi>gfDT5wqfg z0SiDQ?3c1*oqBbA{F&l{1^;>=VX-2Evb5czM9R5fN*wdyEi>i(@*SsmV5;O`ZWpL~ zMZ@RU3)0b}$>}rqJLS+1->;>fON9KZ1~zPsDrwg)jc#TT_Osl zHuN&rkcNF0P?XR5rRc3v7euPVqD-_%vF;~TEv)6iVr6O(F6r?`b&Q=PD)}BbUzInSvQs6n8o#jPIiweLb zt~EJ@!a-lG_(Nb31`MN^XwU{jgaEkkofw3Zl9P~4ES^nd@w7Zo*uqn%0~gAaBFnf0 zwx%+3kSbhMX)DYI;#bA{>w1V2oCzh0f;>+x69x5uoE>!dM=#5Rq z8nc?`2Ax_OXW9fo@tcP`7*?2Pl!nG4V)wxUpo#rBh4H2(Z;>;?bOydK%HWcIkJrIe zRq{#r)oc8Orlz8o#KWA!H+hDC6D_gYo~R>SDKS?VEetokt8!zcGt8*6xb&hT5pHzj z8d+d;&p+uO(l4g@9rY}YDy!b+_t8q(2>}zFLQ>PVriZOK9;dyr<$=5ng))A2B< zgueFx3J4Qaj){^Qdja**1iH=}Lb&81uOw8^!1cTKyCJA_8$n%U>R4BHyt#vd{Np@K zkLecsoo@ZH$KA#81M=*M*?al3(%E#4aQ^hL&f#R+cHg!jK?H3QTCZOW8U{ML((B=c z2aaTJwcG*EyF00-@-7KX!L;Bt*Wuob>+J*Xhz~}@^aE<1iI~CFOiV;1j9w_j^(-Qm zV3Q7%-!SlQFsX?afzxwwQb`BFVlpUU-@u4h0Cso?;U~utfvh53gSTj8DLG{E`gK{K zoM-NvnoDo&RXXdUZV{eeFWD6PE+;5KWcDGQ9K|Yk=;u`4U9rs=D=<#==q_fZICA?m zk_W*t3!q9|!O(dg2w2YweXkNk{xN(;HF~CrY|CCK+0hrI_4MI zDHO}k1ZFBxGG;7q*U6n>KUvrJ?WlOcW=c^{JH9pZjJK>&C|Qs>7KMlYl$s-8pvfjy zoXoho!Gg_L1$Dg}>j@Cv<}qWY+6~pPh(!W7RVXqPiA-jmtJ|Tu&!EMvqp_ScN~KU4 zGeo{t7moa;Ojqbw;zHl(t?Bxf)z+AQymvZ7KnL8O`3y{r0i>LmV{jx5BI{f)wLUYu zXmQT7EB(26bu)<9t_XO|j=2Z;wL{vdEgBc}oj+-F%oe?qdOs&&?>=b+=JX`vJMr9H zT)tFZzD(Yp4Ev?ta=dus%st?|ym0%jOTN;tOuV3H_fYQo#c>80+|#~vLS-Xt9oQLR zHiP)6F!g+v;QVPNGQYb&+byVHb z)9Q}OJQuEIRumhxwPY|Crh{rz+UK9HdRj@78?{Yyy2#g*yNU@jl?-#}iOH#fBJg@* zMLE10bwz_VVkztCOQNd8)0Vp`3R+VpO7;Hn6Eo&|WkTiCqkCV464Dg_QlFZ?twLW& z#$A9R{ir7BKj*@9WpjVi8>-sEzZZ8c%bEkps=jE02nuo9!otb=@o-ktC^(b#L@ zNZo4oShl)pA=Th8O_3GINr*_opU|HkKD_WvNH(`N?NI6!FZElbo(3+m%HI4!h0_=etoVh`E>ei^-CD%ePJK&eS|u>uv~GM zZHB`;(#R#I6$<4mh8iqm}Slfx{kBq?Mm)Ox-O zlxjc58Z7s=Cw;!hmD7s0s8K3)iH}OFViGa!G|<0F5@XCptr!xr$De^$MC6e{AI<2A zr+rDZK}yu{#6FXT>`b~u^!25EOSGFlQKoWfy=iYWb5L*S9>3^#Mo*|{X*GNr99EDTn*} zi`$H%s>rMMCn^H6_{a;bXEXHznD}q@NFKr*7k+Pr(U7QqS!==+knA2PmB!ZssHITB zw6%|~#Py}($9i+Q*%V_D%5)R<+!7bvgc|ccb*?;FZYATy-JS*LrYqq9V%eHwcAIZM> z-55FATqek=XK}xaq?RovNANI@4rWc&75v;TVn=@t%N23c32mIiuZqcozQ=d8)+VLr zw9CQTqs--ms0vobf2hCCddY?1d2LE)i_^AOIM!Y&h*(P-VFqS}kI6aHtD?I3V4i8X zYN*KFas7qR$=hAw%;d`a4H55M`9+}VcQr4o@6dVQ>RD1oMzc-DhVmY=OqAbO-7ml2 z(na)`TvzYwr<+f2dTv?d4BLYCP~+%NQI`V5=`2h#vtyUhdkDUJ<858@0F^i@+7iiG$5A@`w7ZE{Fz$YHoeMrFgl}XF+s>Ax@qFdA z6v*@95i@2sg};x4$6%?PCF7P2CeBhzEi=t;%I3|u@uLO&?Vz-t z>8z&HSY{#y$Xm`j-RzncjPIVnqQ4Y!*{i)J6V)L14x9%5WGJ=W*XB2n-q(5Qj@J%^ zIdjKxKchYX`}7DM2a~2ENiXk@T&ho79Wup+tyRG!d}NfN72WYi87t zmgY`pn5a#vL@av_M)9Ilj}W3_cqH;vlQSto$xrrYvhG(HMF-z8@jy`9#L-F7fHlcs zDB58TZWd%}a6Jh!{zbK0z&!g*eY@D`tGX@D3JMD;F`>Jx81z;0Y(%BV8SZBg!FGJC zK|*gunDpw{2xqR|QG+`EuP;{?{PwE0`@iRsGLfyaT0L}Rjq)hDMrqPvzTCA2d55fhI*~^qjMY}& zqC~Lghy?u{UZO%OZSSi~a#%Z>fH`T|E0mqa!c;~Qw#w>SHfZ}Tn`ta&VzRf=I9TJ4 zQeI#yfw~rHxqC*%4w$NN*m@Z5Y(dMHy2MxwfsT5GG1ip$KLMM5duPOFt0JulWLA5P zb0))YETX~V$Ao9|^hRk1Ri-@m&jTGko;vwW*mtf?yBp$IwU|{Bv?P9_@yJzRimb>f z-9N`Pnzk=y=%t)RE2@R6)kaF$_3bYSri4#l)GUl8>5wA{-^QJv5o|l08jgZ8rpL|)nx?YykRidY(|L-3^on?V zF_RdDul>S9cL>&%)a8Ckx1x<3Mwh^Shl6!k3!3%YaJsYb?nt6>=d;sPesb%QW8iOd z`IoLigNFKC3Ug~w+VqTz0+@Qz%2h$%wdF*D-?3ed(Q(AiQdq~VkqVW~$0@pwAOaYu z?CrnAlrr&li))z(S%TQf*qZ{@I`<0a!gi;l$$v+7y5UTLh&izwjG`YeqyrkJXZA2XoDjxmh%d`$ORaE3u3~ zsUE3>bt~0CaXg9(iYp8)QmG4^R|R9YzM9rB#r*I`Kyp$ZXFhDu?k`+1yhxVMktE73 z;^M8+rhMFG7l{He^Xab6&13mc4chS z#`ntK0vmkm9D^APs9kA?gg0kQz6P@%EMYVU{Yv2;DlC~Gd(v1jfalo2yr}SfAOwlf zc#(U1WIAXSnzpiM&B~sOrW_sX#zs#5sJ{8$49yYy*d-fxZ>9tfsmAx{#Nx;6Tz-K> zSxF%!xjM!bWs$4iz+I{YL@R~z)Gam5%**iHGt8~W+k}!}6rd*OQeJu_;uvM4{uGiAJ~d~G>NGVu#uS5qc6-%oFF^`!cTF@6Kge$R-^|QGrzmR z8cE=+K;bK!aufJ`t3;GhewX@9BAO7o^GD=-cSpOWazKzqd0Oi*&YmlWW=>%dl4)4j zV^tZ6)};zbQPZ*rUbkRszlA=QJ?50Gc1j<&b${#*n`^C9B@g@a=a7q{4%R?wM4*96fDBc}OeFq5<xh=p?6Scf< z*&^3bX>OLFxxo|W3mej89Ls*?W@Ey$B|jD>QdG2JO_xW~=(ac z9+ch;1$z>$p0S;cooqy6#7?Fa)`S5^a1C0C_-$AwOq{|Y7`>IHbmigKq*cOtJZz+T zGJ_>m)ZkP8TMmsqs^t;QGCHgdpq>yiZ@siIPd%&g3qP=~_A&)^uWb1XLt~#eLBLZs z1gF}>l|IqA2g7i!?V3|^nL5Xf+I?mVtdt#(-okgU;nnsUC*UWRD(w-#546fV(5S+t ziP)Z`yj?OzZ5r+Lgl?*#PjGQcM=F-iSwUMUN=FwI(9jC9JdzUJtZCM9Hr5cQBnoLb zag(G-aPC#pUf!1WHT_hof0>-iumQB=ID_E0(xl)bL?M|CxCLRN1YTm>c(7EjpfGs1VzWSs5@$i{j`M+TimkYv?${i z6K#Vv0{n-`0>8`&-Uf@HqpP5!BpPmRcf)kK(@SY`@GJv@^4G0@c=!YlSg*U1uUXrw z#$5bwKsHW9!fL)tQ&F;Zj~sy(r|x>z&INUag*71q-XkO4?hh(b$3DZFA3^#p%y0Hx zxG_KEx}+I`cmuKBd8&v-;QggJyO*F1i@I)Nt@^VXg1f-8kc-P%)zM2gR82}cuLhgr zBr8f-m)jhuOu6_iU!sfh)MMwLt%T6D%33_%-a-W67(PeJ(5nrT_=H0XCDS*z6~fLA zpG7C_=zvv=+a%XeO^)R`%p=QvBU}&M!-BY$#*7N_gah9}1HTapP)p&HF9kbO>A=Qm zR#~xD;Y!DLRbKfD+)dZdwoI$&Ch6%$@;9{Pyw}-%{$;WiglCOV&!WxI%IxNdEl$;` zWbOu%a|^*03t8R{;q2*9(mwNCjI8l+lNyp+_2;(zcaXLaHYGkHB`OoQ^$H~kRD_6e z@RDRWyox$W(1~#r8n! z2X9ZbtH$@I)|96-b$5&= zCrD&OL#gfi;yu(OlT3a4+8n|W$e^AX+L0*`n}TFfWF^H?H(<`B@YU}|ysCui^b@TT ziNmhSvlp8+zHPjP^7V7_IF%Uh0o`a|iXvtXTG#cWlxHW=ZzBPSMqbRQ1E;-?sRbaW5s%^$pWaEe9nTl1` zr{xtX=24`v?y~2z%AfpJL7BN>Ox@uX1cJW*fwAuaJ_cq-n{iP}b?h#30Mo^SvAK_* zaa5zJs@X)VY+8}8hh&B#Nve=Z^kT#*$vJ4O&`L`~L~fw9qnvhaZ|+IT=PjNF?&;Sh ze>6Rlb1tjvPPb{5dZmGZKXHOFyA9=Bn@-W$PgWZ?o&IE|NHX$>%PGms+_hWTK7MuC zsmg7u)&uKwR8?pO(r(3>QQ9~<9Yo+=@lA=wDfnNIiF*oFW)%_wdESkhGF6oJJit+& zNmIglU!XzeDuWQVxV|Q&b*-OTYi0zbqvwjE5cyLV<+;XPY9{MYOMg<6to{+#-=GEu z>)QwaSh*x`_%tx+AIMtQzH)pICgf$O$1(UYK%hXuss+7xnR0Fe2)0UL&bLSsT znnDo0f1vCzUG$Duebau@|8viTd!0aPhsS$Ox0$B4n{K#b(cQy^xJ)-gmyciHWZh0j z(nJHNW+_c;vV2c5Z7CJaF~wD6EYYd7(NidITBE6{*~F{NLHSqG0fc1zTvAq?ES0+7 zPB(gz@~2aEm}g1X{$fZgx1`2{P;g6seE4KBw!xQ$(^9<4m`ho00EH(6Lq6%!j^r`c z@hSr}*&VLGa6;XeaYFB1dQTye1TeO=`aF@noG0P$hY3+X5rR*TI~nVm|9n=SNI1nKsEo zOl;72xZy5@PhR^=>r%-l%^@Uz{!JaEr-v(CAnnT8`8}Z3eEbrTfYe#^G1>Vm$&1Mu zAy-I1XD~uUMAYTdUI3Gv2OFBQj8#yL4pk}6+$1eTv?`=p4U%v9?+kc8A%C6MoX?>a zkQcQVhY`$u%+E7X_KReFf1V%U#G)mMxZ{wLAN5zdP2E>IiSTq=<_i0TylZtm%Jivg zyP9!N`5ZcrUJ7nvs{J+tz1*WO&CXl0ktaDWM!Rp`{?NnwPwL?YF!!dNW;mKU^`v6# z2>H6c5hy@f^qo6D>QV_0+CM(b=S{(Fxrwx(cIn=FUJW_8dvFN%sMYf^CtA`YWz+gJ zTl+2RJ;}e(kLJar^R)$$)G#&A zw0Y5)T_{#dXJ_+k*-Kl^JdXcT_M!d z^KOX>p7=Qj$K9$HJaoU;7MBhF9P{P8{Bkk+w-8uHK*ob@+6MMU`$a*h&6ds9*~*#H zYR>9(i&EXqiq42m&c@yOIdC7mel^&4OJl=CoGvdKhWm@F^s6V}V@nOUsS~0T{A8ss zi0-{DCo{b4Bsde)NH@gaE_MkX$nIZVjt9$fWG7{M*c)8-{a=&*yaPJyzGo(kpQUG{ zdRe`V!h|9u;-0qlx&3UTro;8Tohs{J#OvO>)CuKtdwlDc!{v2)eCnsi^?kaWgnx(b zvqQ+~h;MZqO+wH!={bI?kgDNzD!dxz5rg@j-4+rsom$K*-;l4*>BG>QBZ-UAPAI$|eNc=1qx#kmypR1O zpbr17qF?4W0Vdme<4$qT`t6|1`=9;vj10T;ZjYUDF2Vu3b+?HwofOX>If$WJe8q$m+zDIC#sNk>(Bc(CM`V9t3oYec78AS>=zWF_VZc0S-@x1 zpG_?CD*Op&=hcASn)^S?TKt9n_ruHRyAR_3q?avFIq`nwPf8E#CT&&+I&vFlJzgij z^?Jx3KKH%w4Dr#v-EPV8xz)U`;C0;DJHGVkB6viP*ljaO#+cHzE^))y#gAK+ZJ~mY> z2p}R(LmmW>QK!*E+Rl&ShRtj2BpvvPb%dNha_vM!M;2AABd9G3yakwuj{FbMrEnFi zRv0x@fs1xn1!?1*BvJLChk1aot~DhLGyQ-E;Kl)e!aFmRnE=CNcWY~G2Y z0tbk2cf#mOUlHfJzG=w_T7P;73G|zdJwQy9Y3eWfgGUrGjd65T!bD8)V1Q|v>fedm z$OU_r%PAV(CAbdno*txp>k9e|NWq^aEF`}K#HXB20z$yVSbp3X670M#A(;vV9F zllkr9%UqZxUWj*Twa}$AqTvlDf)hhGQW&{IjwvI}lsn3$o8UK8y%TPHl#P8<{Ar5w zBUD=x_?W4L$cZh_olkVg?$X>e`wS{$0#*H=#)+fGA&<&b?*(`yU~{nY zQj}ur5n4tTIYNn=);`Z|!{Wp6@hR5s{mC9s4x}(p%+;Q&@QHQ9T*(=dQ^H)NY~ME+ zZ0Xx^ki=YM2|0tDXj|JELn12G@gKb^ScjP;;`U>%!y0Hh>u1I7vsXtnwfx$tG{;UR z&xFkvlcFIFM~NM6q)jrCB@q*Hu@e+)2A>TN(=^#n;SP%@Ze)Qu3z-i3M>UH2r;lhJ zc|UNc%e+^_eFhXvwZrkB+!fdP3J6e%3HdLIrA3hLKZ_`R@LM=SD3O}#*`ovZ(mWVz zG7%3wzh>bm(8XL)4igMD-faAI+I!sK+<49DbL+?@FA!$Sw&LjX`fmQSkulnf4FS}l zN|HFr7HqJ=99_tMLqr)B*_=MgOBuvvQotL3#|K;Km|<{^NE~m7CnHo_0=COT97l(d zUD2jQQ}@Tk!3^2K%vqJlq?5bs*ygjldeI2cnqBYXR@)3w6av2QjYYcnp6peug8wAR z_t+Ss;OlY7#)Mz9X7(2)Uv&ExkukDE!QSwO*2w+Eh97LdJdlXMR9tb=CvKKm-{&V@ z-C|zzp)PKc4P%BJbrP06wvDx9Yfs zY*%!#pI~9V@Mpo7qb%QIO)Dg{N-q23=*S?Fl#(0_>Ev^i#+;JZa{0JlMo8EA)9IQL z^y0~VtRWyu@`$h#o|R~mLu80sXB@H}X`_#2VLJ2*pp?iYO>^?8;%V6rlx_wQd(cSC zUJA0)S30$#AV8Nl_)j{e28ue>gux2xv%AHbptpVz8_3ecuW!@pgOxAQoX(|N2Iy}q^i+e^ED{=tP#IE!9eOt(4IWb?rN9`uAUg* z%bEWHZR$`HBCfBfTvluk#Ic}BM)-JZv}vgg$ieB5i<^)o#tR$FlYBVvP7KINiuH&# z!VO)7#BDX~vjFK`FHXoKZOANmHW`td_w@cnygzWK|a#HrA?!+5F&c~2s+lqtNKV*er5Gpw9lN&AAW}FWb z3(SqspZaoT`?#1MqQmz#`cTAI(417e8ni)wusx(k|6(%`d-79`n+^MFmT(ZwGlPD! zo*>4^r6PlYjBQ8z&VAss1++!)+~@OH+vpflckGGipqU1${CEy6-18vn?LbEV8+K!&Yj3d#qlep<3CIDr( z!c>^toOLTXxW(a;JNQdzbLD146NasSO96MJMn3EQF4=xaN%*rhR%Rr zP_%;C7Uqc=8M>)>(N3lP5TRx}YkhO--pLs`QBJ?l0=3l)S$J77YPR>c9q794NO{@N z33lSWso2qTaI$2^azVG*2Dfke!*{hy9RO*VX)?KNA#Fah@#!YIjR0sCFu7*&4>=Pz46r;hQ`NaKl94l<=q=Q zJ`=J-{n$hPV;UlM&^Ca|9-|M(6G+T3NNH~6nTaDIy&3TovcID?CbTuM?jD8`f|a>* z4=0DWEs6nB=G}wzSPU}U(9e*(Jb)Wu?(I&{!VsA5k4;W!Lg#>4KPlJ$4L+9$>7X zA8)NNZ&C74vpl1#WqChuLn03DjN-}><=Lb#e8~_HVMwr|y!?8!+?*Ud{KyNO?B9`t z{tD^E<51roVI}diLbl|{ww>~-gQrio+HijmFLHA6@bGc)@iD7m!ISUwHz?)#l;smq zAbpoZqZtc6Kp2;n8-t&e#)poPlN-k%MRB^>Qs{;#WufY1;N%X~oyc<>J)5K*8zV*G zmpar5TV?73;pZNp1yLC%c^3Hv$yV^~?8%*%JvlW4G=1NJn>piKOF=9dd{6(k<;TSudWo2XBrdU5lz&DmbbkTzwq+tAS^-rbJ<)Hk_y}t$yjYTKn z1q;HWxGjL97z)8gasEL*khp2ER)5egaD`7$u~ELi42zK$#Fs9=6t zhB5~$hT5iYFlUOEA;^@JMTn^iT4z9@B4opa*GCmW-#7cl81-|SK_UB>yQ3+Yu)hW< z$IUX5AhP?h^jA^jse@QaR!ANE98nZV7Yz^>UUnvK2;d_GC7EMTk?X-U!{mbDzutc} z-8Kr}nz}s|#^ebmI-v6(-v#kx)Y!D}FW1PRul_mdOSpR|$e}B$zs?M2B$(@el=MY6 zw6`nXiCDgRGmA=vKyU&#TaLjNL;zP3H14zU;C0)T#%7@T!jHAgZ;T|EpDRHMIEOY^YswoNV@(M5KCfLu zXENh5+O@tQ*?~`M#rM6<>(PO@yN5LwSZjTE&GvUZTCEfJ*~Q+~9!`3GH$OlYS0|g? z9$cE(g*3h7j1~ur@3U2_K}YUx14`{e(;$=J?;T48^2+b`L6tS!ocxS%xEI(P-I@?= ze;sJ9KzPY#(aKx!EUInrEv>iKRdnZ^tS)UVa!tXGvkNrwobk}UPDwhsIZYCZZ{dsY zq=#<$e@lhp2$_f!0Vm=$4fLSQ*? zx_dqQ3`t1)+9l8Pi9GS}XA*x~wrMx|7fV|(Q9>Bcb-+~TT1xT$GhL|_2-?ILu3}XV zT4fHJ_m`#W9JH6kEVN6rpC<=k@63}h?x$5bSe5^G?C+l(fKyMxDNbqdajE}39^coN zLC0j$Ti$x~iEK$19xvWOJ_{fZ!$F(a8ap{Vni$ypCG89?;h-5AI9Lc72>;SrgbZ4Q ztPJcrgoMmmgiK6qgskiwK!%YWC}v?HWMyUsa!f2*glvqg9~3}~kOctvQ2(Gv)i89%(SF#&a%7(OVV48Y1t$i~73Vn2#Dpw69>>Ia0Vd7$N&_w06vBp8G$yeZ0v*pjt_r~OpG6fA4*Ig^RfJmo{9ZK z%ESts^l$h8;QT=LLkYkJRO0wZfQbW0GBbQgnVCPN>>r6RvjE9|beUN=fT=KlOvB6u zbjZZ~F%2`@-?09gv3=zFj{-XoK6Va{e@y{@1NaLo2XN#+4mmzz2Zjao4D`hEkrgw? zU-%e5NahcxEX*HJ{0)|c0k8lQWM=w+6u|mX zN7j#^fj9$6Ho$+%0bu<|=bsVwkJJHw^*^v-X84Ev@c$PZzz6os49p*|4^JF_OUVK( zCkv3}_=xr&MGi*b2ouvs4jfECDI4IUnjB2PAb>tTNLC;c|L6j%2=oeUw*Tb?G-YG} z02BDv766R?Uz+2ipEv;j@{EkYIXFHlsYCc*ZO;1twfRSD0}%oWJ`5RvKfq8wBL6qd ze;s~6^a02RY9AQ=FTwuR`9S&~@Bax6$N@34$L%EI`UVh4ivA!P+h|9J=I35~6W2yWXlpm%33ne!j7|PC z&Imj;GO=>7@bdn9zIV?&?SgXGnonc!J}>s!z*vp19B;OkXzr}J{;IXU&FX+YBx^`M zvAwj65s%o6_z86+85LVUA~#F16u1FPi?@(aFi2Lsh!UE;PgvF|ea$W+IW>o;_RCJS(UVwMIZIxb+mFK}wXbkNu3>C4 z)~Qra3P<=sU)TA?YaMRplEcgRetV$iy)Hvut!J+Au&F#0X|)hL@1}r!vz>kGT4?8U z&f!0N6oZU2Yd!@udi?1fl_PW>>WB2vYcX=14aqmE0~L0DB@;BcxL9Lg+<$FhH$`;V z)(wLGt(4$(KWJ!2uD zAG*IeXUeb`EHZ8d}q!LP`uQ0n=Trs#UwGW{)%Vtg6t3JX` z43{~iI#Y2RoiUt4!%Myv=2+KXbBU@!&TYjw4wX>b(QNeUUkRp9%2wxUFl_17N-?HS zU;_uMJJtyfCduF2ofi9oxhD+BJYHF)az?oj9$4wSV#-9h?CyPAr=ZU{rTJDQ*lGIu zl}e4uoJ!r|9D8|O%=e2g*xOjn%%PK%HUz3;xN@H96gN)0;tyV+Wt29=Ad)-n$kTQ0 zPkVz`M|B%M%glP!^nB&v^y9rkVDCmhP5HVY;r7z5w>3fZZhGXD_OSeit}VtFQDzQ=^>#7RhF17)8)lVM6yR8d+ zpbcfrEkI6N>=4nLm&agRk7&7RBI4fA)RQG=AxVqWI-Tth;pNDv5 zv^#hZ>lK^z%t%GdUf}IW;229*dS?3P{(bS2_xOUdL<;bDhYI!%7}j*%(1fgglk2^r z46~?I^%@Whe_+#IDRd9$@>Za$GMSSZ~O3r)Unn9WPxbvF%t`yu25uLCh z(1z$I%daC-!!LV`d|dE)sC#Txikn>Nhj3-jKDU^MAKDI6j&}^0`z-Iqk7pP&Dv+>? zWSr}o7d@xSBFz)Bwy9)S*c|~M=%**mGy24bcmOBB^VtPs&PM)ZXLR8HGX4_F7Q1_< zXtO|i)5{x#cObGfyGDKv{Y5^9-^>FYLF`KKfS4P%PD6_`e^c??v^eG!Orj5e!H0NFKZ(+)xFcCH0(Usf#={ z?+p)I0eC5i{GZ%=!8^e-{}pIf*d~johJ)^Fjfe2UFL7}2t z&en@WBt3sx^@8l6B1odIIMV}JwFS5uTk4-HB^203M8KvLV^*dl8?oUEsty@EvAe$M z3f3S6tLCW~*wo8vAZW^I@*TYNirwP=0b>HpMmTOt6J#!jaZV9twt?E1O>(zvj&&^* zEd1G${$hsggTU_nbH)UjWAdG@KBP|_ele5d7C*4ONcw1W2!rXIlHnA1p@h=k~jWWq_W(1 ztl{7_3W8_(aLcXo@lw31Pq>u=C({(zVqTE(u_(}e!p2A(!t8Y+n8dD#2?M-_d=81N zp{*&cG48SMneM^vfsgQ4I@?|Y2<8#R;Sc5^`_tZJ z<E)vHlp1@6wGhLO1$E8x3R5_a&3jk6pb7 zpKt1(5%W1U`*nkEF4}GOioVgna{WaleB9#K9|A%T4P zT8E^*js4+$Dr%Qh6vw)`-uiD9>gTy~)s3Tg0xM$8qm~`@4w_X!@1sX(F1!=k$>)2X8=P8QeUC4BGPQIudN5Q50ehHg z%NKRl`&9l8ZNU}7ZZE#_;jFc5BPx|zOBeMvL!98rSCX3-meTycp-%qjbNo`-rl2Wl zm0bHgsw3~uJJ5B-%TImwHv`sdB35cqZ@zs&F$vSIE z+am5(#8B139baA*s*%rnH8NNZ=&EXN z-=Oavv}VG4HUG?2pxRZe6Q|g`!AvKHO5CtUh*mGrA(?F)U0>1s)^diEYak@qKir6x zE(jBo*8IITR09JaD~N=ho|9=94@(+ff}(Q1w4HEc#kxgS&$3=ik8I%=6-(R zsN&RrP3!So)@?LS5q_NwpvPu*Ca0Ro!c>>2}Ofzg)S3|Iutz>SnOP)@fDzzBL z4t1?q-lLTsy2|-+#JJ-X{v3w51kTQZ1CCJVy^rU9&q_`@S9e)(K3vknPVLnld3!0{ zG!DUISY61he@ivZgzmVT%RvOO>v_%yrp4K&+!fa}sN5f(xwO<|^}oCtT=f?uwFMNSz1K1Ndhk>rUKtRW9PdP%-CTFC6MU@xQcS*mX+I&9Q3S zNQM%Gu9X4>g2A_`Xp5AQZks)X`AceMRk%(f3Ms~lcq{B`P?>qHY=P}buFqKa3OqOJ zDgJ;@f2--y>bjZTg$DDmBG&}jD@=3i>)tP)t0s$jBus`~Mso8J+m_nZU*iiR9sS|I z7nDAEd2LX7n|Qqh3`1{!=GkxS!#Sr_LkrXn;cr?N!a3a>43@QVcR7C?RGQYmoKwCT zb|>o&;ow$L@>#f&` zRDkU}OXYV?{f$kl&CM^%s>m(dqMZgmaULbRYKin?*n7~04*?x1rZ`JyGBwCyHYlVk zkd46YZ>^L_SH#T=+L{ShLtx~G8Q>qmbXKkLel~K{d%nyKTheHVLpTTV8K&1R=3C6@ z;*g1F8*3U9Sf!$`;@ErP+1Bi=c(i6AXbT)d{xH313a421j25 zVU&>OME@wT2qSrO6y<4?77s!$;oG~7eKbQ0Le)2Fq(e7*?&fCJVT2^(#o}E2&}V#Q z&vUr^eX=yBAdq20Kq;mxS^BfZzA)n7q zD9P*-1TDEY5jP7rb3u2V@7&>P5^I908j~n~tUL8DHEI73Q9!Q0O3Ujry_Rp!Ojy1( zv&Zt<%pI0jXAW7qXNXtl-gs%|@a-XXIlhxy4y@sp4I#V?&dvCWLa#*IEiXrhEH6bj zSKm1IL~}I^a7>_>R^cojm%~(JM#ij`9wzJuqHu|sI6QD##Q@fAvrgxK*1H0Bv4op2iIWWm1 zEZYF6tu0#y#-HCZu(@S)VC?zPffb{ZqvWQRjRPB6Mh1c-#JZMX|C)id&#xI+v1W1& zxe88M+0s8S@O=M3UrWzG@AEwaJ-m=*MN8K}7v;2cwzLm)Jl{Uh*3voh*g(i_4zG-~6^`58D!N#*4kl-2_w=UwY!}9#3LFv2XpJz55b(VUL3bZW|>}22XeW z9=08BvKRkL+#WCY8rJilWG1LrV-JH@j2PMMPtd0+Ef75IN6$b=wdYfvA1};)B&MQ> zhd=o}_u<^t*mF={Wn?KWESz*Ew8TF(KPQ~~4>&^2w#nI}KEOxCUZolkk3CmB`#os= z6YO(RLfDqhmBRKP$h+}6cLx8-*w$JF5Oy6$_n^IH>qB5hT>=VHh>t2DtZxfC3ixE@xhB~Q`X>01 zg!M%MO^_A=LD@@qRF6>^uA>R$``Nocd-qZuRHdq-g7E$9XYXFcYd)XiD*S$S*e`Sf8UD+~}_JTlo~9p%?)_r>xP|yty&^J)TUjR2k$vp4^~P z>Se&4AO4<^eN;~0{?Rc?SG_)HC%!7+lQctL)N9S&prd=8Qmdqda*0GO;HyfG;wVu_-au@i#**+llMbAJwYNaU>t4TMW9 zvWv3qc8Sv=bx7aT>B_VRw4~M{dXpf^$%Eh#87z)r2kCIwUC!4eVoA0k(=L+g2wGx? zpDMFgHNXs@y1F_Rr%HVVMy@iTxLTwP5Julnz;I!x2oQaV{eSfC3m1q0?1m*Ee#kSl z9;#Evq0>#-C>e#<$_Nh8dcK{q(fvF^YSwCvGCp-=_Tm9jATz498B&5r{52&}o0TfF zT1@p5e|HD1Y#bviUkw1tvJQCeeMsmgfRmjxr3Sv z%wL}O;P}jEYNqbZ|#|hn(}R5+|+YuWtp5OV5n)a zN+wZz^0EdZzkB@2kG?*n%g#4TAcV|BkM8GF#V|RYTZ@BclDjCfM5)!J=;~H1a7tgeEed7*{;Ok(tCTK z{`Y6*R4$i_P(1tdFLd2eao`*GfA8X*-#lDHKK{&qe`TfFK|km)uX*-YkL>!+eJeit zLH)@q7<+JcY7g8!A9;g%ll#0-ZB<*5&@|(6@r*Ol9`_871432d13)fuvR1?*k+j=V zpkc9SQ!ZMi_RvBJfA&ilGID?~5zw>%wyzRz3%GSbtdz{)ON4Z(R3qbaQ1WG3nN%a? z$13eEGjAMJ-vwm_29&rC zu7tcNAg4Moj4?6sj~EVi-3bD%QW|7DfVzxr{Sgb0j*)2Ocy0E(JQ0tk@xO1e00V4e zb05%SOeU&BrNNAh47uSva?9T=4jN{%vnzbHGmL1aqE9p9TZs`0{HSCBWtkGg90zp) zBbJsaF^(~#vK;`}=@izb=`orw=1I!d-LYoR%SYaf;zk8yxt)`kMw!Hjv2{9?cuvxNBG{k zS~SlpEW%T9&&ik;+7hdD8Bbx}ZpV9tq{W+PK()#9mz>t4XY5 zz7Jt0nZ2TNC9q8V7E5KhOe4pV_^rfEKH4`geLM!FuNt)nbEJO1-scl}4F=PBN1;R_ zI*%NsJz|4i>N6C2d6t|W%Rqu7>QrD$0vu1o?TNCY#uotVkxB?V!C4G9VP7Dnto0xQ z*p9H^^BA67uTlVt$QT6{L@kwRqyi$AK|s423^3zTH5gr)8UgVG&0yU0&I@sJ*U?*3RHsvL9<&f*PPE1dA&vF zQC4}c$SZf#My!2!9Q*4lQhMr3^pNYA%jLG~G}!Z(+*_y8b!fwhWYuTtT&icV3zK zCQ>?Qcsz-HM%yDv(f03LRV0WMXv?Wm3^7pQoB-P(OU{rf89vzI*`+c}I4GPeQ7+^7oqg9edJmGdUbD0)*> zZ4*fgX7qhdx@<;@QTNUz3};1B*H`!pnK+DYUaBv`nkar2LoC85+(#(lNmfkV)ev}k zB7xbHm+om+xoh&e_IKo}1hMZgM)HILWZGK2s?r`v!Sw0Qhwj|tt#5THR3`Eli_sp( z`>z1+rKky8GKE)}D|!=^y_s95JfGoJ%mjn_ni*S?2~Iny4&U-<&i1S}Oe*T3R`8vzI=tzq87^3GAVec znT||rSzB)P%7&7Xnm#<%h?KwyI8Mt(rl17z&Ks0G)l6nw@QMiEh1p9<2W#HQC)k;_ zF_*Bv7dw_PX|ZDhG4}h!0_qs+4YGdKM|+Z_x}OgX;Q#SCpK1oQ(mJqh9_$-i&m-M= zk*inHYmOtmF4Z?)=vQbK8(ex_mh!E>wY%rmL0{6|{&fGV$Lebj zy|jEHSd4w!OuhvWX6!8#2oFI8} zlU8pQ6FeObfC!4_33&9CM2Pg!{q!DCoZD*`D>HkQ^HCp$IN&n?ye!DTx$qBjGXM`z@;D>LnrWA-w2T0IR$9t+ zCD{{#dP7LcGWB|sLP*Ch#?CV$1;CymA%(=j*rP&9V%F=-N+AQiFQNr9gI1dIJy4MbDqC^?vDpN)}ZqJ8!S+)o$u^9kr@9<~sGe~I;co*A8&ID5@J zRWC0=2H$K2+asJGNV3X2?4X78fzr}4b&?oaoJ%C<#qQ&iVv`2o70}N5w(2D{xtCxvbTS^RFPW$$hb~kng;x7!6$HZ%M|D z71%!Gm4uC^uZtYP7Etp>TAgCA59;%4I@Z+2ejvBmEN$zl@7;Rrt^3bCJ@8q80a8b1MQBytB= zkm<6}a8WjDzQ}A@Hg^zMm^+|;(sbwfdw+@1`{Bu%W5HwjL!aOMU1d9aG}1+k}j5{*m(c#G}hNz|Ca({mq^?*qJc z(AZi=c{xKYHlqwPb5W_((-*Cy`tgOi17Dn3c{fTP=*ahFve+i#?j%fya4HZR6M*_( zWHRd4CPVBb28IQz5(p2vLdc{3)?zfVeD?wM_jEoALR?|W%90x{qa68_68l9X13$m$ zt;)@sxBOeO*p$m4S{Rf1FDc02(s^R-WOtb1szw0he^D@*ry zWB<)2*x(=0t+Ys`wyvID*OBulLLH~Rv#)NVuS_kZ9+H5mwzw<}d!Jgr^)DtXOeUfs zfpC3hY^T!1S7&O)UH4tsf8+-buFzR+Dt#RD)XSjt;#q^sdWZNj(&vpi-nvfHeTu9B z^)ke0N*wde{zn4$tU!$ST`}9Smz)nasgsCYj9bl z7-Jz^E^CmRxGf(q;kN4QZ-6H&O5v(C%x=KHFNlI}6F00aK zi&C)SCYGR8JpIe6c>=;*Y9k{xs5EAkn2Gf-CK>S}cml`iY~YT~ z6KR?K=OyTuOZ*r&ur8!P1Rm$=**Qii6r#AMdK-FXz!+9vMttd*<|4f%H9x{zB0WOB z4WeBnwM|n!iij_}UOi0Ea!M2((K%st?-owFPd&R8WvzEV_)c zOGXQHVk*-$nmMkBBXK@WpsJ|BUX}r;MN)$&oDWHOTsO#v=(J1`U{Rse1Il8fv_3xx|twnw9 zmz2(6(+Z82IFDQaOje3lTs!q%U3pzRX0c`{Qi?beJK{Z!U))kTQ zqI|RcA}51a7e^S&?DT(J5fakmVoCBag{1p{eQ!aL+j=cRqSIf!2J{CNH* zC{+Wxm&kY|eO$dB=R4+IuRT1ONey9!fLg0?m$ujJpZ6XU|E-GJw=x?U&t}ovYR&>-mlwLndcD`>F?ctd z#~|M?-*|Ud(Yp44jK`29Pb3iKheoQ425Rm3;h~YCaK3-#o~E1?4SsGvSg@R$zG6?P z&|DB6+AtI@ATnAeJ95?L44FuxlmLc=nT||@uhHXe4CLemnl{u`ZEDF;=#4UwOeK-& z~8ef>p;4PoZ@Bp)2!8#R; zDi7A;E+6@i?AotQrfchyg!mHc7=fw9<^k^hBKUciL346>jLS%OS>zg1jG5zF=9AKZ;qB#^S=6BQUF}=zYRB80j7+E0>!b{EdherKN&}l7K1S|I7^>OF#wXid z&i2Xm%}8_bivkV6)kY=szWqQAG(9Cbh<_ z5K*za7*b@?>x|%w5j`Z)O!4JLjn*Kd7+qoFfV|inKyO>J#Bf+jF0XF(@sBBPh>#7PaI~fO` zvQx>96ff)uyOvA`&|jq_+6?HDQb@(e%-fsadDR0}+IRBoLTfgGL4R zh$NKcHIgqgYPEV1NzZpSbZusF$3^^WN2oh-$5|vC=GIvx02bweYqhbhym%sn_;=zx zZjX=`yWL1tYqgR}7&VTo%W> z$CL(&FBOxL+5eKrX{=sGgbMi2mxyNnK;}whY_w}IWr!3iot)B{OstlXs3cipg+e30 z_A3+442;kHma=d$gY5pT&eI-R$zCL-yiJFtqZW1am!vV%YuhS=~JM9H&$2+#Ro&AJOZm}1uh zC2?CGZ=qT3#pld|4u`6gO{!HX4bqy2SG4Tv%B$V|^u`Abr7LTzM_PR%tWA3kinOQlvm+D~)PB z=a5!ZT4JLaf5g>h4k5mwUR}!tRatuF5%Ts2pjvH@9|r+V5>|-dLMK{9^BG zw}+Ij%G`aNt`PB=ri2li{eD4>Q_*qzi~Bl0x3f{>4VT9DuienN<0KGu6#8xfUMN9h z!KTf5`}0oZQJbCnohO`>SYcL>XT)C-lVY)1OlAO!3y}Mqtdxor8Y32eVX%;_v#hX? zg_c4~z9XV;%YRnLq9Q)f!H#sWEU|tFd{Gu3*UzuvasB{rL1xTC(tJ}*$DnWh=QjrG zc0Sx+(A!*U6f&ezB+Cu1t-JkxSIg#L^}414F;)(_3T1}F zC{?JXnRWEKdQe8x?H<-d1r6th zJ(0>c{X2{d9yWdaqg%WXs3a5bz2hgTq z*~+fq>ZrvP)a`w5OcK>?eq~Arzb?_ssPJ6Zn3&lfHbvIAAr_gT?5;))iE=wQPmV5DnA>R>1Fo#_wj0i%kE~pED&Etr~27BD}K|K3G@mZ<*i#=d6VP=o3$PE_H95L7ev_yf|9ZvjSh9}FFH{~7Jw;#NryTM z@Z`^GE$ZB#etM0&az)+Q&D(wg1#bY*E~ZW_)F%ZQY|~k$$T`DlrWYiWdN~MBUfmp{MN_UZalRr zr)cAY!@VaP687yt`@J35nqlkaXlm`u*CdSD?Om%oZvXnmJz(U*Eu<|up{r}{NW+ek zq4v*BvUV-u-P{8f&4Y?Tv()b|JW)s<^b)6Yznn`xmh)T=DYP5yq|jotkb=$p{d`ib zw&kBg9>P;hpR<+ZKSR?QKCtb;$=Sk41{gGOY~pDZKts{bhPVlNL!5yhV#C5^xem77 zr7RZs)IBcM>}gxa;nj7cVeG@;oGedN+&>xI`lX!}RXd*;-u&Q@=N9VJolRR>TolQ7 znEOv|DAt*E5GcyQ@e_%RMorx<-#EDE8@Dz#?K#sge(+0y{>f^PRnOdq{^N74UC*c%DN?S~>h(B!YP=wiRMG>}OLl=euvrsR9)3#vT zAXONXiN|>fi6PqCq0eRYMKiIT^Y3y#!II3QjP#44>$CN#$aN7O3h0Yhi@`jiG~RU9dPWPwVhS zD@5z2qCHw|#pZLUskTD2Yib?MY>#YcTN%oVw6%CEBTeDr4o6tgu{Y_Yu{}=sY8L{m z=>`o|!6sN!hD}l&HXiSj;Y0s19v;tFv=MuF&7oYrRLgpJG@lVw78mPV))uQTak}Xe zj~g*a;xBLT#5z-nKSw8{Im<8Q<+BbU2-1;k*BKR2Zk)?{D6R4s>Poq16ZI3)M`Seuu$nbF6>P^u}^<rf>UyR%rn%ZLwylr3rnlG^5KY9 z#AW0Iar@31kofd-Hs0Wfw+Pe3awO4yVk+B~B{(-_DQSST{2wm%&OZuxR-IU9#@2ig0d6Mu&veOL2;0<#Zu%0aHA{4jRN|bROHEiBz`vW_nsA7U(hd8sFsv z@ZA)gFA~KiasF)ww0i1Q0twb|aV&gl>}{WKLmVcVe+EoWpx$6XAW$}@iLS}YY7|E& z3d*9LEsbMpqarfiHXL$C`dZ2wBc0)zj)Jf;?jz4@J?tZ23UIk;j8fK=IhT)9KE3XX z$3VBxDa>lqYOj%OpE#mDZR346f4z=4fH;7F>t)An;o;bDzTEOAfU1JlX7q~45*_HVMoazqJ>kws zb&EAWQY!yTrZnv8FtUQhCVS%41lMr(ovW9x9}c8$f&>dPAzC~;gSwBe%+l+#RD8Y) zFO_`N4U9n3raE1o-H1aHK&UD+&(aknWf~=YNpDdL1Zs<3Z_x+@8p}ui8)1f%3%*b& zlBy&+9bYH_6{c4q4m->nEOw5dv0zzucfmnxG=C_62cRh*eifGJk#z;p#+r(QVL8Jz z?u~3}Sr;CRghK_^ib!KP(2+n|Qn!Qhxs*U%B5c3RO2UFiUT%oT8=#b4Le*c7XXXtK zzX?36SUj`XjWvE82b&jJfJPvLCmYB>V=|~SfDH9O2GvcIVL4`%TxT1Wq7r8(UI8ji zq7A{4rY2u)YqVecGS3n9ZTInCQTpK5Z-3diez3nhGTPGGA6Xyn>ZlFpb?_XLENpv2 zi6MeyaFEnftd^QBx|-Bc3uka}nGo#~iIz`eM5sEf?Qsf3V^S)ON}K|DjCfcgiYHot zCW8s;kUXBGv?8#`lo*!qo{Lfx8~6i0Q3bXD+c6}^mlJ6i7)GpEAGLYBzxmhIs!k-<>4 zuQk#eZs;iKaE6shd!Ce`y1KYcpEo8zqJ`$fx6CY@Pi-)k7OfOxwTLPBzg|c+R=QHC zcGDJPk-TwMDnV5COya13;~0fNf;r|Psc7k>*{AYwmk`4R)@n(PigN;W7&xIDl?Ssd z7JEn(?Kaw@6#-v+NFAwbv2*UPG0Y@XWYVg<6Bjq&HJtm7WMV{eHM!tFfrouRZobc2ZsI8P_TM8AZ2sQaCmK`BjmSNM?&G!juh<7 zbAJ*=oI4AMQmQ@?vOYbNGcP6(Msdj0eMU|OT)R{Jt((O4r)5=+D?gwgWV0$Of_cHV z=$PG(ipRzzp}_!(>J*Z$$Z%&c90*rd>IxzmEp12=(S>`nu5HksOO{96Nx{_&LzC6Q~r@?7ns&ko~ zlU#~Xmztt_H!+mUus)G!07-h$n9z^?t!P;6=mpSTQw@$i4 z7B#If9l9ebosgQ~=e`vcdfbP?JHmVR6mE_Tv~-1ABW0mG%rbYRFl_74ble@`Cx#V^ z=G~<_E^bIkqAv~{l9SJG-bq@D8lQ|vybFAJCZM$u&>CxAp7k-oTn*-h1aruVZ`;}2 zpjCo*2w;bm-Ju}9l@Nvnl+?l@4Aqv3`Ws8cI!snhB2vgY!cto%yLoEk*B&;;9;S{^ z=TR-{Lc?e#cr>@9qJ)$bW)zYhf0du~StW{Ai6_HD3Mz8KIb^xL)lQo1d3I8t>CPle zjUgkcH9Fy+&?zKU(*-TjK;1e1il~{E`>6oGAiy`9`GErb{v$LP&2x^({d}stEh6cQ zXtg8dRHQnbXKjd-x2=s>SHvfO*KrSw|AS1H_bq!JwY}caJ&u~5*-Z^0N|;gPE6}%f*h)h< zme~$8ybWkr1NOK!m|c|B9Yr!33Z2WzM7`zVqT22(+Fl79UCeG&gld8=m#@?p@=?gA@R5QR4-rxk;%HHxCYqIJQ~+Kap=4?axR0Cch}mmB zJHo$Qf?{zlgSu-$GT~H5!k{inIou%GlRC>Gk-s6)BXb`Te#U~d$cCT7*S(UVjfyOP zX;g3y#Jh=!yVpYl{?i9&z24S3te;gZOrzR5i! z5EaF5yWBGZ*WG4`t0yS58YonZT7tQ{LZa}!Y)MpSf5lWl;JNrO8{rt8KAX^siEJ^G z6V3=F;{~u6An?9-*s-f2c5K{Vh=y)%YCh+~Q>&No;S&(wtk*qHu4O%C7I)Cg1nxqg z5_j{rieHt9g2Z>D1HtZ=PQuk$+DW2LMJLHLYnw@TQ&|(qYtl6Vx7QJ+u8@lamJg|; zSy@G*sHJ;FH;KB5?pk-WND*mob42RfYC{F(;erlh3X0=X!Ykex8p6-uT&-X=ZhV~Z zMsl&7plIVW*5Z_4qMW?Q7=2-TpzgL#F10FS4D4o#_;3^7yY6eQSl#58`}*2L*#rAp zEc1d?5L_fk*SE|w-|pz~p^L6xdPDl!i+ zCywHG|7Bryk!N%ybJ5sXv7D&j@U#AAG=}!$HAcM4kA0lRSkNt2VUX-BsEg1WJkx(& zFu2uu$VqOt?YEJe&HK&dR{bG8dAEus?G;%LQ7`mF62sX4}I@oeg3Q!lzC!gE7?Wyf0Ws}cMZhLB5>9MTP{=uI8 z?T*Bfcz?$?PP8{3JvX)E8+Wxe96fiq^SAHVgZRO_s@QgOFZ?8jt@Qk)_ z(7UzjP!%~?MQrsR!jswvh9YdGqU$EJg%vB7o6NRwF543HS#B;{VADhEb3%=c&LpAm zh^I!z%j@XqE&%i9K5D2KZgn)bc6r+GX>Z7J`h&|D~z&UNL zGc2z0SZIYeVrnaoC_1s3UohigiFte_%9}Us31MB*k}Kp(S@PHmNptf4O&f1k8p*Tl zj811z?UF}_q0Jq+BcI3q?YGpucAJi`Prr0~H~+j1q{2d@=jX<-pu;$!`J7 zVYE3|dw1*UR?_4m#4bWh5;RHFPdgk%MG|uqA1Z0{M#@CbDo4tu%E)eI{4EO+{ECG( zU7TZ~e~YFaa>lO6cXc8A-t;>b$Zz>qA8GgXH~DlT+!b+N-Kq+2N4X`ZzHe1ueU77j zUw3w6S&o)ZvF}(ASc_YIz80@Or=fpUe*=hF{gzgjTyN538S(q8GHe-|oVvWcN{`K+ zSKVLbTic4AHicNClt|PvzRsl6<&;|UtMjw7b1Qq|IAZ#k3G@&;5^O4;9$Oc!pNcwi z)wkRgl^f*~^$Zj3pY8R+Z&lzK*S5A*kx=Jd@`y2f zPb5A&vxuFPrHrR^IlBd-enG{C3`IT_H?EG~PZ6IJo|w|IC<`L?aHce(4;RL>1y?U& zAzwdq0aMX86u8RHyY)Dinm%_U5|C@>1Nyr;0^GeI6jw@@4aGUc-5`i&`%C|d!SA!| z3+DIM*B6ZjqFouTXb~#PhM#n>Yc#xmJul$uiVTL!BA^&MGQzqDuO)7qa83kgLkJ%? zH-O_;F4qm(ZD9^0u9ufd{@r+rVFE`~mA!dOv$Z}uk-G2|vk8insRG=Hkst*t%cGDw zH$Svag>(^L0hZ#EP7;6WLHZgZ=H^~*ZIDylp5i#K zQ7;0o)#GQ`eD#W`Co9V%k5VO``mn+isVWI;BF;`BH~a4rC=0^Jj?UqDmmT!cX+I4D z@761lc_GP7B1x~gcK;_vMZAynOZ4BNG1MRQ`s!s-PuE~n+91tTe}m2W6f}NmvD)UYC#}%wPC91{`->z)8&%9$TDa(_J_5Z>j#zKa;LpO5W&~cnU5r zS!Ir8rJ#qPcyhCIX#^4Pb5F2ikz|w3A6CszX9bazNkwrSrJznMl}RO%<&a146Znq( z_tJ994}#o&4($roZQR=!U4NT9+OV%dVT!tLcl9)sxO6&KNkb2V#@FAn^Ol|CqR7dX z+roRpjc(KW$auIVGT7;fRCgw4A9AQJ;?f9!WGv8J;wmM(8E3qYo0qsWFWxkVrcfxE z1my=)(vfz>;+c&g?J4tz6ygw@7JHlDUcs1<5{{BM`gU z0NWB(7lhqn#u#?Y&)Vjmv&ZpgJc7AyuJ)pbNK4D+XKmlc$aD()pkmjfY%ra`MtsH( zBU>~Uh~wxjCr3zoG8Ol){o8QRP0pvU2$VbbA+-+rl8;seORWltvNg|2+@l~4D~KEg zae_ze;}LEip|DxbS+tW{QfuSc?B~!58)3@{+r*}@xFh+z>5$=P>;tDm>=UQ)*qWWW z%ul{0G9^YM^oiFDQ|kzVBx0{p5|vS@G^r#MtWyL}s#EApa){>5BuVH|AoQ^rJrrD9p^zwAO%-_+ zqz8L+IUd63AzCwt(hS0-B3flcu8gRliHuB@H$PvI7tK_Z%ZPH|MXIt=Q9V5cy5FZ5 zR*+@|p{U1$aQO;K?+oiZgdM4mvJMRy*hnY-1nW@Zc~IBY2cw6V#17@=&p+Op zbjOp=b}m?j9+9zsCB>>t{9LP;{9BT|KuTa$lc5%ov44Y@6!=AJ0&)2*N&W-L=iV&A zBma#g{sTYes!?blLVSvm3g!_>zAX^Umd>MPRy`~xji7&Z9K)j}dK_6q?a&w@QN0sSw( zp#@UC2EWrx7<=C>QHmM%A=tyQ6Ic~6Vx@%mCh-Eab5EE)No-_aT_RFSW2!J4!)Eo3~H6AjO#5t>w5DI0;WR5yaB9q~qPj;(}l*vuQCQ@LsgpDF~Skz9hK<)87 zCGPk7IM>8G?Zb(xAsfYYwoL7EEqd%32W~nIpX487tag<_N;1a<5;FEpMvNblWhI9u zbc`}Xqc%#I*b8Dge&CX*r(}F;4_LG~Eh(K$$o7VPz6ig2g*t~ks41xCy9mB>m6KFN zEgJYCS5$~UiJ=mqP7Cxe->HNUR_=~4?TLqI74Hst=AWaDtGJJOk`}+Yg~2bG{-w$Y zln@aw#@5JGxP|zmPyx=pKqiXy5kKHd1Pu2uZAOMzrP0gDXN+d}$@{Fqp_&YTf!C-rV+p|T)5fZ!bZsEGrW|f%ugJ^oE-C2o=2SS8)SsKD zR^*9vc0;{LjNLTKPV;DzgnzNuirn56Tbpt_s_fqCzX=5Fm2JRpZO|7zqep)3J#Nmk zBJG*X>@)IR)S3L8GyJ`a-{Z!88nLq6LHQV(~ut*g4@L|%BbQtQce>v4?8 z6EHksev6}PV4%m>;u7)jo8bdOxmakjKXU(yU12*7^PF-lbu z#=o(;eoeW_8XT?*4CG=4g?&PZLZwTDu=HM_o54Wu^uGDiM*&hnCYd@nw3hk>nt+UG2>^+s9jPIW8{S4svI3jGX`xzsL%-BmO^XP$s_{$;fI?x_E5ysZOjL>~pi&{3?rfebTX4p|Gy9D0Ox|S19@!)t!(8QNz|0n1n4h$oOgZS5 znwwQRKl_4s833Xfzsc;>3GNU}C8E1%u|@%G&-9C+^y|GXKAm4JU`Xa&u}nZJQEb@kGtKT9ottovx*SxB$upviD|5B^a7iW4~ zi%fEv$gI+uNgk>e`R-}j{HTE^tIjH#l^8xiS1M+==C^i z`pU5+ZX>Ut-!Q*Vj)y;$fzFC7j~f+JEVRk-aP@U?m8Fb_{}XVgG69WJBc`PpE~h!e z=`zp5Lz*ExB1!o74TsU_fSSNr2yj-6ZAjsh+2XT0`;!Htr;rX0R8M70C=+OlW9^;z zyW^5Jgjxb+W%C2ne6>zThPb#zCZw+}#@pMpNUoJDv@)JR^6Gowe$FGXEcVtC$TPf$ zw{buCa_Q@__hpiJKhV#hAMDulS&?Fbg_<3kz8-ZyTMWefP3LbEzbf_jAgdu%7R)NO zpY>KN&t`yt#)RaCQ+0`9Ww?1< z<5yKXItm!ET8@LCifUJTk^wat8LGfKZ+pK!v)Jd=S9JO{%QNBPZPF|fi$$%)-pazP z9Fy2l(^H<{igD<7KK?q3L&-^!?2LPtLvNi*^fo?R%#9Y`pr7;o!csJz=uvH5PESE% zLz7|B1cnPMdlpJiPftl8cJex4Sui>O?je9u4R#E_1@0`$Ix8}Q*IV zcgN09$BvNA*|w{_Wm}7VLYdcG>@N#g3`g8qcPl3CAM{~o@?)=>L?X8~9%4}i-170_Aa zPdH@0s<=aj{T%4ec)UNppea*ab{6^0s>NmQOj>52$~$A&ReVOam)Xy`I(6)rbkfyX zIKy|*h^%hmfGqZP5^PYmrZ~8|+++(5*P6WfUNa+6NsSuL+i@wR_6pY9ktX^;=)jwd zJ3Oqr$#vZ&BWVm9AFPBvrR~T)+G9Zdsntxn>D4~Gd}`5dqH)B5m=6mxz{uk zZ$mu%|Frie@NFE|{rDbOT#Ng@NGu2t-~oaMNbn{>g7+<+qHd4`MM%8FLziXQR$|MJ zo!FLTM@mgOj^p@<6UXsYJI!e)K4MEr+@wuor*40rv~^oINq6q$t_W zukGjG&!2iCu$bMQdGp?z_kA<7J0p@RG-kcVndP&jw?%8d&!bmonWZ99^rk|m5QC>u z*b7{Vd)L}=uPYa>k&0RTc1R2LD)~0>hT;VvsUtwJ#6nUR54t>^I$z&gpe^zV4 z=Cgi%H+~}Z@;THH^iV`=CtQRO87lC0R?Sc_vohdhA$$>w9 zHOj&ax6fwu)Znp6sNDn17l;ys%!J$NThXgo=bZ11l|7@M%f}Hunj*tbjlX#D#kbO8 z{Pls^n&1ru`zVckKrA)dGgUi!_}DCIP-oDuGwy&rPeL;cMay)0xkOBl?jUPWV0I!I zBA>uv+Zz>?T3V*!J>aVV_y&lN!2`mC+aE~sos8&Pf(6Lgk)27~Nqn!bzbr@|PX0!`y1`rb0k*i=|(C|GeBbkzo_q_);jzalY&<_l{Lv^{6uzL?~kUvf3IG8`TW zT04}szAC;e*DCFho>Lo?Vw!%8lBjKZgH0!^a&|*GKQP-0a6<>K7D_gBRc>t0?ZNDqaCYD!4AydfKh$5xO)Gwq#KWMNDulwH; zc4wWlcve!QW#>$6AuB&exY^u!H_K$qYg6!xrSkn%ou-YDk;(1ce3Ik}^LjeDeSujB z&mQ$Ql7vJ7m4wvu=V{cSBnoK)YUKe8>4RFih+x=CoRdoB<`tJoW-^?U zn;i2-nR;HfNFOBXFJG$=J2YX$tDH^^cj=Ss+ZiOJpW--;NkNKw-ey?5VzPvOh&qe+ z)X|$Eq*Kaeh>@o$PNA0JhZz$c6#2AR3M!YW6?oL)r{urjUCGd@aOW}&Kt$F#nM-@d zI;VypVga1(ci?~es&M4mu`G9LEDOK^4dbGbEb?E_iq46DqF0~WT^oFnk1)d0 z8cIfOGa77au})%eS#2&obQWATs|&O{nw*}X-@xNdtVZ#Efg{@_lbNy|4zE!rGkT$B ziA%pG&xl4aPxi3F^b^i_fz{*zS8)P((!BW5xjK%5Yvg*BjLK%vTU27DM4Pet_GyMz zLfXW9>lM>xxmqS-WGeXw1`CI{;VjlH^!jKP*cF-h-_+a8)4-MfS>qEddQ_Gn&pFBdIBJ)x+b))EYKJV9A z;`LPCZ*7qGX&UEeRElWw*CLr3dOKzXExK2(kWdV(mNQ{=1ck~`-W}x2R1W1Q)P(9O zLc)GgMBps|gpnTJM({vwjz*c-snlwf0J|*2Iqzi{O%8{NQRpvSf>t#GxqO3?&s?UrM}BC<*n`ghc*D5qfC<@{CRNCAI2Ob(XT2siI;3Pi_PXh>+PRT ze3^WcxtVaIRbXw86Pm}x^w*6}_C}%}s($fjSg@oRB1)Y(H7^jLaTDc5LH<0pXMB%{ zlo_-Ny;@F(1}ZbS>VY8mbfZ?SXGv!7Yl*=(ewrA*AXCaj6oi-)Kl%d@1qZV~-~uen_g6V*lR%=;KfA*zxq&9vy%VGKho)K5ha&?!$aQ3v|9_ zR1@cQ%xh|!JZbVDCXh^;yw6+^$){v0okC}nQFKpN=N6h`4Ja-Wlev*XEBW&sPd)x< zKf)XlF!LpH^zp~Y?O&3xAQE6@;L)!=jn?WveMt&-@+(SAA18Lg@00NR0{(p+u@k+0 zK<}jvLJW=k1z3{tDc1E=E@St$Xwb{mua^i-^m2ExF2!V|_MpCrO2;y0nbxk;+qII! z-D{G3PWpz_9y32r?KI(Ao2FC>D`SaVqQGVAneX`c>zP*`eEQh6UtbEL?_*Ccg|7Dv z-MDM`h7rGS5WY{0_$kfgi)VKYoch6{@O^CS{l_|*4z7#}-~5a)`Hsi~Rt{1!v*!t| zf_>G&uPc1<2Y8wI^k@DVv6vq~EYB7OF35Le8k0(8(#R73h6h*>4uZ)mH7wqs5lt_m zHKpm356Nk{S)#;eutyd~62GU0q`-DaVNglM5IU*NI+d6tBKt?XJZRF# zo$p5RJgZZ(nrx5N*D=#vHnIOu+nZ7qUR`=Lk)S7`j@yW~aCY!Q-%w6pV@_XRP9v?# zxIn1%wfb61#VegdftRzgn9d!RSHRQ1i#Ob;)bJ09;tnAHfCfZP?_S}ZC%kfbYThcD zvXLl^nKV6FIdlJ1)8a@4+Tap_oxFT_skLpoBfDtZi7hAOO0*G}Qoh)7pf5k8a-^y* z)>R@$i|vBXG*gho@V1WE7WCC*W#?xz3X@i@Q7iP`EOXJ|Vx(^WK!u!Qf`jv@m1JL%iSk5lA`g0H z#bIl}r8(~tiHL#=rhJWSd%*5{S+iHZN3@p^UPH#OKfR9MK2C0FkQ(_eOE-<=(_bdi zO}a#Rdfi)i`#Q8a$-Ocai=4lh$`xs>E|b|~QNE=yCT^lG{()jkEsnR6?fEUd$*fVY zlhY^AmJ=cfia!{)(^DTj3A!G*M9@Q`46x^#ub01`gCSg!|-0a9y zPh@Gh#5?eboz6hEOJ}n;^{g# z&@$EJ5-}pHhy1|dl&B0!GnbeY(G_DiAr0M%-qv6;pr7ADM8n~D(~+iIn&?<~IecT7 z7D2D1$XgUDqC;L%CPnW$uho&=w!gJ=y2VA_+w-|2UB34HpL%f5@K;uD9W1gZIEJBbteturqMMkaHnZ?Z$l| zdFTQWz90`)Gx;xD$0MtXNL$4c-QdZ z4wnsoce*|b;-cMv?*YUOKws35dtRHVg@9j6SoAt~ELZ!ofOBsF_NE@IUWai(*9JI@ zA8DoU5z7_gi}PYuE@os33F%x5$|?(iBiUtsPt%BM6W`-M$u&(q4NjZCH(FP z*8|VDf()zBUSg&Tg>E3C?8mIBP;7lAZ-=HV3D1J*Tn(GOmn}KI3eC4Bp;;lu(Ci-= zFVoJ>*6-~pRfuF#MrNoSnyVi?K9px|To}C)EVoW??atX615ierJm?*UY>z#+BOb1p z+<&+oLo!Jm07O0xHQI_0x%fiQfVU^??dkD`X%#qWRkgNSYYM&6KHz_uVPANDq)H`WXeBEvA6aZk!twQDB`XmFCLc(`aqUERF!KkvNr`R zE(%-Hu~_cf?z0D879lVOpBDVnp_qPCuX}*s(oreC_&A1Q=z>!wkye1>2LOt{O(taI zA3rJ-gO;ZNi%;@c9CiX20|xT}m)-&hT=g=MMM@#!@^4#>xOSnJB5{Pdx}(Y!W34Rl z6`}ZK)3L8i)l3ft)etYC{(wBcW2Uq9=(eDL+builhddaHeF79~-JN9%kIa=nw)ei7 zO1;gZkSp~H^e&6dX>)fh546NvvXpC~n4!wY(E6W;z`s2SNL)&^5%F;I-o`_X)ICAc z2w`+tkQN2WyGzKkelnDEPYwlGd@CRzeIrdt4^d=({RM@?p(q1TZm)W|sEF|b95RD^zbBT&}quL8-O*_wg(gruRj`fK{D z7?I0~R^t2NPuhjp&tEt#v%Q7Du z>_V}@HovE7oR1B_qg5ZdE)^XtL3GgK{_Nd%eAMV5&{^iVT6};ar03G&gY!h@dAao! z^`!fij~O34R{{O0vCqZJE2i&{qwiw{z0>tw^Bvj#-sv#hnPU&{^*1hke%Cb*?=66D(2E6nP4>uL>w4sGt?iLZF7J^)C)J>#MYZI8 zH2Fk{q+(Jk)#?l^+HPDg;XC9K`nFRtiZ!W~T7^vXAab_JS*9^CQ-jD))DWd%TdGI? z6Wk+zIcO3GCe!-kl^@a{FTYBET!MxI4I-&RdhxSzHOoM6Q}$-}M3vbV>s@ZPPwGN|xd)Qlieq+>sIf?p{CZSDS752&hXV}-3#_k>~-O*Nz ze4$*<`kSNm;ju=Sr}IG9A+bV+L%Hel-7P+2pgmZ&qa`2~OQ2bcB$`m?_M)!EZZB8f zT~IUDluf!D5A+vmEq0YmWmMZtc9%V~tixZ_UFtxi-T*30MyR{cQx~vhnGZQ1ZOVXD@nLRN&HRU z-|q)}1OohY=qEoM`ZFnv{WBWPWB9Ql^j=z~Q~@58kuc;}MJlt?XwEXTkD*6_6W^v1 z3*;SSrP=;FJhcNKzeCgUDx*#-r;hV8adOGU39&*?EnoZ^vgAv@#e3j366Ik>xOG=#UvEX0Mwj0_dCRE1z9L^Eq0nFwR~+#V z9q!JiP1P+uxueJXvX9LzyP6xT&93_G)iqly?PO2ub-OFLx~=m!b#>lx{Y>u~v(*lM2O;?o z$h;S1j*z^QXb5|X&Kq*hr@<`3*owy5vZ5R@lmC)+vh}4T#+v`c4mOWA=_o2FqBl5x zYIpRu?fI^ziKg0-a%;}eCwB}S8_2bUM(Uel5!VCz=PUZlY^Ji2hPkn9N8NZ^XSCd8 zui4YwHBoIQsoGeZ&)2l0tazZkk+WAdbohh2+VVZ&t!4hsNL^+|ZOaz&gVte7UX|Nb zQBrI#-kXr-)t8rMx@xPcobI{;o3j`{al8|x(g;#PBkzExrV9jjUSWS(JDI(4e_M1# zJZwVC+z4A=#NKOtcRRQN z$nxE77bBH37tf32Qot@b^Kb8~p(BE}#U*XDT&cx?`x@E@stB1hnlwOrG1IlDWF!ln zZLLBo`Wi)3Bx)}o42tor+5zCz4e}GyKT@Naj(vbx8Gu=0`o}DiZ^Nbc=n0`e7EBu( zecgonV)_3Gewpu*P3SbIBq|Hu*fo)hCx#&GB_9;2OqoWr+pIXHG9-RVC9WlJBy%m+ zUnRF^`;~~*gHr}rrcU9F@+9Dt2d&_ezlbn+AJ~U8>65Ep&nwO2_qPO}T=hzz4vl~Z z{uH0Q(aC32NPE!W7!Myt_Ly(1jzE3<=JHm-HcFHuxM-z;eA zfY1_sI#@|k3Ym0ukBy0eNr&hTynPFHr^EP4Y|~soJj0b zJ3Nt4wn8i-Ay5#Dxw7`a@ZoL`U2xm>UDtMI9yJ9A>$aRIbk^>u4Ud*v$d1UdJyltC z+vY#n(R}L-^Zi8<=vK+V=ONQoC>7z^JGR&Y#ls7&CH>W|f{f|AcjV?Z4P%YIN0)Cn z*7*^9aoSjCIfY(f;GMC>CZ`zk>5J!~S1-~ks9RXIY$JCpRqGYJL#83R`z>7$@^%x& zL<922dFOSW^A4rcp#zeZoF{6|OG|3X3-df;+V_%qvi>Fd>i$@~p*t2|eYms!JI@ZE z+)c_s<3w*)h4n|sMWv<{E7xvENwt@*PFRSvk`3|nb= z*gLpmM{-^fdX)wuhsX@8jV~CSFA#FubLs)lbIh>dc3*tAaD#q~@$#v~+M~}NU4DG2 zviiug#}2~x^?}hF2F7pdcLzqVhwlM5b^O$CAKNqZ@E^W#&+i|{-|XqXx;3)(o|g{@ z-^sZ}#sobXYnXL?&#Yw?tfQY90+T?)o397o{m+?N6dhhWcuA9JXoyJ8ErL|)h^lag z=>?%D^LWtld^!GtpTr1IHo) zcdx1Fk5_F!xy^5EJ~8_*R4*C_s!$l!Qn3=cWCo2!Mp~x6_{r&_qLBulJJ&5y=oPG1 zrBHi3w$P3vk-BT{{MzClBzP=y6cAz(YRUI%URcwsc_G=Wc^-N-&!b+=fa!VOApVPc zHIryCvwm)*N-Gi35Y2@K7u&8pm{~W`9aN&Xy1_GRiwCCb)8`h+i7huzR2VZ|DpqaM zWLUCtuQ-}1%*0ByYPE**IMSyUhYsMG#rNocXAEiR`8|xDFCg@MPC(Co`OsC-^YRUd zFGtUR*X!O)4QT#la&D3Qtw>|dGMYVB<(md=;wCClNWMXy;0%c$q@EV2;>R>~I+o5( zjcI+e3^B@Uu3|ReqPp&lmVU&GUh}=Y%oMz!uA@o;MoQ{OBkuPW5c~ z3C8+(Pe6fYfq`3jPV-d9Ri+rVnVip#CK<{5_kUrgLTfh5S+!9m%rj!qsR#0moY(D!7)^=huTd29LjHO-c+j-`Rdv6cV;?=7c(_ry4I>UaJg ze}85C{^L7qGj@LN2m6qB&+D2xdUJ9n3;cTky*EJQelOE$AuUdpWHnk+tJi(g-Jh#@ zPH?R#y59LZ-s9}`|N7}Hk#{3Rcz++7&Jt#`Fe(g&i+#l;Q*11zq_f);(125K3ddbF@>-5f=(W?51&JqP0sRK(jmk&;s^LX)znSZ7Fu8tS{%$Gu= zR2Z_{*7bOC04()5#)})ngEx)bGeRwokOzlJ$uN1S?_?iU-bH42k)kd`7j>qTyv1_X zLYZk2jU!(UE~6g_UGOYII=t-Kz-<5fC(bCbR9CTOsycn*jGW~Urasaf{}<~WMcC7jM~f@(bU=(wFWe}hLC8+oRRoN3W>5Y5*c(_IbEAV zqA%NM=LhfevunSmPl6||BNoD)pRIkU_SssRsU<&K^H9yRHT10^)Y$L@KS^nMm zoa=Kae*6urre6L$nu2@YUj=Ygl(i>oK1+lr;x+=U1XXP85oq)4<;GEeF&Xz*X zBlup$24@H0-dpg!$_>u$qqdL(;sr_~(xJ1E5`~m5oTA6qQ$)|DeCjo-BQ+nyziW6_ zeZ+m1IhH{&KM2=By{CtpW1^1#p=QzwmMukkYNYWIE z9=C<^`!9v4?I4d3;SK8z=L%c}E+TlJ%zQTIh@$i?eUuQkDB@ud^CDh1{j>2SA87W6 z+OAM0f>OY5gy|1fwRqX~NKSnr2UaDf#oC;TCU5Qbnha&ZP}{ZS7_0i6(Jqo}fJ?Pf zdVj@eTaCT6$!IZ(72t*~T8mNTs_4phw+zRd583hCcA(8J;Jyb%%LV6J+C425o|YC* z1+B84BUBxEXEQUIqO%Q0OiArx;QH`~J3{LrDwH-YkisW1f+woW+dk7$)E(kb|3=P= zU1hELgWDXTo?s8uS|pOl#BE#08zbJvU=~CG6wN67RS_420FM6doR+doZRt>rOR3XJ zWDwx!?0SM(8ClWC^V>I`l@T zQGS9|Cf=tK|4dp;2Gc{yccdPo=AU>Le&G#6oxJ3 z_wpzL%F8;7o}@fmaLAIbyFc~84dMM;s>RJrDyW;n5?tfBQ=-Tiys|Kb3K>O z)ND99NZsLT+27t1ueU2ROM9kUje$Ilm7<0(v1S)%)()53$*f)Vt$V6%2Q=9={@~Uu zQ(k?Zzt*SC5AJNq3ys~prDX4(fjSQa;-D#TA0nw-n%fpFH*ntYNL6-qj>&HBiq%-H zdHBupQn0xZ&>G)QJBMay?jww}?yT()d(B6fp%EYv@}R|{#7}7ST(QwCCuy=GaX`u9 zSMc7Ep;2j#T%%UYE*?QMfM^*Z>N9o&tAkLG)e$uGm-DGxK+aAA&1lzzo!%7ooi-dPpJGS)f9J{@_t*u$>smQr8)8vm76(Ku}4>*N6ShVY)qy<*$F z1igaa6L~T1JrTS#h{>?wdm>xvYwK%hsZIkZAf?=89-ThB%teajItX!P6!ncG7q35& zxCYJ2lQbi$x%P%nHZ|RN;&>f&vCwOfNbgbLq6>3@-V(Xjs3ul)%)R(6kr(;5M3Uf{ zdSNkyd}sPwB3*hKqXM*usylw-M${j#z4X7S0qS%L$4?WPr{&gD>g(L6m=ho8xejU|D>B&>8E@dY z#>wW6$vXRt&Rd(GQ|;9mb8CEoYPX7P>ArSrasJTpfwpV51{NNm;N{TTi|~SF&Zu^INjFm zX{++IwRx&&h4nO{C@ae?Iu+^e&OPM>^qF&B=e*rXJDp7AI)k8Za5V?81Fftrw5$$? zZGiHktMo)eYlX1d4+XRRt*3EUm9whYqZG@eQb&GG9<&~fA+IqIVesUbl&SC7Qdyf( znrmlJfCG(4<|?kuD(x<@8ayQ#zS>;VGx=@73_uc<-fYpTb!uIPM{mn{at93^OS)1$K^MC zT)fw(;XUo9gOr429a7 z?e*MG$_6SkWlE(?Z;)#hVuf0v$}DtMR>{-`QmX}UGF$GWNPBTBXrL6lj{&R|VGh(J zJ9t`dGRX^06Y`={IXMgmeyHN|np}qN)D_X)n-1;D0P|E>|(9c_VL2z1P2Gv9;@yV-+F^%c}7@*b->Z zmEHLUBNu8dsHit-OM6T0Mo%GVCmVd&e}H!Qr!Gz-Oh1jDpFCx`mc3ykOsA8tsir-2 zLH-9x0ix3~wNa@xD*(`CiD%>rg`E7nloeCd4pysHOE3Nby;YCagry7?v)M??@XlYk zAXgp870vNQh;Z1IciP}NovC*5&s>z8CTdR03(5=18Q&@Ebq%W`#*-YEA$q!~uZZbr zk)AcrTZAZGM(wU}{q|~yDYw$Y6}xrjvXO?GfuOmozHRh)FwzjJY%u3J^?F@)h1XW# zHprb7f%fW0ypdvuDZef!qa@F(Rdc>ThO@RP!;)9Qh5DS_7LxTA27K-!humU!CSEYP z91e}rmXT%DW!W^vs0Uk19i;{sJM>o#(9lmpN(FTTd4RD(icv_3P$!`afvzzLDJ9fV z^0zp}ETovI8z?tpfD}vGHGgD4XCkYRQVL}m@Le_`B^%264}6VXNXdn3bod$vN+HNg z+b{is?qbRbBU<4PSo(#WHK0{c2)U6JG58&3Jl*>G$^2_IFBTQ2-W4U2>v)FHrqF7Q zK??SBSU8r^5-ob@O#(3hV@6;nQR?IbAtj>3kZ6x+0FJbT4eY{CltE9Sg_sRj)!U!u zB3wxKw7J^sA)aP(8P3cwW{xhAJ*_Hux+K5(VP8W-QSHN(MRexFlB}#!>BEX5 zqA++dwLiNidB7Xc>N3fzAHrmDS!u9DpFBvVFqfrdZ;--&(|?!c?dfT|4u2*(J-*J) z&cqM#7q#D+3yBv^_=|i>I0qk{^rz5|#C7PC+~>*Z>UhQDYw5e#mzm$*{r6lxoTE@` zReO6k!UqraW13?Aj<668VtY6roV8u9uqjrwT8oWv$Rsw&3PD(HHmk#aMrJii6mq%B zcv7`U3+qwf)i}^rpFz@E7z|npFJ61{#TT_Yva%%Y7%fi0N0~mC1jU=)a*|*4O5&zn z)F0*g9D_wErrHu;Xcn0~J{?Qim<(@ThPaQslk`yU*;VK{jcy{*fp`ZwK0Jg!i1%eAYpq4LE>uU1xMR=bn`=2@kpnOJ$%{KKV7w#gcXV z$DoDtk`C6GT(sImJt>yTa%=mF`aij|Bow`Qz|&k6P)WrGnJd^4tk~Y*x$$60XIYj^ zCZ!_=gH&oUYlCBV?%H!EUal}$l@g;dV9qe-^(}SWeb#K}ckn(z{gjq5ZxK51p%9f4 z=k&G}ndOY?COck)VqH|4M6Og=>eiws3}hA4_f9;ow%OFLjDL2r>|j>gT=z9c?!HSD zi`_F(tT$6nnf0a7+jfMfdkZc;@L41=D3=5yJbL?z*d$h|2(kW*%|`3a$f0<8 zAq|XPM^S-b*Z95tHTdZ&;fGaSCDgDvF^w1@Z)X(>Hu2}A%>;<~4`jEQCh~bs3}&y+U2|_EZ4y#S=ypU!m{E}8>sNM3i0rn*8 z*1n-f1(niyL~#ojwcciywFQf;!x#d<-SZ$mqF627oLb46^H zm{!!LGZG1F*PWzT5NEJHC@gVX@|S2aKZ2KFx+oFnuH*srHj-rG1o}jO#+vf^YNC#7dpDm}l9T1g?^9VgXUgU+HiJw_L@C%g6eZK3S2T+Bcup)q9| zOq@}UilomLc7-yHGDc^z>tw79DS#5R;o%lP_?Bq-tx=3C=`#UVG}LeV=@Q5tAe6Fu$x_(UTxz4*orOC5j8n8 z%`Q#8!C^M3UTkh4Nz&xZuu#8t*fPkc@`eJTajSB;XB}4OdO^XAC{8J=IZYM#* zX5a!OCw8s?Cl(cVhGFEHXLL8o(;Qj)@}ukZYC%fdCUcV+k>yo8@OU8sn<#6P`ABcZ0`wsB}-5z7Ak|RD%}+ zq+0ylQ?+^R6+VenB4=f;()QwxZ52afLlwTJo#l?o5}%x5w9?Fi8gEOaa%g<0l775= zs5(;x5v|l{u;~p}LsM;jMV_y`ufDje)Gkx&WsKJB*BZ59e|~wsue=xP=Kvkv2|6?p zTv$yIq7{WkqYx?1=x>rP3SGpK6q<@x)#6UA4n*C_vhO0X|10(d?JSEh{o-yc-1`k? zivd5yf${6iYz-O#KFzT@W@B2IGp;DK+TNv8=&% z(m<bL(wi4|sp z!7Qg4>K|27ijhg4A@@FISE6aWiwo3kVi`lB@jl?H0JwStxbhJ#;jD}mZ+5m+a?a!F(2ip#_Bl9+p#0W! zeuG6Np}+A>TB@?>^K_bD{X(NFfHW!n^pmtiVbbRrG=KBIsJGQCl38fMVwFAdXyOdiBMa*BDX0fWnfyR({HZ!2Uf)cGYUNGDY;ItG1A7h(A}VI->vCD}}5z&ArSVBlGY zIjNUrlIv-g+iS<#P9C(?jI}jIYcocMMuH95s^O8+29J_Dzx&)m_^ltK&x)D*XTSMK z#h&9We}O*n7UX0;WfmPIG6~BQ3iCI~7Q#-jP&7@p;!)e+ngzDd`wDoiZ@%t$w2m^f z(!?>bl9fLAxSkcuzsqPfX5DQvIoWT}>kUR7b=Q(YZ#8NppAv~A@{0z%R%tsKpuD2% zh+@L=bq#I&78L1$S{IQuLecfSS*OZg`??=WNUjgf4-->f=p78HRC3jsvgTZk&Qs=g zRTj9UT9KT|3f8+T2g+^Q!oK<&$Q>qftKO`&noQ~^Y9|JoGMu3tGla%@DkIC7%vyI% zZ+^~}T?=h@Vm=*|PjsAUBXXW-w*NU<^`zU)6d-nMfn8&ol5~~F3N7i&7_al6UUza4 z(shqR;;NYO;`bCTJ}af;gT#y%19*A%%X^Ybo<2q0jXNScKRBM>}syWomE?$ zC6-D=tT?;0&b2>o@|8IU$0%Ldw#IDms}i}+YSfynrqR}(VU5|SwdB`kJ4(Dps3@pM zFBe3OgW3E7q$)~yV_ zyZXWh-qu3U67Gg0yP(meZMTAr<(hSg=fTlRNRQZ_5ssP9lZoGvO3I`&J`LTKr`0yI zNkg%$+Si5rB#u(M#FH8-~)1rilh8RoWbH^(eI(3e3Z$(QAx_ z?ZKg8nbtz~>5Tb0%O5Gy6W$6Etb?{(3~f1|s70I?1Lr;;<3yaR!CWe@$oU#*6@SQt zYq6s?+T6Oc(rj-zy4x1Wwt(LgOU1^l;;fqfGAqUHu5TDAH4dshRr!_MIAeY|ub?hl zOBI)mcLl2V-L-Y#!B6x{WUNT4R+}`?X9;dy3Y$GSk?obf#v+@?Jbb8~bA_7lo=0F4 zMWQ*vKg2t5>gm{!3Kaqwn!{V{4Ha&x>yNWm^jMH4CHqKs9W@z+Kbg% zImq#+R(-CPpg|x`Dg^S%1c_A=-e+xWadBQAorMIZ2Z5DiPm~fE!j#p;ChMs3w7o_R z>t3C}!>YoT10gE(i5rewZwWLN^mp1SN9(GFLblHbS_;i`EghXLT2E!}r))-lV_>*z z%eJk3ZZ0f(0(KFWy($OgC2wvd2&7WAC~`ef>qX zZsnH#;@T_)#de?AS^D&&JvYGTgE zL952!S#yMJW#xaP(W?wPz2c5wf27VqmE(D&lvzZLuXLn*3 zv@y@g-A+D=%g(S>Zf|HDEi+jg7e|Xaq*63DX>bLc6+OikDr0+fZGVxWSM4g#DI0Ve za%ytWhLq&3{=WL`qLIUGk(;I?TB%s6(5fUdX!jwd=&c=MapE_O!R(YvNJrunE7g-HdSt{_> zO(3Z(kd%$c2K{=Um09xhJsvvqTS7s_YnuK#Zyj3etkdVf*7@qJV~6LDjtq6TTFVBi z%X@>Cd$x{DMVeb08@f+e3_11rTiUt@w{(+Z+jb6biEPd0Mk=yu3+>jtO71|!J51&V zDk_Td8(igycWk*Hm)_M}QeIO7(jhLL61@qsQ4pHv2#T!uxe zDWp=*;Ep{-vnTYdkyhBvXf^js4>QL^8s-9_B&1I$#ROh@Rv5PC9V`8Nl~SpC|2+C+ zE@;d)9r}YipO*|%UdcI-p!5kaxI*y9w9Dvfp{6gMmYi!N2;y#@NbgnXrZoCKPgKSR zw4Zu2Npu;eJsZ+P0=>CPqEXSStHkK9K;u9c#9adY%s$ zwadPkMt{$fylMlwQT~S{v3;1XSw}ZvdX;@uQ4SPOqc@e!Y4qtU(A&zlRqd*8@uaRw zqay-+evh zn7kQ4pY#5XC*Mu0lyg*|f9EOp-rTRPr@XAZ^ZDP%zp$SCH~If{BP!Sx(4^@0!0(e( zxOEM^R8&xOqUcw}O~ntC^p!kX^3Nsz9P9}m3I4vct@Jac|53K1?5m-S(817a;*)0-8SHffXo->I^F4W0gz=zEpFNm7-*%CUxO1v*jnQj)6K>MfW?tD{$; zul%Rb?`uLe57&lk&(&$`?yvh*{Up#=!_x49264kg!_OM08^0Pk2=uMUrKag-s(GUM z=Pg@W?rO~hnri)4>knGbw*}fBXg9ZSZ~uAw&pX^56CHomIn#N*tEH=_>r~h0x<1#f z@1E=ab!bU0eXhQuzWTnNzMXy3DO&D3-uHto;w`Z)|J2{w z|Mh{afyseiBxx{naBT3=!G9j=7p(vn`P-3y8u{(Wdt2$Pimk@2 znLxvv^go<_^I^{q9>fX_Gc-lQwCSHffVKX_Gc-lQwCSHffVKX_Gc-lQwCSHffVK>HnAX z@*dHit$WT#_0hTLUyn(~W2fO@%Y3qV|4=U#B_9%HffVKX_Gc- zlQwCSHffVKX_Gc-lRgIBx=EX~N&oYRAczub7lBq8MH@O9&?i172^*Cs98-jfY7&lV zq6lAwjzwwLFocEb7mme{zE3!o5C^GG3dd3+kCqC@GJ<1t!m*tCJX0bZv&1pUPlRIy zktgjDj+H90^ssQO!qmp)}tm98-kE{CVM+CM@Qgg=10LH4LFJKO`KB zA^l0=SVB~rzatz=38U#o;aEm!%4#KckQmhoe~{0B0JAX&{d1hqS%K6r5YczhdwmgR2k1=LEh| z3DgF^#vnCD9D@x7Un5xqtq{neRrmx7)B$fq7 zG{WyOID=B7SQ2aN$mcUB)Re=eEW_DxT;HUG55c_)IAs~Gn!u9dAbkp_brbEt6Ov9G z-#3e8TaE9J;VWXq43vo^J%K+tfurQL98O=vdW{1wNe!;n1D#(2F5+%H;Q@S1e=IsOPqw%8C=#8_;m=5mav`{q0})rp2nr|_KV~ZhtIu& zB>7yIaGm)wXK{_kaZP50c8B!XjR%SK%Bt#lmo zAICLbO4&UxGrkmF&$B|k_*OoKuUzFgy+%lChw*)Ut@p$4z-3;|hjW|3IUK=qSQc7y zy1bLtIV)KD0=AVULCcFN8;)UJbAl)0Ys2%nSGWdw$)iH+6C^MY?nx9xe%{j4BUK9`vAJ1W?53~M2dYshmq zhWSWZ!+O87B;3K<=fY(vlc_rRKN70(EolPFbV+EjJl62#`cvhsuK{m)hp?Q+aXZ^c zW`~5D#xY(@V`NC8*m~Kcd-&Fv1J~!S@xvSE&hzl6$~N80^B$2CeA*J$-1r*bvc3kZ zo@6~=)oC_>YQoor_pnLaUr2fD3GA{lyVpekxkBq*^%koh zG|A1!iLpLnOv5?W<(JE*=H%&$p zX;D>rd-%xt5v!44^6HJfn}3~mOUi!z-P1Udim$78lCRaC#A>TqMWUn*{X{aNMUiXr zcP!09=5fr*#{yGn2+MOlhIxqzNVS~OWx6lnbyz59d=a;j=@bvicD>e?KDt!X5uUGQ zI?}AQ=~YP_!g8GX6ZM!xgJm3X@sf$9aWH{DQJJf9*#}pQr(ws^Rs1pU`6qAQCPA=f+nTm*+wN&i+qUg#+qP}nw(+-Z+vd)_ zcX#jZ(?0E~tU8eqRVOp*p)&GReDMv1M|(}IccRzV?z*s%FM1kHMe7O`!j`Wy7}8`9 zw?9;$-fs`&S^`UYS&?Mit?3qk`$Pk2J|86gl{n~&d>%|UcwGW3mx)s<1+BX7l+Z&n!Xw_X&$l(ahv?bd1EVa6>wv^ z$L%Z*rWmrz!EHON8^=%!dA;vBa0NnspM@aIom#P{S+njCE;-Y&rzUW?L!M>h*R|o` z6XvVz1IvFcdACMvzwT!e%V zd4vAbs#&$Ggt(1eqCx^f#(optx0-70=|CwkI+djM>V|^GjCfk(Iw2QzASsBJy|Xff2037*xd^!A2)9 zo(^UV9c_V@uz!N%o)<8GZWpFoq@xtg zI;hU%0oUBHw!XiWPFki`=F$}IB6J0IwoXt4?GQ!#_^GtlJCrMB59=@;eJq{KDCd~d zUt<1Fj6;xA`eD=EnKfuiLj&|zc>61LibhCoI&AU@x z+(IqWl+x7whq$B5dueOn8to{$Jvj9Cw_q+tXi~;8Zx4@aBo1)2lYRNfE2^f)ZOFPZ*@W{-5p{Mlx)6%Xof(YJ1>&(>3|%J0{PV7 zS7Jp=TJAyr-8{@O2Zkcrk=TJFDJS{-z_LFI2-f-`46x81Uep~xQN!pUN>Wk}kt)H# z3-zZ1*81e-5kTg7jO-t_bUfZS+*-E2D$2X`yn64wA-U^pF-k=S_Hq(j_?;uJt;2;-!`&)ovRFtm5c zsf`?XLpjFT!ib`$8E`ogqt8S-jdl+FCtFJbU%CMKGc^-~(!$W)YdqHah;Z{l{Dl-2 zXb&$VB37>0;V%?SG$2NfK`xIy`_RW0eK8FMaFi*teiS#j)OMtWg-J|l;$T6lpa{H>*Q{M-!=3bP6b7W z1uZj2k4E8ETVMV2NP@`0dPwQ6p7R!0o*L5sXq?MCSzqCMW}BivpTqhlYQ^w`@; zo`Mvc@zKKGOMTO7ixT+=Tf9Q~ndpet&jXR8VfFHc)9;7gAF~x4apt zQ5>2%s_n_~NFUY=asKam61nv?@mg?0%8oWp4*Xc+kF+!#NMGho)T1vOFKp7pKu2vQ zEnC6cL%T!681lNx{inJ;msRM3Lsq8;*yE5kxtyGs!0daI!Y*_-+CXG`5@EJS5^Lf zAuml1`B)Dr#95kI!ZRMUEhR@{3)CHc5qjDnMiGG#igosEzA-$(@5%q}+4eW3?165$vbeE03subM%=Cl+ zM)V|%w!#k~*c8+fQNy6GFo0^i8T}OX_z?Tp(At1#Z`rOXF_o~khM2*|?#y^A$Wx53 z33;{^SXrFinq80jS9V_e{mul$mBeP66MDkR?3-Mu_z<|Zdm1|Ef48S?FDGP!D^g)a?o1Tu|7t(E znG$|2k`MpL2e(6?yZd{8U<)G14B=r+Y>l0q9Zd{u{!_Fww1kIYV&vi^WF-7gS&NX3 zll@=k|NrqHQ$c*kY*K-!!k_A5%W9Vk{W(Sc ziQ=j`IBal@v(1?(+tnUjPb9kul1Xcu}rfWpPVP&6RwkN zp!}dX%vX7dpZA*QnFjyV7olk`zw(QG;_?aJSfmV~qps+yjgBk1^%fy_>ZEKbY^llT zZ9W@{BsIZyo3D``o0bp`AH<_n==3-9(UIqC9rP7oVN*6FVm$SYZrcM-i`Zsl<`WX( zef;z5vvb?t{tq2t^c~o%pDhQeT&FLcC%In@mr{)4M;-93HCM0AH}e>Ggano{CYkC7AN7rNV98D4GXMaRt{tLC42>q^`Uvm7f|}V1I_&^pi$EeB>Hft?iS-N-XLl|mGP4% zo^Txt+NC*Mm?ZS2nAuWS&=ZPDOw*5B(D#b(*$^{l#02xWckaa0;~tiK2af0!EW&Tn5kDru400~nJ;~og@={RJeN_uljLur*PF@aHU{>0zVbV{u5kZ=k_V3a3yxGhiH6O$Np}7RClHNUIZ_0BOqJM%9JH_S z_q)l`$|23Bot1Z72LZjxzz4{?(j!-Ofn2XCuHY?-LJskKCz#zGHeW50$Ef?oYuavJ zo?Nl`(?2FPIoNgO-e%!jb=p&5-nJP1-27ukq@?7(TO_sJe-80q)BM^4Y*i4~UFIt0 z^y+7y=mJ`7fdQbn;DiNH4{WgB707lEqa3=2tqvX{o+86K%Jr+v@!y@yD}7RxkTq)h6q7R1v=m^ zo5KETtI)yBUl4tEz_&#}zxd8=)Uj6R#YUG3qVDm7K23GWMSv!upmV_7(C&Z0XF=X_ zL4jgfe@$Ev{vh=A3Vy!;H4^zk?LuOEEs#8%zChfdQC%wZ#{&D5zZN&=Zn0Nw*PQt_ zJDKVk^o}UlV}yRhvYJYFV2_$>Jq=HUecw%-;x4B!ie-K|#aQ7K+FYIBjGjAjfyLUt z`u0Tm+`awCSU7LFqFuW-pDFug`nA9Uor)WBGUEC0PNc=pr`FW%B$vRK)-yVeXa%YCXk<|e9S@ld*BND+KFOoVm_v(N&5@SxQ>G=FI5^@zS{uJu3} zC0}QQiTR#6s&;0G4p#~%F+bQSU49*f{Ccm(&aZI`;{KrIoB{e&7s;e-M73sn zJt^y%bEzOu7!^+zaZz~qE`G^;904#Pylhy9nKc&P*Mf2qes96bL%g{H6JEpfL&{^V zso^ky?``6Ks+~U6Dlp?U`WoZi@F;HG-WAS#tS>F0pd1DYx-wSqqYL_fPoV9B^9OPO z?XDG=B=HXy#^TlE+n@p{x(64aJj5yn)AVa3MrS`HS_IDdf4H9eD%TThmgPvbgKsdW zIdp8SQSl0Ok6y#lOoE(1CqPV?kKK!3S&pIf@mBXn6&eOSC(c07%_oTAzkzr4Ue|B{ z6K>yRE5K8+0sO!fd`qxxGJR6mulYb-7_Sw6H&B$n>}&ma!27rjUzDMK!0Occ_(0er znrAD^t(N-ufzv_6Iw{buE^F*ccA;+~y#}7+D7vHuI#X@ocYqdw>u`Y%g))JUf&FkT zipSIDhkrz=2Xx!?RSMU<~0e%>Gvh59C_eOy`e3q=Cq z0VqJRAxe){w7$ZpKWGX$l$ZM^!CRB{&$9il)u(|MkElS~Ydz3M{JJG>;-9!hl%1hK z{PM3K5wgH;h86mlw{*#?m)Taa%4VC?t&vkp^GL`E4Tn1 z3UJMW%pgKTaSm<-);gu{{@d%Ya0+zcyC6^KMO}&r?6rvDLkj+UDz275%>#e?eM_IZ zhJDa#&TNbs2M^OMj$H*MIdR2v`XLT?C|`xaK}Mmi>XyIHqYZEvXqE=uJUd)XE4=c+ zM9onLNAL2&4ts2o-_N zcQs4gItk9I(%M(vh~M$I>phCUaj{)M-T7Z7>_BzOqBx$SmW%fx%Ve8e+*ku|~ee`xRvdtiTDfy10K zCCs7~$ur(HG9D*^Y9k(}ppF1};5In^+=K4TRn<6jfC(Nh^9%K_;Jqhncs^b)X=eei z)S-9%pNaSn-(}oF;2Ep}QJRfV@M(;Ym*~8UfRGy4!MD#Uu92c?F5xZn`zX)E|+aaOPP*7Xg^Y4)jW>N%to4L=jK+qrV!Mc3sg zoxZO$eZ@7IQD>_4&y)`7xk_*KSI#v1KX~HwQDGk}@zVRZim<9?55Q3uD^~NHQS8oq zWcfZxx3-*S`S616EqLPA`-DiQmqeT4bw>4k&poP=ER3s|c00y_E7Frm7X7a2oe$T8 zYI8*KvT|e^FXIW=CjAK5g*3jB~ zB1sYec0)~RZe(9dMz2G|V230uW=rEMaPZ;|KcTq1aM3fU%2{}nqPCx{4Z@cuE+#}s z3uB94b>jqY^7_WUH;oRcw=&@6jS8lh#$CAx(O&<>$5&r(lj0E`=<~v#Kxj|tI~De_ z7K2{oJn#{uk0tH~>=l6s`AF~v#V8+<5BwIh53kGa*2P7(FVu4e2c}bQkogUD9t`2I zVc;4kjR7Kqayz>ZR~gx<6Zjg#c{~mRXdA`38~m0=2xI;p$BzhD4}%dE+|4ZXCH*Ta z1qt_;pZjg4bB%;}0Jcnz&fd#!sDq)N3~*;}pf-LGt~J7cOQ0I?IWV$l#Q?D%Jdhmd zAq>_v`Yk#`qqo$oT|H$q&B4M6NI@3!~C0ikD{9Fj>RkRlkO4+h*WVi!H!XG{+8 zw)g?QCHli6>~~89>Rl(WEa)fnt|#s-?;lqypl1abPvS4^zR3bxqTIk;olXToK0CFY zjXIufU_YF;uld$`g4r-v!r>uiH-{g&3$H6h7PQ(V{~&#*hqb{kKf}4bN9&OzcN#7$J~h{nU#t@fJz6~hXySyUBY_(Tt$e*h)eDQ0K}MKE_;44*eQZJ;EC0l^FsV)pQh(t=S#hN zujNl)n@{6Z-q6beJZn7+L~s397U`41#pq}A4FRj1xnrD3{*eJZrcp0PzfIAYIQK*M zu(H(p6MRL{j4{hJh+fygI~#m}Qt+1yZHkGZsY!4b>=E=3G#AS_S@4j|pK)pCROL8P z#!2dV(Jo`y_T)|3Yd_4-Qs;z5?A{Yl5*Pz*=*R5gcXr_&gwqX{uG;)x?#x5NO>VgM zNPJnqV}RS*RGC(+=ea3;QO4JAME?e8c|9;EWQZVXRC#ndg27%abWB?|T9yp><`A?I zH>0XKQ}y3HqB+DO$|YhRkYCJOqAy4^iN}S8>Ij9I{(C#WvHJWRtmq*JtK-le88=6a z2m9*a6geOZHRPf6%YvJd0)crXG2zu~9E>Og6_xGnsuVO`Kp9!`emV(?)u}K1*&TC8y{g}ypaXjLQx9ySVx_)&u>ty3ut#86U-eI zwJkstbo4*itu&)co8aDv*x_uY<<&5bs%+xf5Bg#!1~?j^v-R^XX%X61jXP^CEyV~P zC{#ND9~{I)su~;KonzO(oY_9!Jyz56$NsniHclpCjv_1)Q7vY0hi#5obabJC0@Fj= zHMnU~#L194&L<6l_#KV)%~jlx} zXQv_);-3JVmqgz_%N2Dns@FjD>UcMgMu=63F@wmpjSj!T!=N-t%@y1t#jmObv*TBu z9<~pD+mSS_)*X$yLGGDFe?k_4W!$B?;1`Y_*8gEbJ_V`N4ay*Sy}_2h7omyH$AUDN zfl&2MdnRCYXGUmD$NmlQISqID%ID6*?X(~V@yfb8GC)XaW&fG|qwn(!%}0G#+E#X) z*R*;ClljzOI;%S^)Umn+Q4%f6)jI-hdiBD}ZnV<^SLa@LeZEiJL~qtuNi(?QIBQFA zTEk`Ds6vNX1|kBXWd!lJPDgL{7=M>MG~~Ep8jL0R;l#Dgaw9JiHU<83CbS|3ZHE0P zgPp@TyJg*9vnk^5rAz|iAIEQ@io*piV}vmoyQfSYon)WLO6Eo8)Ttvn4{N42>Mz!G zsqPV#1L-FO=eA`(aE}!B+DY||c?72qzM8+i`xR51WpRJh8Ol-BE4U=kJN;Y1^#i3g zrD{V(BL?gd;FNg~J(2>RWB$^ro%D4OAj#C6pQBHQVW0TzENss~@L6iAo2iG(YaCd* z{tZa-*NM|Egl(v<<}4|1cJEt1J9qXE;>+>>tIspIHkZIOJKs-=aNy6Xs9gl>NwJqj zs{QbWXSD~KGMvG_g01Uc$ZWp@}fv^qdWX6v$XmKd!8mPoDz(1 z+GpnGFQovfVi`Zp3Gu(5UsBmNbTcjNWx-2{iF=P1gf2BU;s?U5okbKc>Koff6To&?qoR|=v8>dBcox>riBbN*D}K2k;cv~eSS1X%7qG`hAiZ0* zYMvOBzwWp;I#*XU2~#B@%_hqnj+z89sB*`V!63H{;eDLp{Mg>@{FX{4V+kZM?PoB7 zYF$7%wTttNL~*QPWiuO>$CbAbQlf;@VvEt!!dzL8jKnbkKCquSTab2)hoM%hH>Mmn z*2aw>Ch*hW#g-VLAHh@8w!KNrc-Zmo>pf! zoU9@$m;?}PQ&;;fX@&DvdykGq9?w=Ly(M0~Oa!P`YJL#g)`EWr#DLrhGh*Yh+W##G zp#Lb_4WgRD0}^(I-S#)~QMM?+V6Nzcq6Yg9r255M+L1Ihk-FoF27Xze1M@RQNX15z zgbVBM_o9Dh1Jq|#GuLYU=b~(~$aIQ!gCG5W%>Uw z@V24wQoCKpn9#1b;j0GHi~{+xkls#)ssz zT~Gy}XzA3l^#TkjPdpR?1Q*%xP!g@)g~GA>HVRo9hSmG$5S^P`?xV4bq)W`E24*Dy zs5XWj-QYS(N{#d)76#->yF2ITs#5}X4x#I<`x&fd39N=2f@KP$B^whqg@Rt&`|L5C zmVIs}V^PAHJ}6cqcFOv=ILT9J%77&mhP(8O_S~{jHac!bgG(uP{t!5iUsN16u&nET8M&sny0@O3n8wZz+uBfq ztz7>YAkEPW+g)s3S_Ny+^Wi%diNlhOe^oAGA3Y5}YL}LbiK&@0Z=UMpW7RvyX%a!G zGCTX#_gR2COdH?R0x9P6GCmNpp@t!FUlJYxa53x3z6rK|VxjMl(6tj%{7+$i{?0<4 za+@Ba8#&v+RibOgKo_f1r3AK5*p&~wg1?ZXU<*Q@x_$`2QlOHd{+Z)+;p2OmF0)lRd?@CB9M>bp+rB!J*;}hOqan(SdATm2Kf!ci`EU zF2Fjdq6M47vj1VQRgt~4q1BhQ1p>jh^W=FDxx`F_saFOS8?^_qU(0evPaj4Up?8?^ z;}aaW%SmP`1fM|*4eSM2@74SXkipNh=sRl~7FqCP0Y|i^>W&Na z)OWb|k?2;zR-c6u?n6m;_Xxp~bN|O}pX*s=N)ZFe;F4D5YBMRMflFSg(<)b{UFW-wddMR;mHfyj;h z5D*j6g%)Gd&f?cu+%7blu!;3ALKYe=xXd%kXE{~hh2lPM)ODHyz;K^8EOQ;3%=}&a z=k1b8C7ue}SIh)VtkHFr;^<|1ag4^w6K754nX_~*`?v!8_;s4P;w2?rxogrX^SmmW z*$`L6eBi$dxNA%XUMWUinzKywGB=d8Zp#Y06|RRTPdxY90B&uE^6^SXr9@mVDu~dB zwacRz>q-(HveU6Y2;9txPcczv7NRSqGt$r6xiRgiQ)I;|B)T***N|OcYu4n?vMZc0sSfiF1 zR9s_LT{<}_-G^i)Zo6Ro$NLfMb5h4~4lxcfdCkTZ+ziKlf&e&yflc9;#I=IoDvlvt zl2x+^K54i_T6wj(pD+_UB~p?goPJ;O+_J{6Ug5lu?F5Mwr&sbnd}BW>Z+KDDv|H^$G5Re9a;I7lirxamk9@ z=*0u~y|TWMxrf5Rz{ChmJEZA_^f1KdCMfj{ZyZ9iPsZjyod^P2{c{N7QuCi!XMY=) zX3?Hdr@yNudEbM1cl$*5jK30p4~F$WAb%TV2){!skOveQ8xo=;i#PBh&A%Cn%#s(4iE8G6$0W7tlO&CeKe>kOv@mp`sd6aZHO=3yiIs2oHRJK` z=~v}a4k|@v5q_t_t*R=zKw%TE6AFcjG>sgsoZ~nur*x8zQeIL5l)Hsxi_6b-`bVg2 zE^m|X@%5M3$F5}gySK&k?reU3p+uoF9UU&N$ECOKz~pXcz)7;#7O} zx(s-*pG>z5ticmIpRMy05w2|fpNo|YO9IN7>$jjh(*@`i@@BO!QV*#;kKL)?M9Ute z{Sg>*HhxP`m3*Ljx^DAX|B}(>6H}56na;xaQxxbLW9Ne?Cc zPSq8tMnbdXd|1{pYq^fLNOM|w{_ecF-tke}qJG%UrO0hw0JALlo3XZq<#sS`7DM2D zcVw0W*EP3h!(S-XlN6fK4N5ry!DSqeD@RW72cI4qGc7&3vzbx%#G;O#~ku;oYnAjQ1 zhm9g1rwf3&<^Co=nk+uEVVJkT{zZ~ol8+eNd@J>(tTh^kWG3vSF3KGt;8rYq zE!MV4u|C{znMm*xF`O$%=+QVg&g_yzLpkpJ`f{qCA!YB_xiZqBkvGF>zKG#c%(neW zg-w%95Sqh#u)1DSj70V$e41a;+@cNB77}^Ta{P~C(*+;b&~8O2{tkd>*s4;i%STcj ziHDe;xz=Z2co$r*f2Lr$vS$duR$pq3c|wtX z*NTh5tf;wa=lQZr`Ns9U=i%v|ioo|mNdDzj^ktEpq4TQ)15sHu_jQ|tVa>>9)TX7K z4Moc6II7cR12#5;HZ=Nujg9Q!fFh=|^=Hj4;L*yz1zCr}9LPI+(nu}A`X3_wg>2X} z@sV!`wE#he*&l_|G@;1w3XrsUOTie%Ry9i)&&WH)G zUX!eFlkXL%8{CC7kIY_mIX{^7f{4FA~TS>pg2$Seo3`zk!%X@Sa_jm<#TU zFHYXq(K?U8`@mYcAj z0U^69T3GFV6iXLN;PG7|xZjb}%~RQRFfXMk<)O;TaWdUfTAe^AP+}*O+Z;Oo;p&6E zU~{F}{B3G=2~pTo*Hd0}D>?WHu3t#kB&|`-x+}F$@MnnPm$N{0FzZpV%Kbs5`I@Z7 z4#KVOBiQBlNjctf)e~94OZ;!rOd9e-n2h1`)=>1Wq0xTqI=`MoURA3AK*nkz#T0O1 zn!njJ>b=Cmv_f`-3>`vF&&h61^F|HFM~UL)!4(t%_=1q<04QsvM^IN6{X)5m=n2M-`MD|);j?oUCm(!&IN`}=SBUysfrgAFFxl|^bh>s@OH(AL;x#rGuh=cxh+ zzm}Kp#ts{**4sBljkqVZQo10qZX8P)~r zM4W!)1$-dgOIhdCDL7a*>OE;qhsCFLaqkJ!CuJaUvt+IE0w)IK05I^97qPhMHPpnI zNhuHj9P32{)TM^n3~adOT@%9Zq|AVmX>oVh4`!&M*Cnk>15VI#VGIa>76WxUZx1m- z!ii){>BnU_--voHQ$6G$T|^KcSkRi!@!!xgBcarg0bH5wI^YAwt(sT?c`E+=nqoHb z7_cfJ*Wa{Era#UU?kMJ5q?A-o#>3d&XMgpqxfP6ai(cUbL;FitBo`_80vfWJK+nSe zfwNsOvV{|O#|eTdFNP;OlXLnhj#PfKOBI#qnC<5Mm7I6AcN2s9C~yj>K%rwnp?mXq z@=!4?c@#V%4-W|W^3rUXmxGH^&%!|?j4YaF_sz_WOUUFjC=n5;@AV}bE8KL$mur~u zoYg6sv`Uxg?S8FSqpVjOtuHME9|B1{dP#KJGQ)rV=|CBy&8y#LmUoFad_h=Xjt!g; zTW(q|j#jPJ?92UOnMg;#kA1EQFtHf6XP`NW-gQT-O9Ul+deF=S5Ah?=HzTzbYu2C} zzK8s?aRmBDO9Depn9y8^8dg;k^6^O@$0bu9k|s*FBoOTnj-@0w*n4J;CuUQV-i)cS#SUj%i6nkQ$V#GcrUlfkcSoiWf?P*e>Q4@BXce-2}hi0PI#i!)b_ChSx<;V zIN!|s>*58q5lhKR+O)e<3T^$#(FZy}W+Ks()Sg$Y3l6Fpj+Z3qZi~h+UOJl_eywZY z<~70-8|RP%f=9^_ezy%Ix88L!QNYS+Cx{!bciEe??)guPyT^4z05G0A9IHGA(HT|F zX4aycnRN(1;&1o_e6#a$K;ws40(GSEzB{4QQ-d=4WGaMNe$e&zV=#j{(5a{yWGN2h zqs-+{0`O+LUoZ0ROisE=T1tW?;2((*DUS}8`xSA|`Sbd>U(zrFW=cK!Q``=koRe^VgN;W@L}l(Z6XUDJ73HZel0PC6+w<10S*TWYYws!cK%$A-P9$!rG0(y3E*r7-)iBF~o61 z$5MsbZ{n75tS1dyZ^HKfIp~}MZSc7DYOQRc%F$X)eX9Fr3hS9oMfGGR zTg&6n@G9}<+iikJ6?P`T9e;{Y`;m}4C1%UXPVOw3rLxY1Tq)?H!Na3fn$gxCGwkF5 zC^&&!`O@U^u)X3(KJ*!(0+m4ef!t0U#@$YUPo-8ttByz?(~T%u-)IwgO~4%S7V-lb zt<>Su%)J=GzVC;npxuiuHzeSi(wXI%kQ0bNxJ5?!q(kVXF4NqMx7YF0hAs-)?H5tk zJu_$HfpQlh_Q)bo-h_Kc?L$qf(m zGmZVI>b|z^;J)S5@jl~~vzVjw#P9e~c;PR?lwG>1XNmIwv5$k!S#-`!1&@brnLEwq zaV7OA6~#*{IODD45)e&X#dgUecD(gE$p4P>8 zi_%DmusEd^Kml4wp74D4@CN>1uG#L&z3Os%=VZdgdFSR!Ytjv@2HC;^xsKbhN%(d@ zT{?OUoMd2h-W0*(a(vVA(Nu^-G_o~6=G=cIRX4a#i+3}?Nl3}WJ(MWdJc zEp&4N8{uSMv?#WSg~0LX29ZnPe+YzR!mv^K5@~EPR~H^{plYPd~P&@d}-854x{@m zeybaw#1c&mwOP_Lx$_Tn3wfjAer7=@W)Xnoqzje#n|qweB;PT^AkZm2%%)7OG-tA7 z@!}W}fWSxZYcCz%{rSrqU6moKI8)!c1k);Jd1^>9dSHU*?pyv_FquC`{3VVfx%l!h z@kTO*tea>a<$WM0?xVkY0P(tigZvHi#rxRFU+cD3LlS2yW!iM|ZnasQBAfsG6qTQi zYArDNzCK_2taZH+X=Yh+C)8=;fHbnmt?Kx9DE0kz{#hZWs2j&aYn4p-%2@ zn%2BHJwkGq=bIegl_^OYsmRgn^L8WMpQwABiPF@CmsI|r>hhW@ESBRYVOz}_BkV(@ z9lLPSAGs~r8eq#fmr?CK_>IG7Q56~n31r?huj~0e;J8Buc9o^Q8>>TBbstDPew!0n#0Iikf4NssJAj^Hh&_ieru-R4S zY%*D-!XeqN2xhHB341fORiuL@Hmzk ze2k=s#ar0zp?xf?Yr$NCd+5EjECuQs=WJb@%RD#m~N5E{JIA#EttZOkk#<1 z2IZPhF>QIL@$wwymm6f?v4vfgC+Dq=d9Zsk6BQIIp{RO`GKjP>NaXlJ8WT>$+na=z z!(*u%7DyjwG-7+yq-f6i@K8B7Wk^XPLpEB45ge-GiV;tyni;_|XY?1>0O2WAdA``T;~lj7n*ijgXn`0(dhj`~wuGy+)c=4T(?wjL5f zFkm&p`EYF4!lz4&AD^r@Y7JDuD}T> ziW3mTZk9u#7_z!}j6RPU;1Evcg+v-D^hU#39GS(6p;OM3Hlz&oW5DDqRsxPFR<9-k z9{TT!t})liNV$i{V5cTp|CDT4T7EQj+!-gGALf$SNr^L1EHq4;v$6;E1hf!qNHdCR8Te2QXE zyTt1){zuD!*-B?0<2E>6D*KL&;V0P~($B7u8=WMB%@9xAeiXbbAOb})uP~Hn$wXO1 zU9haMOBPI$XGv$`z7X8lD9j3aE|;4ei=NMbdHocx(jxd&t0O&G*eVIAU2n!$Gb!IO z$e4$sz*2B=p6AP5Fp-CYcaALRgSbqGck3A@yCf$Y!#v z+bUCAv0)iEiptPg5f1zGXmm!anK5+_!w>!kBc6|?{W&9vhKe`oNh#OT&PQweFx94o zJX~CpnY1s`j4gZJ5#{126>gzhX`NeVEepGBx(BW(#MVsG3tgc2cOSUcgJ097wUeQt zydCM&Ejm1v$1#uHF@44U?end2bCBBzS#p>j7oMRj&Z;#NxNki8{*7W6xdIRZ9z^!I zq<)`!Uw^1HZpt0yD5>xSX4JTK83ULw=%}91&_4b|bY+Q_AI9Tb$!5{<&@gS8PsxQu zgC53}PWYRU*0DHb{vx@Hqc4 zRX`!sb`nK+Q(+a#N_tqGPL{q#@R;&WKg$__*ZDq2HoL(s@1O1c1>t+ujJgMS;3c;e zO`#JodAdJFK>WJOjpxuwh_OkF%{S}$^qZgNW8Jz%*z&XWIEDLYStNXout7q*01}U< z5SdG-gD50cSPPO0I(4vvS;G~NXD;lD3LQgr=qq&ui^aXK@Bi~SDw58t9@6#!j_xlq z3ztS8M-lB(_Y>AFSQ;CyLW;sBC5CKPr`hz&9c+O47wu5$L$~0mdTGdMEnLc&9h^+k z%-Bmqpj@-_qol_pDxU|vJu#8}eik|6M}PJ%@S9KHU!WF>?a}8Ux6s?T*JGF`lTVi* z)%|3Y%b5$1_^6Lv+wwnB9B+c#Gz8AaCs`Acd zM51yPm{|qLN)j{N&56XhJ8Y~LyNeMcE5nE7aFz{QWA}w!xt;g>NA=Z?XF>Bf`b|iC zG~!g|yiWbqVsTR<1+( z5`?x)spI(Y9Bt+`#r#~2EF~?a^ehEVrWqxbtH|1W_v1Hfe7&w|3<2s;GGu!w3KaNI zH)z~`n;4IlAS3Cp2bO9cv+2u9yPg**J&mPxU!|J@(Qb~dHOIleD?N)Vuey#VtLsOb z##COWUI)9SDVfIBY#3a-Z_}@)OjGF%cB}DL2EYoGiDQhBqKB+U6y0$U*$hZK*W1~_ zMD~H1+KH*d-QuxXO0;WCE(Q@fd9Z%*9iKxj*LLE}4Qq3Z+iJRklO?OL`|X2`57q(v&JeZ0sv|1#Q12 z)9C?<_uYqwG!k>VXdNmHqwwz_deyi0xVvLx_}6-Y(**jSO2w!6ruO`cx$;X{+ZN&h&)m&n#|_U#bs`?*q(O72q)@Z0SW3UYOT3=Yw!L3Y)p~!v2p#V zdf68n#owlJ-1EOP!be&5Iy`nbZv)$VB8q#$A5^tVrK`)>W3`lX496&`Cn$5yBN?7Y z%wG3Ru0{9Fk^+T36`STmgZI+pXqKj^5q_$4$jF=qnse?B91>@BLMSaw@5@mD+E~ zZzsOKFTTD4_5$5!1mAnrf;TIbmE@@O6F=ti5vmqkBH@;SM1xFtcMkF{(kGxy=LCjPNLCt46^m3vkQA0t+wUKJ}kRIt}5>Y#qm0DFKb5~ODN&dvIQ+P+o zQPh4ge~v#UceS(SxS*^y_?R&ge&G5#!J#It8`u1)48V(2O_sLPW_7;~G8Wfa8PL!w zNunhS=iLlQaIi<${rX^am)Ir zNH{q{1uU*;k|$!y$ut904<3|X_xbp>x&Wq;w{_U@jaCHqjo9&pB=8G2FqKg5s?GT? zd7)d(1iY7hPb40z78}R3?p-|wc5DxIi=g;_J7PW6kHjkq4#h|R)}aW+p6XL@jsS49 zE4$Yc18O0yl3#{w6beRZ52`(cV~6beO>aAi@NyFQ`MHwv8dJ{%z85D4Jgf-NK3apu1iy7&-Z%9WJl>xA$(yiF+T2W_budK(X~AtRf^PJUg=AK@QxiIRcda^zJet zyk;IdtQl4Hkm^Kn(3ACBOG?ME?XPU?@7ddsh&?BZKFaOW7~OsHFy&*!QBgmI6E|NN zB5H3JT5}`4w*09hY6^xOEhu(AWxqnmE6fyv^v1>`4CWfA3Wts`j*fm?N>E2@ zz$x+&c6ANw0g;RNbqdnpM=iXExeM+}bEc9pgwdn$22nk469sfupU;*Bbygpz3vPG} z46NlUp=B!vQ3k_i(lSI{MkcRV6f@+qWdF5lvg1#58x08ph$=>Se9TbkJIbA;4YH&Q zDtq?7*?wfb{9Lk=xf9JOjPJB0GMP~8Gx{7I=1}I2BAPVC8JzuAs1mVSunwJNnM`40 zkM`A5xpr9BcOOwordhQ-=~c&IR~*?gUgZZNnov|M_88+lD~UW^bNr|T0=5RdZ82i1(mY4uH`^9xWbk~YJDX|KdzYmi{E|u+3DSLu`fRXr$2V;_*qoxa|uXqy8tK2>w zqkzrNT2Y@bYBrS7NEb0`;?)MHSjO^jCi1k{4b)_!lqqvU7>wxqBPyqm-m}}~&}#^Pe*nuY5Kbu^?BiPK8u+*Z28+{HWOX@?AL6gQGno&P1HK3PhuCbZesQ;1@>8 z3>u&2Jqu}d_td+rqztjlu!ip=YZ_iUx7{sM43n%|URv`R!6e|c0hlLhe=D~~`4Ozn zMMyNA?L@?Fi0>tT65_>qg98g$-2&W*Qa9_FlP_2S4gD5o?*oB!@9_okn}PA=@Ini? z23=u>^e=F;V$tJNAMae+$@#m}6EpI3L{`df>r+b$;0F@uD|{471cX@oB?;$1qE{s5 z*Ou;@nqOy@j;$OQ4VNv{M*F@!gz$ZSWscWSqu};n1znCMWWhgdK7reocW44&so9~o z`DGWE603MdVbF_9+u7E`HP^Gwk7(cA;lkEU3Dq!rg5aOa+`WVu9G`1N%N|^AZU@ngjKBGj&n6qy&ZO(* zD>ilvcESzBt-Y2X8(sE31@-sM)38z^@M!vYmLQhE5DRsSB3ltk69W~^Pb6)4In zJvlE3Qy)@qWr?k%q`8ENEFQZ)8@? ziZQ(?v1qZu3#5b*p=&0?$7Colx)Y24b2}6oTx2Unn((Ll69x>`ULJ33Z zT(D45#Oe_si93R+N{~!l-aK-vxO-$v`Lsf zqWs0GEcS5i#X77$+R49x0wsu zt?e`Gm7Yd_tVf~BhFArdOqfo|5qUlt^i>5P$fabV%IXk(^drlHGnHN72DM66ibf*p zC66rhuUg8JqS}nKF0!+b&GrGS4^m@@b1#b{e`?R=_~B{TSDI93l%?Co$3_pzQo%jy zN^yb)3&9h9O!pIQZ{)d(yYnD7%GC8>Ip&fwn2sD20j1CliS+(>4yfB(h-K6grLx*g z=O(m+%>fX8Ow3q51KxeFnA(iV3Sm)3!t|Vk1FT&4*jMU5ImQaGIl&3lVK}KQa&72O z(^O@b;OKe(;UDP;o6^bZ%qgneQwJ8h&SHY5M`qb}CTwnO<6B5aIOU>D-gV@y+)MVB zYUjZuGLpD-Aucp0%hOa&4Ar8Kl=%*zBWyGNkuL_t8#4#zme*?ty-(VN@w&qx70&)( z=dcouu7^m&^4ok9PFrySfI$+rd$S8o>`{;lMhb4baeO;%7)>@b^Wv|s)D>tCL^_sw zuoWxa&>gEor{%5^tGk(~U%1hp5+VRvBLw6bNtTBkeuk^zRu|^%wV_=kZ4OVF2Yh0- z0aR!jr^82GN@mbwh=*kfJL9{Df0y&k`n2_R{cKS^KjcE34ztqIiqw+9KZ8Fq7^a$bw++W(uW@Fw+B1dTb+nb4 zN%Allaa)|Z&KtrU^0A@185fhuV97I;x0hj>KQYrEvjT_rNWt$m=6D}r9^`R}M7!w0 zpUE4y0Ux$FSsud$B^^I-VYh=8AFG^NlRVleV_OY1`HirWCvZ$YC%w#=H7|*t5SS$W zv77e67ZkLMZ!P*Qyzw=B(wLaAJAb!{KS#@x59c#vMXH`!hIZV^iq8s_T}7mGNUcG(zrCOy>q%Hy zrET!KW&4UN4_s-zvP#98Zg<0(gUO_B0bX0F6nSVZN(PSlN)@ano+`QcH0%Xv*;CmpHZ|*;@Wc~8`75io!VUb-y!wk>xP!3LbUGI zeo9+-)tSC1XY?X5yErUS-o2wNOVw8-1&UEv$DQ`=5k0fImi+$Y!m)Vs6+3;S%XtLP z+cg`3w`}FRTggwD&3Xa@YP9Ow zt&f)w3Yy5x{Y!N8R+8ml4NPX*kn(`;bNnH_PFu6LpEgU@@$>M=uPVuUu7AA(>t_s6 z1J6W$TjFp=Jl}_z+B#tP7YQn~zBgRNfV)6>kDH4OmUdQO8>CM4=AXSvf!Cm-jQJ?9 z=&bV&1LwfLxcQd!GfIOYskwFsbINE*zm@ThwE?MGTu%MTD&nx+h`PDW#o>+%lfHK5 z(k-+fN7Ohu=mo_7$_14tW}ESPILA#|C5qSu6Oa|AaSh7uMyj1^p9j5-aOrmya)9QP zR}vGQF}GSJxq8~OwUj?h^dzRf*X6tH@NyXq>OKlEND}T=Tj8B`D)LX7;)Pxl!wddE zE|}b3ob=kD{tHB-HcNF^rv1Ai(V_~v^k;E7j7gV+Uqnxk?iLS7w=K2_<5Z*h%A7%E z1W7bI##+m@Ng{ZDL}3%#p=w51<;I106lQi#LO#i&mE`)p>m2o)FI!4A0fR$yvS+D> zaLmOe?U|wapuncjSN`iBGaW_dn{R&12LUpzmyAVTX*Xk97g9^oanM|i4}H?wxn1?{ zZ1N{2T_DuQ7QOm`&6u#??hTbHzHFeNluPP1e%GyjrlB92TZEgC4}O7JxvlwLZnF0h zAKTXJGkyp3-InOiq#{h>^S9xX(AeWtWbLqO@Hl`h*~9!T9;UjpWV2>_fVE7&>7~|f zAG0snqPY-+TV%&v!MzHESmCUaYdh9>tv3;7-!GN8*XqUve@wIFt9K_=(%9bqD)I?x zsNa5F1BTUwu?Jl5ze(*&--@@}ocgGPQa1+gw9|0T1QjZ@5^z`;*J|nRyi(P4XOe% zr`R2BE0Da~W^Sx6S{Al76s##ua+HU=Aj;8uY?s7`Hx8$Pa)XDO|W2-8x2xU4C;wu4})I^?K?l?tfaCWnhSkzso(^Ly9D1Sl_-DmkHLz-ZIY zaP`TL3EQ(2PBkCf&ZD$}l`3vF-}B)a`gXH7coZK*sMXY)dNI%WrS4~@i%Df&(xb%% z0%w}3aKY>h$_Dpj*eeVv(C5lU;rZqrIyH18@c+)~VP*LTZu37mJ#1|M#p&T>;r>5( zJ#3u+0DaiF{z?DG`u}qOZDr&BFSUR3bGTSOs5)F91ROSAGA?!&G7cUdG7ipv!rUK@ z^e@MfIgbW!t(zk0kN`iv9R#` zCkp8F0|i7ldMhl{+?`yb*Hkmv<+$GTdG-49dLwqhb=pc}-b&{wkmOCI|vc^E!IcL~g-M|Zlx1w+>lNv{u$cujdwKpCb^e%@!jn(m%O zFU~rGOzu#yjx*JLQL>;AIUC_Mn;paDkQBgW#Xo{h?)H|AjmxN)@qQAhgVFVgc0Zwd zskRUFhE7i^UYQ^+Q=`+~=V{RR7;c7OP%bUQ-DA2aZZXGbD`~@iQ(a0U;VNEfB^h2ik z);PEFX?p3+z5>FJpEA+k(7Q;#&*6*=xzhtA1P5fKxKUVRwd;a;qhV+zohrysBz5VU z>WeDyQbX{{B29SXEjsR1jKSV}eSm1}l%|~ZQ;$kszVUg!$i8u}BJz?wqURcs!FGl? z_1I;&cR<)ZL#gz;<#t;MVFw$BXO}A!U6+Yz?(5>-Ll)FCUYDq`#BD_y4Pk%2bH1LA z-=-t9Crx_4-;*uSxx;Z9d-D_2A&o?)&T%xlVE)Wm`5}wC4q&tEG!@=TqxO z#}+=9e_vL%x1~61+GBmA>DrDthVW*}VaoG2Q{!Dcz%Yzr%JJ%7JYEp!otnuE6w{ev zrpcH*$ag4_{X|rdJJZACt&dTenD6^H<|je2^e0K5dBeh3<{9N{5&!l8)jo6Mz%aLv z*~F6;@Xw^YSJs6*TV5)b*+Q`c^_Il%Qlmkir{pVP`opKD1jhz)C6KSU_@vlohpwnw z61zWL2cUuJq7zRZToL|$u0$yaI@u;TAfFS*YGU7le7frw=6dgE4Kk#Bd4Bg`v>Z~% zL}U+!J8%I1WY6bEe|1ySmptQ854vMzYS|6!b~wabQ7I}}1w_I;((K)+e^ z)~B)Iv+a9Ufq$+)IxH9;5DYnB>4yzGGvmm3MbLB>9GmD%I2a%q^It%3Y^Dxw2-$vRJU* z?xF9AT1AaMHxQT`f3`-h7C$?MwMKTu16f8o!msxd*blyb!YxEe&Iso5#LcBVypSfI zqOnFc3MaZg4ffU)UirZYGF7AY6rL~+;OJXo$NG22nov*uBmeKn&iixl6ufsT)j>>@ zH+A3(?2UrZ>?;^wILqK?QW41KOsz}m%f-i_ebBGW>qLcT({LNXPGxtftjnd=8I%hQ-v=lwso!2e6{ z|7LMIV0ro#*bVouOw7bQWY>fW4o?i)57?1|7|#NQFyw=ek;CR&vW(FbkeEYBM7-pl zTu6mt8X*KK$j1_YKmsjj_L9$YkYK8rR&zb5bba}vvJo}Q?=3NBC#N~5dS~5d%RYv@ z<8jyh9So>irtl4qda{{zh_+1dS5iW2)CJ=Ro(oJbAa+$44{9|5So=IroMR~oz z>Xj$I?Wl7`Nff!F6nhGM++g)4(@R47_1Ui+SMJXpt|R8UyEm!%?LqZ{n(@x1MDgqM zraZbpuA)4nfqwUwLoOG+w&32-*Ra=A0|AMrO7Vfo?~`y$!7%gRj7$F9 zAS@ROCLoq8rc(4PPtb`ItAm8t3%*gtZ24P0{z%q{V*#tt9D&d0EzBUg=eQNLH?6`? z&*c15Z)vZD&lu01cV>}`T*@emt)zBDIRn^{iaV3IEhqh?E6g)u zP)P@!xY1hE;F;#|cV8cx_h;wRJBeQEHzcfgJIu?)y2T^eJPT^%0hXQ^h@GEN9&Y)BNBT z<*Hxi05RHg8UdjH*k9O)0G@W~L_3uA87X#>6^9dk2jPL|Acw2=8KtX{bV5@8Fb zBMGw)xgh~l2%!Vfnw>}(xdYgS-H*`0EGl6I7lbyj(+^QlI+DEQFroOVWja}r4)$6H zDpjq}4;d5-dtFKdhXNh^RvHxH2>IF=B%q!T`K2WF8j5V}Hu26n6C>#; zAjUY_S%Y}*Dprt+75}fSIA}v9#D3@wENkv}y`Zr^cm%Iu(ZI_dF8=wC6T-N_}A7CTHB`b7B_yasE}4ye=Lry$|bI) zEzta`i%G{s{{;cgrHQ?Vq+jTD)ogaYbgb%Ai^?xF>xR2c_x-wOP3Swo z+B_#e@z(0eP2nk0?wg;v83|+Lf1L)f?+AvoZG45#8<)Y$4!X_l&$5yomD=c zc~`CbC6FT2c#dbCYS$CkCs+dq%zvexTB$_mZnPEL{`#V~y0x&Tqi*lQ)AhiiF`Dt4 zx#k%6%3^hv(p_qK_1;Rj`~Ha>TX%Ceqt>lfzpbOWzyJ>S%)<8Wytmxw>|)kU^WMtA zcNRkN{A|`ka~b?>prXCo(@3}-5G=jlbnyxh-8UE}RZ`MPm%;GSD4=kW$>#Y%%~K#C zrNUiF-ZHyG=HBT*8=Wp*8faxp6SqF^vIr3k_iFH}fX;hkcOBann!B1M!0zFlFexgb zxtQ{>)$(Jm-?dYahOlGy-FKUGX8l>marPS97J=#H&q-BXxu5ODX~NfGQ8%69TFz&2 z(Xsv-cmih<6LDLsz`52s;b~1-c9D?0vF)BVrMKh}i`Q?Oua#Dkf2-b%6*<3W^jbP9 zbJmj4P5xecq(VyQYZl&e;QJ)?SQ+!H#7GNP>}u)sOuw^gYspL(@u_oS^P3A;x;x0< zpl)W9iQ;ocmGBL5M_y<@W#9*cPVU^?a=|5uW^{8rbA^e5QKn&eD5AOvMX6Fm-!E0B zrD1484VWIHSn!D0y8FeID=XwkJ-3-4ZIIiDXR)ffkdfw!+i;k zZ$sk~%Wh0@5sQzc29Qi;iB!zTfR`j5tG#rPka zi3$dOYN42nRFqLIvgopo%yDS4#RYT3mrFi!V2a3ua}JoYv~%92NeHZWfBaiV6nV%; zBB_@N&yCeYx9oM-ubCJVPoL{HCj!1#Czom^f|0VBsE#O9P-=z;h)h%N?m7mPg2mh^ zu*$2(k}1x_OG?i2;DZL@fExhyiTM$ z4_BpR|9wP4-Di->Wz#U9s(eINB74-Q)J3+R2Lg6Tm^U3xCIjFlVPMd5?RT0j0oT!9 zWrW0etz>NR7it?Vw~EF+_}#X!it5C*G;@iZW40Cc3-Wgkqhti7`$@su$$^K(ld{CW z^h$=gVs>F1sy|q>=_wd9Ah&dspXWfsb+z$`^m zAya?i;^Geu;Ib`TIS7C&Mu$R$YAl%*E1uMPrV2D}Tb?l-OfNER1GqPQ4#F5P9iSKx z8-N<{8(=9!oZ!JE*g zMN2|s;_6&b2B>ZfbIygzL28A^O0=v6pM@z4;0hcHZ3;aK<3zNe5wm9DYjD;--PA)? zlWrG4FWCjn()!8mVELSra@?^3`_&&Jhqh>6(hi8qFUb{Okb&s5J<2)IqDwX)>EilZjO zvd&Uge-Kg>klR53R?rH_nnVtnAVts;m9og}KmZ|;p5dpwAzlIbcq|c+ebPJ5NC~Q5 zsY9OdQ=Jf7MVAP@=O##7<(Hp;@N|ALL(t&sXS&l8CsLrJT1Uo^U<;_5ZbOo}KV^uU zc0+W>1F3!f#G%Xy8JI)omp7yca45ax)CHr0uTSXorA?TDwsfaOxccHI+&}|BUAYrB zkO5xd5kgC4MRvypDMNKd)Px@>PiI%skT!&altX7%JSS~J2}A`fsdt18@gdp5FCarO zl{;Yok?HhBcKnbIRkg)UIDwh~AG(^-hL9l_q)A$^3aGpxbqEtFhVDyoL!#JnP$NQN z$`BON4V{~cb;X>N2?_8k5+mS1EmOQGOAHGrg@g(?rW>LCrCM30B3_g&h7FWMYNnH* z(@>$UV2KgK2dW``22enUBZ#m9DUg5wB-%Z71og3!M0xTN=ooku$Vk|4ra@w8Ks%%W zBpm=7ow>@T>ZRHx3P>Ju1E3G>Q#>~V>5mu`O1(z6LaR-uO`A!VNn5JUqQ;^!r#`1T zx4>UI&u?vQN)O8kiw*l378aHl79W-l77><}ksTNkNsUB@KKlrW>J) zRpF7`p#ow7geoqXk>2+lV}y70!i3AB3RE88feCakc|+2GH>sU^KscSB%nma^sPIw< zD6IZ~)w@Ls@5U4)tm5S;0*@5FRd)FdX}~&gLEFP#SPkXnE24#ZsfXmK`Y;_-2e-Wp z-K87EP4^N##QbgEQN=3{=MGtS#TiMs;*wo=<$dnNu;fx5Nx0~e9;ijzqfr0M%J?J= z2#{fT#{}XYy#}xpR>SZ}F?$7Xg1mK44y{dQ)x5%o76Ey(qmz^%*1v zIFQb@L2O7d_oodp0vyUUpZKP|v8KH#f%T}?dXNrb8c4bt$~Nm`_(NS%TEv|>MrWQ8uM(}_h|EF?B7*zJ^(w9!9vha01#GTV339|+!Oy?LC_ll z7{2g6XcP8HaPC5+s~)Ns3d}Z_5F7vl7B9>QGK6`8oMSD-4GIrJ3mrj+B!(e?;e&AF zP7-1l^X>^9@<2L7tsKN2vZbvlx6_d<${3PEVxav}(GV+!4s<}0r~6XWkU2zwgiPnA z3My>~8uCLT2CUJ+(817FyV9DgU#gE4C(4qCh9rb!ghWjIP#lyL6$vgGP&1}AUZYe6 zLk_4G^2`+kH`YVHLVald*rSnT{kPqK2R7PDUF_Lu$KUxp z;*6gjZu)nic(kMV1>!hPGX!!}5a5euhJedOkL6)*=rWrwspkI*`_%(1)YUZH)@1s*nWEw2 z>sw((34cSW*-?o+9}YZ@#}^+rlL&j0QL%D{xz$F9x?EE03y@b!Zwcev8tcXUQhaAH zFR?3GFYnySJlNVyTAXZ2_1(IrOgLQQVV&!(B7n&uv} z$FZS0_CRw>CTeH`pio8{O`6_>D0JF3KRmO+(UD&qRHEN=N?OHUkHDO$A z(_C^srcowCu8|(~d3{TWr1yh+)+#s7s%sOc)7&Rlp3QmaZ!DMI6xrxaiZOYvxUVWR z@v+TDO!`CNsD_;Z<~Si*bs;RU17iYw+^K|euIdZ2xMh{%;u&9^aaHikrv|4%Y!07 z(uMfUC0cXUAR17G(eV`e4>g%nPOvb@s?hf5JoDTM2o=l#wgu~fxjyKqBrWH|i!<+- zEG2al+Mce8$oKX=wV=X`l!{iE^SFyn?Wk~YtJ!p`^h zWlE(>Z^&k?C=zJMl&HX$nRX=bB*JLdRIDz3T4DrSp*_#Rp|Wp^v#kYGrQ(nNfa_0& ziR|^%URP>jn5DTDKkNLngt-Td?q9UO?-G?UzKp`0zgR+{zX!dIxrVzW)$!?C4JTyD-WYc%ky%Q;%%HpInkVWp5jK$-cn8emi|oj=C8J)q@;C>Tfrc zV9y4ccaZ{-7j~IP1k;KNCB;XYmse!}c%>j1<)S3S#w0o`DHS4fls8yQmYBc0(!1XU zoVA01#*1nVc=8P>lZ_!;>$KS}QhXj#{%iQF9ET%*a`a2v91R&hb^}K%FdmB`wJYJo zE4(|o&Zn`&GaU_tzLEfo8gyc5*M3bVMR3Wlv;F$`e962QtD z#FkhW7}Ir$G&q3SPl;Z;3mw4X=Ods99#1e9mC1c$bs_0Xysg;!Afm(->S_I;X|qfi zMJ4{U=$Uj9(H630FHFCHwn1Jpr4KJl9R4LXC*__+%LqLQH$@)u18#E-wAbk53>3fvQ&-MB_EGwBoa} z2Fv78>JNaP`mU#VTts?ZVI<)$gTY*ib;F`Am)Pgn6SvRZ0(``2SqbiufSSppTO1q{ zdfMKxQNE7Xj{~iFxQQAkI$*EB-nkoU+vs~0h!zi0MH8ANOtrV)fwQ~AUS}?z>0bw; zHC?9SXgSoBDra4s*MIBMP0G1v<4SMB81z7r*L`YPh<>TW`;)U*8`rsS+@(>SMsa<~ zx=u))uv>a0lo?DqHjUjGfqCXJTq8*Twe^5d=1alUMM<%Twb4^Uzv&8k9AW(Swv(X~ z9+;gI>gn6s`@S6FzDKZ}D^tXxUf~Qg3V#r}Zt?C{oI`lL40%O>K6}6zwoi3>O}C%Y z3x>2(JoK_%04SMFyl}#(rIecTEt6bB*mjvQ>6pkMt<~J*G`}K-Aja7o(J75$QFW%OMz?j#j*dq!2YTH| zS{@oXRAT8Vv?CKD{*LxHOYx`MA@Vu4TEF4xo4~XOWJDOCD z+RAbIPA}ECWldgGfu8TOZ_$mkx5pYP@LtTV_~)CfL?_jfP;1Ndec--jb`K7fvvX6j zvQe#B;|&E@YR}vJ&9S0DR!|-6pfOtOX`1atL?7qyd?xtL*0Om&*p3tEx_he5jcs&|AVaJ>Vu;Q-A+=R< zMs72`L8KYY=@Cb)o9d7#4qPY*;e|oCOeEs=?G-aq+l}*U-LDnuTN7$>!@*Ws@Dl#U z=$0kJQc2M^=mrv2q0mGK z{7o^T^4Bs+l=`P4MH&FDU@T_;3jSAHsV)wOw5n1uazCebi|5iGU$!-0LGT-Ypt!3<`ipz`jJX(4&EMg! z=@M8xi~Wkt@Qf zIvPsBFY7p#v-f`4*-`*3QVo1g%(K({--p;6uScG^ci_MPtLM$%zp3%H%*NT|HgwKc zb4bq(p7U-$fBVM6Uom(3TfU4>Z*44+ljct@_0iLe@OhV``MX;0uq~Rp|2`9Z0%fG3 zVtkZn6=QzbQU?~TVj)#9g43tD&y<9YUWl+d^S}Rw0n_hra0R*APrIMgA5l z;@>oS#juNXlBW9tj7I#7-ihoE=gya!3t^zF8D$c8G`tX3ZrQ+awR#%#=s@sbA(b&pDLN|y{GU#?EEqI2N>7t& zRccP6LEgfa;Q0hNO{Q`>+*r9^O7UR&Yr2X8p9T@gBF2*6ORVMNBNo(x5PthT0&C2_ zOt2qSq%C2GP2BMa{4a%lQe+80LnGuLhe>x+uLf*#|1|kqc9RP*q-YHjI8W61F;c&; zW=~$hZZ2=J+s>|L`)Pr3VJP<}R2q3V3L(#F>N;DD;IpF8E{tSbuAg#UdIJ<2Q>Jns ze|msqhssg3c^-j@^VcZ7??Kg=B@EnDGLp@6kn})tp)#sMjq)VMuS+5%17uA&vy)VQ zGMYYFg5#DY~NLQ!#s(?=W}BHAg_P1ey1Ptkr;4Kco=k({$a1GqL?Lk`8!6z zC6jIG4n&rczFCi6RniJg*wA35^L#nKlN#uDc>F^=eT9BD&F`CTu==-w`%GUd zvGeuq;q9|4DbE$Cm*zQR#(TRU;;Uefx5sOnBO~8CzaG8mIw^%ApEU-u|7tATyagij zG^4=KM#!(RApu-$%GQW_swwAJ_%N|7TWh(JpO zpRUg*GqgM{Wp{69bcmxoxW&7XRXMwI+I&^8RjlOVS@w|AC8z#CXJOj}5Za5R)pQ{p z)W8?3zSfuzeaUPiiRRP2m6cDnLlcG+5}N83#$bbdQv)hANC9z#3G9WS+_iSHbuYSo`@8MAsSFYtI0Z_ybv#ETW@SU<|{%WZ>Sb&+P!+Oh zF9LkDx;|4HSbAi(2^x=cOemox&?QS* zPPJ$^$EvYGhIAPTKMCFQcnJjj5@-6}1WorWB6dBIKE+vKx!N7LSH z=5HEi+gCccTiailofgkqGDktYlIbWOvtg}dnudTsC}>0CMra`=n1v``;!ehL8go;-jNL)#W(_U$(yDFpuU>N#E{jf z*JA9T3>BxT3h`lrI^{1ZsWht|mzrr~cmulyNKfUabn18nQW!_%R-LpR8AYk8 z?TRT@(W?5YN*IcvhaA%%c!=;ZQny=%Rv%9=(X_;8ZP5K|_hd4ir#*hha z#*?x~|UQvZ?HfhHlc_OhjZZ4f`;c%JdF|!J|>s|4iN|9IC3! zRIu_@Uq)CWQs<2=wgcecuzWIg5H!7k73AWbLA}=iO z!y$)%VY%nQIHSsg;1XVA3c7HKRK^snymev{`P(Y*;(I4YkQ51 zbSkGKJ3<-DW**ePZx+vO>V-Tix#uq#8TiZw8_SlXX{9m7?ehX0n0=dg4|ICqqQ)I247_v}hpN~7q+(blGh{iEdjgALN@bQR{LL+%^j;>w`{ot|5pVzo z6O{2k%!O)lv8+}GT1?-1&v3a%11IGR_iXC}YRTWSDBBtjLy-BFxqa~u?duJ6RK%>oExpv(5Z6H`;M5U2&DpqwrR~L z9D;>EWwBG;}3*kwes9*yj*kqQBtym6v~;(2ue+-&2x2*|H@XtbKen9)x+-?g~-N7p%=Qs^fLW89tI+3sReOaHbxCx_EgUROzsJ~y87 zf^T9=`RixT1K}C@IL$b=Z2+ zg+uTo6veRRL;5j{QUomDIqt$txHr=UlztIk0K06H!fUqv@YAZ^Ubl{nj22kBJ289N zzSQpHxY({gpswDJx)fu$T!CoWL^|6MNKAS_zH`5UvC9Mfao@o84}u+faPN#Z9XXOa z$DAlT?$5A2NOP@&&GpYa_jaurEjckz9$AslTZY*bO25}{r7FG-F_#W~L76@4bQ4vf z)g0UZ=Fv-&$doSknN81u^+vlXdVCX1SgFVwEfl3cH4EqJ;x@WdktIJ^k-^5FgeIHG zUE)$Y338YFePDQ-`9jh2ph4+9EJ`uuEcJNFL7^aEcp!}(Tl?ji&?%IS?dHrz^(AeQ zDvMmM71)FS$i*9be*FO7K`TjZ>dn+lN6-6ar7z(_GJ7Q)^NkenGv_i$A!`V+@S?o3 zrTo_ev~%-9VwK3R1J(i&e$=oNg5nGcZ)Ufiu>c3o{ikX_tgyu|+H3{ZYSMp~6m$i1 zP?iV$J2#6VGOH?5rUcv-OvhxLG%lf5Dog={Q%eUA12Arqqe|W?$tk;2@ITE^y^Ll; z(s=pkY_IBCYE(aKPju(|Wyr)$Q7B~u*YIO%x&OU39(vAn@J{3_*|z!y%PgZvp1^IM z&T>`YI*NTq)SMjGKPXbQOvoV%wMpYr44HGPwXyD!(?4?G!R)IKbX9)Uu7%+i1TqTT zE;jxOp0Z10PiA$AjWSQ`NL|euHxwr9(2a(ACjP#s7h}l;1A%15bed*)6oqf8rL2)@ z9*EmD;CbC>&dL-g6qU6`kf%h7)__GV-~75sY7wrsE?C6g#6_bttPjgG(=F6B?qXPTdxZgUvQzJhjIn!Gn{&sTz)MvcW-FR5t zqm;(`&OZ=-0Y#{^wBu(Edu|c{dydfr1rMj!IUxxSzgv=}ywzEn?J#inHR?N#COxhD z4!`j>l&}3_rtavfhBMA?3Hc$U^SO73a!&epsSC6WYG~_AkOPuppsZ~X8C?)wlFW7L$0*=U(-DKq<>V6e!ymdCN-kgCs8G{ z{h&ABo3F5tZ{Q{t*~87-+wtxadkFi6Z!lggHDcINsV8R5DWl?@wPvJ_gQN}+ce z(;aCk`gFa@?9(|zUZ*dwZW(aI1iH`zx?o4P{fGkx;ebxbsfKXT0nye` zkgjXe;!lrSHA)6wU#>+ynj$9>k*BasiVOyb=ZbSqy)Y)FS#-}B+3)3p`(F)xI|D41 zAGyhT&vt&jXXinQw^!9`8t>K>Q@i!q7I8AlH$SodqQ^JSl3DUR!H$dP}cPkZ?|tYd7OdH=Z*sRFH``^RhtcEDz7B^{NE%A4mn-qTEoSMaq57 z{F9Sg^0RaDG$~TQDow(&Qf(^x4OeCw+1I5!^&u-)X{4M;o9UwKGs14DUm2P|X=SEu z^2*G;QMEx<)SJ~ymsiH!zOi+gGcC*f`|B=k0;Q`wTvqE*2p(Y{5~$qK{DLZvS`hzC z%%+#*=Y&lX_Ic)qoXnKx4;5LZ+>e++R%#AsXA^gyHd$s&V=fxGQKOShYQ9=|YJ@qd zPLpz+RHGVUnNwy_p7dSx10uV$hbMb=xUU2d7MsNxfiFRQTQ{LmMTv4LfuGh%avKeyPf5DrNt zg93%6z@1ZWVe~lV?;5GTyeL>`lZzf!NcRa8=G^RXBu%RRxHsfh3pue`j+@Np_yL(p z!U@$bKR$*ZbZ2Vl;>sIVD|RbV;Y?blGu{m?mqN>5;8$0IPa-{Y@qk>GPF^qJHXyL( zQL)U{YY?XP3X^&o9EtGlBU?wudero4nizJ>^7t{0JguxKP-K$}USgjS$Sq-iVTo3j zig(BF9CPqjGqc?pAgUClEWQaGb7cxENCQn}P~GVJ>?ZaNGU{MoVm(x>he2o2AoBT8 z$q-W$RjFA${)Zmxhh+KqR6fopUw#vly*&B(f!SF@*bp_nTGfLI9a9B z=451?)5%$eM&F4lWJ=s*F{p5}Z4 z5~&n*rInug3uALOG`b73DzehdPO~E2tGBr=E~_T9WB1}WQ{7=lakMa>_!5_mzRw}S zI+TTGp<5GDl{gBIFg-AR^D|dR#YihDEO2mwQ1aPAXb3k(<=zHUt*R-)uhvJ%H-w{t z=HzNU*}JBXB)lXdibG$rhzZO7KJDp42Q^+v*HEO^>3G)=Ddz4z&=)y>UarDfm=XVFbzNS|D(Jg0@JSr(>!=|49CE;nd`~kQ`Msnz zWE?YrU)--TW;TXyVRg_9`b8a@@`fTzw>ZrImu~WrAwyE@3USd<}S1M@I?$V?; zBc#rZaMFsMgB6GjB@GJ#tM9w8sA|iD%QKp*3Up!to2F8G^J96-*QAG=!}*QHUbz^i z%KhmsgHrEES4DRWZruIC&T@sps#6+V#*!eY-5oc_E^hGHyf%r6e?kPD5^;hps1I#8 zu)4eTd}2C6MXks@#B?9<`MT4dX1Y-d_;njmH}YdkRJyh<|6e5)|HxYz>o@|9Z9;Xp zHY!=zjLfXFNkJaNH}7W~cn5=+{*mLu6=Cv0XA#8J&HL?f{vj?{N@^S@&W!l>i^dbY z-h^|Kc_(VKNkM7}!>{urf={c1A18)?Bw@ zx-Ff`!0NF|)BTQgmtLuJ7)PKwyk!&)zUUS0It4s;Pv8!yuu}=*k20=R~`RglyiZZsXHn4|ELgUoWbUDxASNz34e?GM6wg_<_>@tfzviyhD{t-&JWu$VrgmPx>f9;zY@+pxp1%u(%N{b$ z&YpcqTPV2j>iKgd`V31^Fn-CBdXZQp(z?yrA+Su*sJ{G6I>oz53= z`ODo(J+XviqNSG5G0|p%Xp4np9Bu^f>J`C7$O|*rTN2}l)D$_wkk_dPne|bL#!)Mc z_)MH4D>;gS3sWBz8yd#Gf>A#hRWw5>u4@TM*WH_Exir-C+!6W(AvD|sR1;yvLF)5~!);#3^d)WY>}%s#H4V>r$n9HQH%2}bRZC-|PX z!SESUs1%HvRfr8T+$=Ug2Jz=nb7FM$9|xarIN|;+xn$`Q|M1c!WM$>8#AfWM`2Xmw zd1p!Ja-6ZtK-^czOG(5Y%5;zX&Q!W&cIC?YkP-|V%Wx_3l7$;9Hy_wiTE6K!=dZhO zRp=9TQFo{=Xk_q-Kz3xwY^O%A5v4keI-5?ZFzD4~+n(C7`I%j{m3{k`+RxwWp4Aov zD`Xr!!F&Tokur2iLMA#DGLb<(l;x4Y5OJWeF5Npc{uLS9p=c;(Z&JmQ+o$r#2!1R) zax8p|-*+cDw`->EQJ-jg#@9W@3=Vy=!+e8Fk$@Lqbm~pMblJDWyeavX%$(ka^O_7MDgON)f3&rT%%;B#Z=-mYw+-wF8Zdu3Z$6E9FKX=&5n^ zec@){NH5xg)(>W7Y287>j)-LOI>5nJtv0f12%K#xsxFU6E?Kvj6I=i;^5C+D`L$NU zu!g!o3A8yXu8!q5xnruPjo>fu2X~pcK4g)H;4trW9}DxI4;bnQzurCJf!72dS}6SY zxTH@Eo@em6g`2}Gz~^p`Rl8*gpPQ43B%aJ{T~3)xaVxdYx5+HIlbD*ZVAoPpd9mN1 zV6oVko9Tuj*j-f<%UDi*^vvo!V{TrNtq^?ln(XO(bZ)m$m?C0RJ!P3^6h-sGYZv8k zBC%K|7K61uyF*WB{B{1_Xdo2U6XE*0$*LEtk8O#5%Efa8qXK({T9 z4bfWBkUBFlnaW>Y5CTD+oR!H-wkX>m=WvQCH)Cw}wfwpT858GcHfusxycxW%C~uP} zqylZ~?Mas`eh`j46Sclq*H421i;+9)5F*AQ|J_MSFO$r^uzJiG4*< zk(Nu9WaR@CX|E8vG^_TOW_FyeNT(}R<-$FS0&p#Ka7%6m=wN+Y9kqSj+n_tk(4xV* zI%k`kyj?UP(-Hqm((X)krlLqVkU~^sVO?8nE;*>Eb?JhjD~BVo%qDY_EQZDvfEvPM zL;=G5vz|nU9_Rj75}ji_nR^?UsW#fRC1J3ELcEN5F?Q5ETjlIGZ~rkt2DF$o#BnPdv`YM4F`Aw1^CZqJz~iC@}sCgz{Q zdY-Kzt2EU^rievJE>nZ)*H1E-Q&fLCgIRe^{o?J-PUl%BhF{i5(m5xh{7<SHRyoKaq!R+s1Xb#%>}yzO#1af^|d= z%5Aapo0c>+$MoruCJ$K&Y935)P}kNGGbl)!L9)tuCL?&d37nqMXPM~#$4sAt`E)u< zH~X4;el5TfqH6)3h&QynAh`+!f)=~7&us1T&Y`Pu%IU1zxvUZV2h1ElMw0IxY(pB< zfm-(0pd-vvNP=w87du+*L^ldU*{!i=(gVxt?Aajs!NQOdD~Ir)O(YF1=REWxz{0zuVA z(vw!yEsk}PgZkPWdxQ)dRk3hWlA&Y623h=Cl4NUgf#oNB-$|Y56P}gFXJI!t%`kGh z41|qxM^RR0kwc+y6lG==IY0)9UJxJr0-dk%CRE<&NQ;os1w^C``o=|MNh=KDlV0CB zi|7pMtx%jc?o1;=ItJyz7_=5`8mz7kmdD6?WjoR`JxGY$Up#2CeHAY%!Zh|=ujd67-7ChJ#0sZ46g<5$T<G)3yp_G>4PRC%Yn z_OnW|5+jvh9kEcS{yxpRl}xGtUw-NW*}p$zB}S>O(8q2^_dbbsF^3M`*xg-vK^d_} zF~48u;b&c?7na^~1SEGgl9CZiw^dgPe=!M&D=I_tnqpT=1$*l+Bkx7F46d)cAhwzu zbk>#yV?=44N<37e=R72NCXYyT9E?zbr_*r|r=);7kv)WRrIM(VOzN0c+Fxo^ zl27cm%?tM~3Xt(oCQFWo(`p;l680nL$1SL8&}MVhN{9>DVssHTiG+iVwHnf4E9zWh zPPs8ANLtsivFdoDQ+mF#XUKkZ_Kr1;3pn1fco)$56}k=KRKmj(7DM0Jj4qCf+uA}w zn@vi2(i04pT|}n41Dm@;B%wB1ww`Cw;HtXr*dlV!R2y=Y@qTt~tgvYU$Hx1{7~80y z4a`%g{#y+E(p^AUJmz{y#1i*^LeIekpE$Gq4=VCB(^g(OAHuwntRQvok2VnRK-TMW zq5R%nS#4(+5xb^S$>t2N((ZFK0#m#OhQIybV&k}LW- zWr-DikwB_(1`Ew(MW6ZP4C`%lB%ioE_mV_KUhAQfyp&kGUs6B5cAu)03cYi;%)>vT z92R*&|8GLq4VIUu&mjwz2Yrhd%P&+AKP`Q3`qrxm-?j3KCpnRq@Vdy{2)vFzapwL()zWr`yEsR#P#7{SW|syGp-|;1%j!6@ z3LqAl;$MnZRa!==)%Fy#pO?k5?Aet^D;ZRYD_<>cP%gqMcF`+Q`&@okL-*1p6~jxG zz|5B4BtrI!Ky=CLJn)+xOwo>sHGa^}<9zSf{uT1gCa=$@U=uO+0iEhRohE^;9h_tL&Sf=ZvSYnfCGCYK&+OSXzU0%kjJn!brqq~Wvt=42r#)};ue+xwTbi0CSLtn9 zt5+*Z)u-z6S|jtFc{b&oUH!}Yj$U1-a+hRvC%a$#x7BsItt<13&u`6BIt%%CL|q2H z)XxO#P#(G<`8{zdcvE>Q{8#1aZe;RmigU_7 z`3*Bumv+WB2PIa4*q@C|}FNQ)e(D*1K^ z9rFw_^D{yTvf)b)Mvba^TKU)0hsWO|aoVYA-S!+; zt2w(399^gO zS-%QH=Qr$;#QX+ktZz(h3Ym~Na$!PZlfi`KBo4rYWV-zs<07Aa5|QL9v|o$L6QhPw zuEkO*mP)W3VJQbrSr2(pQY~!@eNhs>O>l|nKr(gu*Cm}<1mhJ;)Ilf)o7IB8lXzbM zxaHsqTCI6>Qd90DJNfdEYC^9XXl$7H7RP1~&+LZs+MMG0oF?N$#*e@LB*K5UmAudq zl=rKY^#y(ROr2Sq*w~u%=fyHJ`8tk8s&*B4auyfz3$4H=wX@J2SUlFnCFz+qdzN0( za7#;3XHA|uqq(us*R`$DKE_T)oinAgpPn+V^{ZQ2^!_rBzuc!OTfMh=%>ID{^3df8 z31n#q%dNZ_L{=4f|C$sx^L9;^v};nZYgtBj{TPc+sh;Eh3WYH^+)$KR9-f;Y5n)F zX_$T4&=r+y=LIt7uB`*i$(*y6?3az-#vy3q#Qn04LP>JJ?5?xzm#tUL{i^$Azo3YT z`(>vQ|C#p7g0ryHH+xo@eM}FGnf!BEU*nv%Apb1>ggUb-&zMX0%l72w)?{n(@aF%A zxA%aPqq_2i>sEDjsH*PjSeGo_prz z9@ZYSm&d01F}+n2icNv$pmyNqiG9UQBS{uzWq;byn;KqU(HQ)cP)EMKsxdwmrH&ZP z#8P%DP7!i~LNzfo>dyy8d5RCu^|3lfudct+LPHSw6{yzc<*KewAN%%Mr6Ctm4uLvi z{FF#4r=(h=O|1(>p^D5>4R=eSV3FG#2AUM%M4u;SqR{%o(-b-P=K0F8Bh}_(35kqi zbd@fVZ{zR5x%Xnfp6;p>o9e35$wTicih1{LcMV2!ezf4^kW=Qin#Y`5`nr0RvO}r3!9x*jE9vd)iOS#*$(gcpZ&7GqX!TE zUUB1{qp4**362p-85tes7vx-7zt-D4Fg(!gO)bA=erO&a(MUxEAz`F4U$HOYN;#Ci zmU+YTT71CPzjx5j>J7SR#Ol^bj5d?P6foJs4vQ-+Uc4E`)i|H`*{?xOd)25w?e<+icsGbkP) z6XF3vKrubNBMtSN5@Kax!Y!OSgNIT1V2XY@^0s^tu~@oY5j9q%>kfe?1#6&BW}2t$D4BH5#&;zO;VL zT`S`k3I|wRI=NyhAW$o=?2K|cU(OLNm@>f&@UQvO-0#@b<0VDf4j;dLBvxP1IUN#! z5}=>_9e$_iDAs@-u4w7ADwVu3h`CW#ZbC1Q*35Dgh1J|WR(b7#9PwA*lSGBHyriNX z&@!JDoLc%^>gANG)~7Z4cYH?0%b#C4dnxwechYKiHI}obQVF|xb`%Dc%_6eXV)BYe zTr-R4mx!MTv?3kkerzqa{KQCGTWW1u(2hZiFNLLC@JGIQaBa`><>It&5KU}xPaaO} zWY0jP-_paOoWHoc8W%&6F%%PnlzO=u4?A0}ctN?ZnUSpOlK3KF;!77A*T_ZWy#tqz z_`3b5UPUSsOWZ-u5-`f^%3p-YdwE+Ofi6x>;>GEjKOrt9mtCYnus#TR336kTlZd{e zPI3_UfyW?>lHgvU;$EP;C;?@(4Qri4Du zlu1SZ22JreoGpsSPJ{;+BT3`r?Q#qJ!Ls4`*kDgvPft(dVg;J}M7BqbbjUj}HXVKy zgzRie2)w?GV%}55>jEuiL|eJ@s%S4nhmQ%Rl2TgZj^)iLY+b&tj!Xn8QMzImCKR}4 zT0?~#MSU3jibzbWV5+pLBca8~v2w-5i1wVYzhTF3~j`L;Phe>SX^6dw=AKZw_d3oyA?(2H?_H_77%Msx>_H-k{ zFCKtw=swXjAXMpAG`tf1ZmsrZL7HB1a&^J)s#Jbl9q)w&^%IM)^Zb`0$rn+y8ilbr zbHxl)D}k$0zO9Z6l*V%*u2O36$MO{1jm(a>$Ir@$kEN?2rkp zCfe(#Nn>xdgE%Ugo3Try(hCGGnuQ#K;uF04LOVKUZOPB&r}uWeh8Bd*pn;lu|H#-? z15SZ#a8V=_wynz7_H?-FV*(pLvmT#%P?mNH0R()wE`rESen=dHvyM#lS5!LfCH%(Y zI;Ys_F5%-mjq%Pvuah?Q(*4u@6-|a;)c04M^@i%ALo(I)xh|w$+u&`(iDQ5uMdkk_ zRsN1#w!^0)%l|2s02;ddAnLjLeX;mEgxnJMdE+LEc#u@6IK@XlL7f#zMyDkFT8Bc6 z^1Y-?#hlw^G~%CQR5DUTv2b4Q$q&gN!FkQWK3~O;7OOfIi6}!Qyo0B$%7Q{EA{rW$ zO(i_c%XvcC)|>8CCTO;&p)~o%F?fx@E3ZH=8kB_I+pF)F_1D@dhQr|*y%>d!{RysR5=(ziDxJ;AWQ$uV`aF)`CSpA; z$y77E`<;x0V&M&>EHrTx#~&r+rnuJ|Gtr4gSs4bA6%m=G&TXZucOn^!bjAUt=MG5aICj%?m&V(KE{!2xR%y|wrPJf;lC4FHdX^K zM3tU-4RL{njRbL%6j&M((Y&1%J@SZ1VaPJ!m~OO#wjkP1!(o&^u6jS4X#mQ&>)gOHSg7*=7_mbVC?!e)A%~lhDG7(tYt!?Ybb%I zk7KA3q6D7eHLSy7*4-YDQ|9{uyYlx^dx1C{j3MYiTouZrt; z=Hu&p;i%iWq&YU&;0(;Wd|s9^gdBn9sGU-C%8o63&xSVp3t3mvE)TdINhAKR3OU32 zTmd~?xhA`!INgEHgpb6Q{rt z6ix-t@hVJXrxcN=UAv6i6noM~$i3BNQzeh`Zf#Ce+dO6)^$J%c)!?wM68pnXIr*_h zTP6|VJPCAS7{&Q4Rxc+FEl9U5EgHWs(|awJw8xgUnY{*@c)w@QNQCCxhAcE;Qd&YN z#gv#J;IHzp-Oj|wmM&W^Y;=V0^LUJ*43xwI{!QFOTCfC`oiJeD5;(~#DBV|HM;#}> z#_l2>ftKz?lr@b69+&JDvZgb7O$vQ9rxpO{7CKCZ7t2U}=o#hL64qZOrgN}%$ReH6;VqnE4^}x_jpWZ3g zJ5YYF0rKKYVjAjD7E4XYj9J7B42y!}yi#S~W|R?uZ*aR(Pcd~eR=3--x<%uY?U#gt z^(9x_VAo2btC~8;izX+(vNhK4Ma>$mK2G*6Th49{7-*T^Z!s6#_`g@EpNl4v!&{pm zPr^Bgf4umDyJU-{AF_S)q`L z?l|Im(TDqdhTz?fU9$TPd#9UJ3W`%(GFE#&PVF+}bTe2qy~hy0&1^0|#<~l^U|ZS= z4Hsqh<+`E|Js29=Gk5NmPRD5?oiPVY3Y_@BZnH*gtc;=bZjV&~`F8mJp38>9f$mjB zeW6)x51F7WS@2iDt6~$D!{W!)YD~eEz)@Zm^0}m6O>B2P!aWk&VcDbDAuKiCtrRz% zOT9c@>^v1R;4V~|mz%Dk0k7hugcLi~Dm^P+reGEFaT({eTD^K%y8_;}88gFqW6DH{ zaq>m2QBG1)wN)Rtg@VrV1__O#3A6;&KR1 z``c)27B%G8;l3~I-09iGGndc+x=J1N{EA9vk->d66 z%*G@{?g;ZDgENeSKb+gO=#b;`DULx$|L$Aw7F(-bFDsy1DZ~$jrZFE|<&itD$OHZ_ zIlst5EUw<+mnrBbTIS}*3i^;jN?A>}Wani~fx*iL`?t(-MEz!~*JiYN+sE?OGZU{Dcf?Zjw&X;w1 zJ4{T{;%e4wn`80bj9DzUf59D)>#VHX$LP%EwHyaTI*Zb%r__4n4VU7t;15Bon!w^m z18Stk7L10X!(tXyK(9C&-sRe+-$U-HRCrF?(;4lme3vdWz#oFTYPCQK34~2qJM>mo zi;ttG&1t-GB+cRfJ|!LTLeAqVKVG}9H>56?r)5DA>Fqoy@nL9#P>q4(G(<6ffJ4W? zk!LCUAB@VK!jRuOuVvoU;PUka1U8wjBErz5!>djvkG1j9cxzj9dQ`YpN_d6}yR5eOg30diBS?8LF z3s5mXox_)CI1WE7g9{EjG~?ty%_ik-B+YrO)_{RxG*^F3E~|~6kpg4+KQ2Je^bdsX z&G26+tL5|Mk4*Z?oPY(+sZtdI%^{`SCX5@zFGxyYnLUnas!e}am0BVdw6$Fre>CSt z>KkiPRfMh!Ji}`##nHB1j-$n0O}SudXK;_cj$YLUi1BwT$@WW#-|TzD;!1v(t7XYW zDw)n_K_cl77*qBd`@KO^YDzxc@q{a}D%-QrU`)nS#-`z7A#aX<$a0CPEQVL+JmT zG#fO`mdZ@x?!=m0(`ZURV+MIR;>XS#u`pH~D?-0`8je*1J)`S1rUfTat{P$#8D)Hs z-Q|9`g0e2wlu|My$qb=sWd4D{(S3uS;K;$zd6y6Rze8JMZhPFu(&m`Ev5k1YYtKk5 z(7&^{Yxi&@(7&VK-54?I!%aS4V@ThRG=3>~A3p_0gb-kU!k(ZI0d)cb)M7d+5x0v- z1Om-Fm6z3nK>dY5;0!UIqT%@14 zY9#~^oiRD#l@v+UcCP%*nS#&=|3D^^NYxHF$|fiaBphWcHs?942<|%Jh&UpQu>_tt zjxnJ-lcd0%R2$*&yV4fqs&8dAA%~U5I9;F{((`Cc??U zoRvjaOVZB3(MrWKTPW{#NBm858Ur4FNzPt~SRskUQc`RVq^&+@sJW*(NF0oJCyca$ zWvn)hK|!)Ag~6gX>GZ+2T%NI$jd=N`vkz<(K z?nfL^YFOI7!~ckpenhh){Dh<;`DcZ?{g=OfTmm7{0iRjJ(I@@Y1# z^jUJV`D^T2utcuDlBZ52iI~@~KKzypL&;?+4U66~L5#z!iawQB7wKTRq z-!zia%k+Ykmjy${yba2~0K;pzyO>CLT1Jat5J^1&f0h4NzTk0zMYVfjKL!3Oemfko zA4^WCo%Rx#IIeL@ozNpZ4e_1RDL3tu@4>yfk*9EoEMz8u9jn6kTE`tZ*a43=Z zA#{>(B%HO$iH9U4t@qn(emzBO6^S+w6z3(ixJ0HjaODWu`WAGDb|GXbS!+@i#cy4s5}*4rh{!$F)%euW6@N-KdpHnwzz)2!pC5+T6}~vz9Oi zcAEFpCQxa$Jk^Hs0uia%GxA@2a&<3>`>le8-b>J?xX+(3Gx&Uf_oKec{y^N!5Qiip zO7FMY{RSC6j)PUWObfl7TPwpi;`m~m)>mo38R}?Ym&?olHcb(|ewrc-Q=y2kj5=Jq z6X^2_eyeaM$mnUz1%89#Ovq16$C<#}$2mGqQzh^Y^mT4JxYJFO)}5*;UnfxLm1#ED zMU_A;cI21TVn=>ol_>fuHj+s2>%}-1^|`|a3SY2{Kg}B92d(7)Hva-vsD0BhkU^uwNlyg9?@&n%GmOg=yOCq zaFBd#`g49Le9qd7e9pnfp`nJRp`l{=CNkPx$jyQOmyg5G`M;BY!ZC6qIwcdcL!6G6 zFbAf??>tG9Uh{wwZSnlY4{9KyCil~2zB5q;_%}cq!*)l=NC6XL&jwK6c2e%l3454@ zJqkDnU2OZ9kUS^V6vf*&rDr0PEzpt_b*XK{$7_eR@ zM?rpw&EHgL;LsS2;-ieWvNzZ3%b+X51^V*O!K1*5nK9i_C04@kJf^1g7EJjjqW!Ct z+GNR;LQD^nrvJPGF(T(=n95Z#`<~!J z1rN)53ZZa=N2&BQoa+e{(Su?r)QGN)$U9sG$MYx%K*^I$$cTP8gh~_lDPeoGZT@_| zZNVsiXq<0dyqs@^e>M5n^4%hQasZQK>O-MtvRhAFWO_yNzf#FQ;PJuS+Z$lxvEUpkJhH2_0t@;{HW_<*7F z6!2pMaETl^X&rz+u8|TTpIzi7TZ`#o7doC^MUxoX@78)YJ*x?Lc>K+3jHDVQsmy&! z_VO`uCW;e^r}DK$tHdTbuQ~YB%{#xcQU@d&r_tf(Al?l3w?y@nh+-*uYH&y2WxJCj z8@6s3Nv4*6W|0=Y&tb9$IkDE#l8dNhBu>DExIERnqL`T*<5HuWwrv_ofzK?wZEchE z$8f1jifJ|deX&Mw&_^S#h(Tua*cSC9TH@YNVdS#WzJp^$>bp`}CPMG~rbwaDsZ>U{ z-X73NOg59&ld{G6m@kwc-ZMFgjX&pfv43Fo8d6*km%!^hrHqb@xm_x;GFAd_@Ju0~ zEVQ>5lmU@p9G#kl8Cp&O9P5Vc@;qzphCgfiA-@2x9LH9>2gU-6q+~H29dWHG0pBsm zxcN{)Q0qa+I(<<%#i6c&dyR7{eX;uM;{4NVVubK|%BxN@&rjG0fVM561KBd@zJ(C6 zT{pdOAc#|N^=$L1Njw z72_fqBb7T79Z`PaZ7VZnt}vL?v#w$gMAUvh){_W%$4E$=QPF|6@zzb_n)pCN z=axQyWc2c0C2+)Sew_p;+m@N7IEv2D!PbR&f8MQB2l-fVsH-V#01F29El5e9mQWIr zSf-@EN-8y4TF$u)xrEVXY{?n?PP0ZINZJC#peoY}q$?N+mx54Q$T0NZ9Xfd)D zkIv+=m=to0C)P9obz~l-^%IcRNJrLTcOo5e@l=RhvwEPvQQQD^{5Lk@5yAmyF*mS1+;;Sbc1cc6B72gX8BI~ud`b)Gf9gG|`? z52}V_wrb?3RfC*T4aqFkkmPd26AjzHvQCdnG%mB%qb6{ze}E4wA*2*)KK+dgivFI< zN2BTW_pj%GMCCBL{2CnSx|SKGA{@R)LisbTPIuoGixcH=puw+}TM{ln%N-e?Yh)4V z?c28?Nj{EPBa*7*UnW?!R>5kmI;&4F)0m86U{oi&*UV|&Hku~BD51nCGtAsayERIU zg)_UfQl(BOKBvv}tN`!hO1PTSIn4&Te2dOwH_HDa63)^XoP1lfRMb3uHpx+8x55$O zY?Af~b_}l9I*yVnKGoSIOFM3S<+|Ixb+FKJ)62rO{3mPka=vk_)oH6-9k^lt+0V}( zx$ArT&~^Ck@7}QB#-;J-qH9JM+^{SbS$s{kk79!;0TH?VsGct2PaVTl3|#`(9K&{=gmDHOL^9nr zHDIEphOoz-@L1TFV*Py4Y)!hgW``LacB8d&N|nRO1?KJPO{`qMyW_Kra6WoRd6IYl z&Uh)d@i{Dw|ALnfEeH&?2Zn|M?F2e)3L#gQo`%X4%;E$nD0+&tnp@Xxv zCtNPFZ_H2vmmeipRSq4Azl#*`eBD&3i^_K|vLRGBZDlGoU3+pNGU;pt@j%PLQ&)BE zS(I1EPy~sV(22fvZMo3~tG9b&=N49j*1IbC)`q1`4ldjg%P#9q(PCOk!u6r9d2D~r z@@2u3ZoI4tJWoN%~1WtMV2=;m}1OKMKY)f6#0 zybg)ZXV*J9mDcMvMn?A!G_IdlRN&&oye&w_Y?E?PyC{N%Ae<{s#GJ|!zT>!GB*LO4 z-1{sSRyvo(%zj9%6UuRFrDz$fwr27oStXAK7%Hzo^vq6u}fy{N2;1n;%}`7p5DInGi%!e zN>yy=>ZAJu!*h}v3Ry17-#9Nhw5Qht^o?EfBJ1y39xne?8|h3~8}dn=F)=rl>`fZL z*H?aRUq^6Y`)yxc*8k{3hqv)kg<9kD+X8xuVd>^gx6D;owDR2g!#fH?83Uy@DmLG- z(Cuy>hQ50M&iy^o3;jVBn}ZFW#$xymOp68Z9Xw@Y-8L=!p>n72C!wR@@oyZb(v4)e z1T+)IB^@Q8nvK7DJZNnbeU5mq^}x~Hn;zfS z=I&hGnjUGi7j`_db@KyjQ}%|DO!MkaPx)s{Mn}fDXjh_dq0>?r$;EmT#?2d6Z3fH6 zZX1sWN3ULxUp3n6wD1GVa{bqiXJhmC&dH9=>##U_MwjEA9sL8Hj$ATk3~e|!;cd>Q z%*J%C**!QiES&v;5kH3(F@d#XjYq9XCD|Y!f!9F!15I?GnCVM!>R3O#COMqj|JuC}6?}jH{GTD_f=aM6N5r&3b}k3?O-#a9e|kf2Rf%z_f-Ny3D&#ZRIaYEU+7?uSBmL-E+8}faSPaK~8q%}@YeP8VzfQ*8@CVDjAm9ie^rkjQ z-2ErHxHvSX%+^B)lwA2Z0O33DM3rg$aGFG?d>c52Rwh;&weK}TC(t)oT-KG4LxB>@ zO+9O`;8!1BnJ{(j8$SWwr&Nr17IsJsv=yxlb1W_k+6d?inLG|IFtD>by=K$ywkmE| z0CB@fIK#!*>gTW|{!3myIO-eZeS?EOo=`wv@fV02=0H4otg(^HA-K>x8bNTu;UIg* z1VAy)}STfHQO!b zWM?4So1Ov-=2UmY*?_=;U99!ljZThL`8?)nus~(!t%I6pnv@goRAxQ;5bx^Ldl+ldi^{&wO|npK38`EL9u}D*9kEPLShI&UlsDn! zFM!Q6p@K0MaK!y?HU1l!TqZ)#K6f4uu%4Kz+J#NWm5;{Y?J06=8Gk_zjzkXm&J*1H-)N;7c)!Ku4O0Hy@Hr(1TfSR>; z?o1D4%?Q+N`P_WBt7Q~bo;3?xLZ~JW*DRJApL!=>Jc+o`3lgU;0CNh@BbWnOMpanG z5?Ff)zy3ItZ6@n?L27uJamgHkdeFYBvRgwQ78Szriqi0_qk09iYbwE-y)C=n2M z192A+&jI32AkG7E4v4croB`rAki~#33S{MDIMCF*}rvb;b1S)~;R!mMy+*MKZGBs^JPuYa1BL4PG;zip{^QJHBM7+bY1c zW_Q7_ML;bPGlf^5JLzrCrA)?D9s#xaNE_Rs?KvYLwN9)>*BZ{RKRmYT;eG9)!R?>t9XjCA2wx&+muaic^}ruFFjnp2d^C^(W!TZG{0NnrUg%@F(s(H&_4H799JZ zgTmh1t=ZjGVq3(a@eQ+NUoEd1FZT^0#Dxp6 za#1;B?~$cLqLJ;ySi0d?JDKcEe!>oJPDv~3Zf-SQNIPuQP7{f>^+w4 znI)0IiL`s!v2W7I5$XM3+#|rL2voU;6soI`%!Q7)>TGq08i8SxR|+^ke#wRdP$}L* z&xRw%_Jt|$`<-s@T-6cI${II{deKx`eswOmj{7`# z2m>%cB?St=u_%cxh*f2v%W6mw*jB;J4-XX3U$Y1gglLuQ=0u&HwH_XxZq*!x34;6N zg(ER-oDA6nuvrt4^pkEyU_9F0frb#s9w(fm!kk`*p7LU#=r zIoM29ir7N2x3~XB)lHm&^1E!yHAXKv7R-Tw1PvVO3|RJv;Dz}l|BGijvq0pIx@pmv zYlVsltSsCzYfW8bv_$udz6H(zLh5h9qmIXYY@P$IB;_`m^R*E>C!tC#NB zPPy%Hw!O6CyfMrSf>lqRG<6GU zn8!OP5=6a{-pc~RZfYO|%N;-zl30!*JW^NA@8-yY4x7B=9ev)qSDGMRGW_OQ$g}mR zhLcvJcJx`Ut+7{sKeiTC)R+GQ;HHzdpNE?-?sXAZN#7S?p>S!B_Gj>4I6hV-b#%LX zwQC{X&XVT}u7z?=z zkTbX91Uq)8Su+FHVvr2&NjwhzE`=rLm@=Bds$8+2O%oPtsaO5^Bd% z^(d`Bp9efS{NNk_ z6lX#RUf#c$QNbbn=td3960#I(-qHjw2g`+A7A)pR-#6=Q2-e&Fj+8~!eLu$W>0`g8 z3n+a>`Kb&RKd`?GiIxGM)&33?`nhja(%k0x4dtPB6VJBW=n-)S;TgN*7Bd~g%b-+W+8|Z9+?h+>Qm#UKS|%?tx=Aua2m_=5S!`8R^ar)$eY|*et-@ zW$}4MoCKHFOrT@D1dA#%-As|U;zY4upI2{DLzmM}pxlQ>#zXNybwc7EWEE<>4!5{KuK; z(dcIKn2hW@Y#;A+O`WrvskvOA$>mN7K6wIqJag&wyBKjLAHqy@F#IVF`ukYB=sFyF z=fVfd5HcmoPWX$gEu9M-v#+m`zuTun8BWNVVP#TK<@vV8&R%m3&td^YT}YZjBCwfp zJ*V~TFkvJa0TMobQ-)HdHK=kr(UfZ1IZDx(jW4wr{pW%#__%qg?AS%d4LYuj!1*Oa4HUyRxO>-O%7 z993HMZS9;x!Q5$IQg^<;VT`O50yrXR|4S;ap=leU`ZT_rRLwb|-m#TYk~R1N<$-ow4k|t#l&%qS#h|2azu4l~{X7g5`jXx2ycy}#E2Bz1fJtq~9 z@)wdYcgTtjEJ27)gFq|v$Ic7w)7ucO^Wbl#LN%=j2NcYLVl$$ylL~L2A5j$juYzV^ z0=mQMB=k>>FX{9pNzK6a;VUJH^7#H`)?#zaU3SxLZ;Pbyp6u2w$Zw<)h<5dVD0D00 z+q3O!HDAVSd1%7;=ElPoPwSS>+cR9S)Gc$?QVd;{WiOX=d<`$slzah~(BymM_yJ9N zF_+Lu?`?D1i9el<#JZ%_66yIWE2~8?)RDl636z+jSM#B&7a!}LLH<5SpMpyROX}{o zdK!Y7z-p2dr?vUi)a$fs1;{37O{SIQ2A1whL`dj`O0}kd##uD?x=d>7Kj{bro2!*A z>l!U&hcTTq@J&=q6u7rinxr{Xrz+~>V3L+^n-dGL+XbUg|ugOBw#hYBfqA_)Rk$6UHSz z`tW_0hvot#HA18Wgao|l{x97Nd0vcF^hE5&%OD>@Z+6Kp_rB zsjHyt3Y`j8qb-&sRgoch0i4V;O6V?5 z`5q}WlV(P4rX_%bHR;I{jOUWAzf6zl@HCfT=l%Gjsl4BPKgKV)4go=zv9Y{{?)LX^?UtMk6pr$@bzQCLpd?@O zpRr23_LD}!1h9Z*gaB;P`8YnTzxeroK+$Or-0_;QEL1HYYf$bBq3Pml4^3|q39CR^ zD?%1o2ZSM%Z!EMlsYB;_bNJoa6LpyIM?(MsnH-=Xgphrux7qU;K0)!qp5czwX=d;F zvZE-@Wl0avR8pfby>IpcLKE*+^!Ok8?Tpn5azs&o6fwuK1F9h{dR0<|@g2wjZ)|S> zUZ=U_I~9?nFlOQKgy7nb%cm1_6oxvlJFTTdGG!4cb$|ya@5uz%L(b!A!r@eCPE6+7 zG$t-Csx*MZ@4Tp+m$MK-413+*m`%SX|_qIWre0sn|K=m>B%?IzbXk zH;Y`v{NIFkRWz*cipm`=Nmz+NK^q`svINQi4S0(I-bD#m}!7-b)+qR=!ueiI_)z;@fA7`*j7I2uW&-1U>n~_PlQ@C9g-e=gFuJrceG=pOUA4 zGII@;p2#8|sXfEa9@0Yro&Dia{Ol@3`aR=yxe>5aQU)(g*ujE0!npE&hYn9i(aMk17iE-kK>AzH>woROKlv z33x#gEXG1BR7;#sZN$8q|7EURqDD~nQ4~yD;emGh!&Mzm?UB!_D4xduQ%Gyl>RE(R z0RFybN)cq3DG#!sJ%Gr2c?8aUM~1|8<|KXj3;WPGe~yYqgq%QIT_uP(sk-ZnMJ4Im zAVmQ%!FSauD-g~8vC#|T*WsFi*1N=^)>l+-c)U=0@92c}ODcw>JeB$DO8Ftl{0@h6 zZ$IM=sB*Urj?k!r@yG#^D^j4zTHWLQm-DFUtIF!zbG%Yl(uP-keA_svo}jx2_s9Qb z`58<(Fb}<>+%~ zT}^EAS(ZI!)AZI?C~UufJe<7Q(xYfoHAN+!n>f-dS>eOnZgoSFvDfTMnK20e-e4SaKOI})l zw>G*7K9qaKog4L@)QgX3w5%S+`*+cdnUfCufnY%^hid8#Ti)3swTG;U| zXTdcWue{0==+P4+XNIs9v38YR;_?v{GPEIt;~rgR0br4~hV9)LY2Q2p z_nkZ=){2*ar|2k8M3h0lmvaf@G;ukzZF8MiHH9hIZN3!jyw zK`gtw2JcePxjoZtKG8cS=I%nuBxfW-m%7X$$b^_~=;5`+HZHGM(0tqEWGvgZIVp95 z4Ze7%NP)^oan{;on3|@HrQy(J8b!%TDqG*wfNHeBxF)kB@pi>3r+y?mam7WR{QmAB z*OiC6|3S;`)GhA>5Vo$ovOMi~xj&-BfRbBMVU)U%8p?dBhnUf;L zPqH+B4Cv(2tI(NXq)ryIR*S?^o6QJDC()^wUiPY=oR(yBqrdLM=fJ>#Iolq{ z6o5133473ZEf>%SrifPt2SF3>!P1PGB#QlJ4gF%QiRHTxZef7ry8{QycW39lQpuA4#sI z=GF~OZI`Q_$IK;J?th6XiP*ou^;`4GLc;Uih0ZnYRSky62)bIE=%$u$np}yltaG$+X)N{kDy^_@Ey{Y z?m9Lz)#Z#UpX!{J=-fw%-`VT&=G^A6kZxc8>BZx7Zgb_~(drWS%aS2QiJ`L4EjPMx zESoSld4!Agw3@T?wPKvBdu;0U7)br6);@i)>#@|n)CK*Q&n{osk_{X6;SmPAYouBw zi_R@oU|+aa)tdSeEgE%ZH<9Co4w=w21~cTW9j&Ei>23C zw)0GF44Dy|fCoK}QY9}Rxa+w_D_fGLv$5vBqQTAKHnI&63|boba-w@GqV_F9&_caC z4&OHf*ezEecpjX2iq&v| zh;E2kL(DE*&pm<1$2=f;`QWm$u_Zyq`7iKy)KQbB|7Z(k_BV%p@iY(}2D+|kt46M+ zc=Q0pc(@H9UAfoor!lXtbhY0>gvdwZ2sfKOK05U#Q)3IiLY9-EJx%Axg@M~Lz_JkF z1^%~@v9~wSZWzE;RI(G(17Qh#MrkxU9|kmJ>5yaSu8(wuDQqaMl0*}bf)N)AQwr6d z-7B?DCAx*H1+OE^2CKx%<;(b8!ZhlWSh10++AXLRj8?4R9hB$n-kNCA)UeoUWeG~$ zY(t?R0c2?PlA>b%*q4z`kHS7Ue&PEi+UA}YbB|iH_WUT`d|_j^Rh^er6<4LYFYkLt zRb-Yv*+B=UVU=}1bR{W;-z7;LkS#1Ha3?xWc}i)&XuoCQ()4SUT3f@aq}Ci4HsHCq z&ryVYBFIuYy({3f{{kgRN;tfCIt?Jh2GZx{yaH=91+&x1CTFN+VGy6Z}++Ynx1VUKU(ZF6qop;4rU z*)xXFYJ~90I=T&$wPp?eHl_MF+R57rlj%~W+#Jruf>?Np8Y4T;GB#6j0ab4B69j2B zya;E@41t5qAP~lt@G2eX84q{~foE-C@vaLLE{~ieE?A~pj=S+P0}7$zyTtxTKMoKv zB4IqIp38pR&^4PmbREY1U{6aXF&06c>@#m)tp2k7*X7QuMuEGp^zSMc{8@MQ>UlB| z4+*h^6!FP5k#+k*G3!g1Hu`Z)9k=jjM&2ryOL^v1-(U2WcHk#^9NczK*~FB^=CGwK zR8rCurWEmxzH0*}BxS}2wR|bN=Ykz5cFr?fhuLzqA`op?Y?wfj4D=^Le_P|+RO;?! zDhJ>dDZz}x0yz==$RB@2;w*~z5B#ncSp_D`=j*H;^>SIS+?cFxO%ZgU&kOHCC+3u$NGe#f#R-wmwRi;J*9 z3|85CajgO+!ed4~R89YyeAq^V`AfD>qqhJzlF3Aihte}_+Ty=cmrfb7dNnE~CzJM# zVsc{&+&z*+YgLvQNl+|*=l=YahnyVlE*@o6GKn#)r$vR|z49prV#Vb*_S|`thB0hN z5ReTpj!Z}PIJDDW0qn4mp(+2SuFV!gi)VO(}NLN~SPGVDn1t zU&gc3%wYK>Lh>{7E{TU4@Wb)l+vdQW5HVj@eoZUKr;Nx}*S%9cklRjCR&}ZID`lw*qeZUk%p`1Wwx!Y`3}n ztqp%uW!1smZey=qt97n4X>KmeKbd-!mn&pUnlo$EZ*{l!GACSK>vp_P)FMqEG6tC4 z-%f(l+w>h>*H$WKww$+QrPH_4s>IQqU>?HI9bwR-sEpF}dwf3z(=@704<2vS_30mK z^lu&wADSMTDla#OL=9Uhk4L-iqd${;G_+go`-6N%~lvC2bOv_cF6fx7Mp+?!fFgjuM%BTu1Iy)7dtz*sFdwg zgt0$v0kEaetIR?Bx`x>8t<*9+Emhg+^SW=3T3I3m88&a<%K!7MN86Prc`AMZ&B-om6zj0<|Qln1r#)ClWWm+xUTfMB_8?H_*YSd}m$YSAnsT0f9 zv`s&|le|!J8D~w(PrGE>=^>tXWBOy^6Z(c`v~DRXDg7+nIyA|KS|7=z707(H9{6%< zq4H`~?7N~knPppZU00p$Yh9K;8pZE*0!!3r-{$^I1TL8UE!A1w9M|1rX!l@~bu=0s z!2Tm9ZiPs6{rbeH$KDPibL!&n*gp_~%4Jq>1%%uA=(iy6Q~Ue}KiSGGm#DXM%exFt zP%J(TZt@x9`a@s-qtttEbVd5_z3HXBca{g=buv4@GVT7V1qvW3G5=9w;c0wL+^;Q7 zlUT6{acTL=V;ACrRb5C{Em`>p)-fqobTg;3dJC(!~U}e%Qp;=o8o8;O}Nf7(dJDh*&^ zsjuHm#6r8hu>t4qN1-Xd$I|GSCu7D7?GLSccMCZ zD;8Zd#Pn&PPTHfkYVie+o=)hUfZ=}FvgXBj)#~zy?0QoZob{SW3Pv+g;+aCg`QHXy z&r~5G!<@Bo|AU+56&rUI1Dn*A3hV$7Am$tqcO-&D{|8~7gu;25>IILOdPc7M0V_hw zM(?TM4XJmRN`smcUuZdK{OIjlcH+k~6mer=hCNPhXx4&BWD!@k6xKw=$#;;>*ivcn z`7JjP1{IF7>@|XHDezN9bxS&VLV27&r+1{^5BDLSY|qavWKqiLa%QWHI~)&Ni2dBxUaVqjg8baQh-fJ4cfM z{F#@of>!V3B-Rksw}&>{fNF!G^VnsLUPT>(HXUiBC8z8i=ud+YWpm}Zv+snZ*LfAE z)9iZu*0JhPngQR8fC>?HGn~1~RJCH#co454Tg722{!)43AN`&um+qe@`Rk1MSYQ=M z6pELDFe2#}No4x*!IXK?j2pY^qospm>s$TT&c!PZWj!kq3)DG=Tc4nbX~$w}9x6w{`Sea_Tc zmigLjL-I5y!6_va;O}-;}zaqjj+C{T|vK%{zC5CQjU? zsY5GD^?xy##r+yX@@^8fiTlV30l#so6&i@NzxFO8{)Gw^s3*T`yXk*8oN~?C=?}^KK`5XaC4>GT z`~ki5mOuoRbm%wkm&T0^vjUcFG#C6c$b>tYcFf|0>%Erde$%Myn6zSNWN*|V)@mo+ zs^fIbX+7pxD_Q-bb=9sDSG+S_TCF09-txRI}Na5~>T|EN--gP_imNz^QMwJmo5j3*9 z!#;Zw`kBt?(jm6ak<9GA14~zjxM9ms9ILsq45?LSWlf_|iZjJ1J_b`v%Sr{yT(uri zrdl%f=_&C*m(;hVFAG`80bm(0yg0>09lxVpL7>R(-QZuk^3*%My}424|I@T|ZF*yM zVb55}|H#=?Icq-I%&I_eu?N&y%*@-}4yek{{?qnSf9K7+{o`2jG_ifEwIs{TF-}|Sr=D-2 zoY}L~U|{LC4mYP>o`U9NX}u??oPAU@qiMeCFQu+pp)5&S^X)ss%opu1s^p|;y?mi^ zDmS%IGI@C^b+Hs1TdB3`^^D?doV%l;ZELeEg)H_SUORiy3ttO_qnO7g z;OqI0%zmyq0QLfP_%1G{pbolZqlE>0mJT#%8d=P za`JjTmc4!El0c4Gg?@cSi0meK`;wL2GB2eYKsn^XOZ9P3EW0C?;!-(1dt26L_nvnk z4xTxnaP(V==czxijCgmn=PT6moSG-#U(yC+x|!q(1M{|S`UeSbO*I;9CxhzzJ{Vd# zylFtQDs4u?tNTSF)9fmr!v(uz8gQK%M^$s^pP~KTdb==C@O-DDRf78sRLl_PLhucH z_1Zl|pQ=WFtF?bqvt4FOUeVp#A@*Sb5oOkCZ8{C>9jh217mwBAwDW>(;(*4)sbkc4 zKMKR@CF&VHBKWBg`v8@qhF=%vuT<9{_Hfrd%h4O4Y0uf?hhF2;iDQN*VH$Mk_jJ5wC6J3()Z-K_IOZv z43?8g!9FLJM!HwJk$G!bC^aj)n(a!*U#2$H|I<<>y+!QuTcI`} zSn{9y-^A^JE8Gql-4cOCX+2SYEM;58l}iOwcWK^5s1Ne%5-rTDHOy?dU?vr%CC%b1=go9*^b8nxc zJgToce;YnN)i<1TXW)sDW<7jUY|JaR+!IZMTGPvb9@wV4%yYh1@&1Lk$OrOFJ-|_; zQe6dar+OWS#on8NY>U`0m2FegP|Ct3nYw0ntZjpos$%ZQiGzik3Yyjoj`}raBLx|d zWjcWP$QYYoMLJd=B#o9)oh5fZN$K>s0<9&5$4Kk*B{XpGD0i4gLie@Uw0Oe8-@m@j zfBe9Gg=&SnM)B&B?+90uz){6jOw2jyzncFZdjoowcr1Q3LhRq*)Q9A@HTMeCvn!k7 zzMpbyH%@9EsyqZ(=qwYx`UR9@t~O0}k{kEawY5-h<^m&z2&u#0w^D(!9E(2iu=w@Na>v(am1BHyw4>WJ>^g@QFZ23vUE-TJ zQmI?CY8tt^u!k1z@!%0kIRiBfrhe^ewlC91>*D9Aqn~c#Z_Q(*mYbJ7%`XE33#%1g#>VQ# z#chR3+*}PTXZUfypN;8f?7_BP9h2Mpjg%{uvl}pcW@`t&%E@V)`(^?Axp$c@Cn$jAl93MOZP{EYR7R^6P#*Q-w9 z++uCpT{_ABt+hKQwk9~$7ZmaQhcK;mOaD6sf}gaY;n?qaC_e|?CWNAuO9#rX1aLcS zL8*=P$d#x(UKMOXj=fR`G5e3GF?eBR0wPnc9OBeCes> z)pahv^=HG2VU6Uq!n<6D8HwN3sj=Dc&8ima@Sc(C)e0W7yKAO4)|hI9_$QWI!yn<^ ze|)^Hy`LGat2n{R6?My}0CWjXE-`G}?T?1yV zJL}74Yj5z&Zn-X{niWi$hIs>*`q_1Uj+B(^cg^sd!) zlP9_6#-jme-!8%p-lvFWcwXiS7d;$%Po>i@Dc#(`wI8+wTSODqfi5H;7Wgh?#HP30 zG~iE9ZYnU>+$Vs_EA~>gw9+72M}QZC>CexAshZU(1??F)MeqTT9`^c1Pq4b%z(6?^&p) z8aL%uk!ryJR3{(3b*pttIkZf_Q>M?Bs=++(!un;UKqpY1sznQfn#$&OY_Tm0_6`E6 z|A%@~6(3iuTGhmat6K7uJ`GnDOS!4)XmN__WB)?g#9oq@h!)KjVpTxA8W4dBkdd{` zMVmgD)-bigRn`H8E{I)~Qi)QP%BoqNv6-P)&8&Gvtxc-T73}AvepXM*_tjDLapCSt z19^!Ujruxn3%W*Eurc3IrB&14U0Y{PoBUKM+Z|`hub81q+h9yfb8tzt`vvO#U}{Dn z)q-}fJw-IkgjP2BJOaIT?*cK?i;UA!z&CZUT$L*3)wZi{;H#G8QLf()0K`|A4#iD4 zc#Mgg@}uS__JRD@%Wku$6&cHJbux9utrZ=3lB;!HbLdtN8@s#$JIa$2@Flp)~PEy%fxkV0Th(_KQKgDeb;Dc1Ae_f(-cpAZ+vfOdprcWSzTTym5gjn z_3sLIg7*4%fA^{g5a3_q;^1PXYPWqok7j@1+?P5A&PQS$?mEcTRg_L1y>w>r!(H#s zyKWOlI}_vJ`@%JTv<4m%-oA*!6nEcq zRKLq<*=8gJ9>wHVzJb~y0l0z3*K`kW zi(k_B%D@{S9Kv=m%xRr%!s@-`>liaArS zsDg7XC_$OW2kWxi8b8tCviWCAGUJ{zjYcJ1pL)nkIz`i%AYkm*b%k1YGjt$(N z4S?`#fqZSoLTwj$P22CbTWB8J$`@_Gb?Cb?qBTC+qHcJ-7wWe(B2FsigqXXETR;^$ z{uBLu4sw@0YAx!%M{fSb5!k=K&jCg6eD+1>mWvZgB0!%T&ezp<4{gD}@Hbv=tbe}$ z4i*<~6ha@@3g`3T{`me2s4iw*oS)?pp?Ihm0Ync^I>y(z+mP2^%<*(G^Y_so=$BDZ zTMX+Lc%46tK@nhbNRhld(cupSd50;#iyvsSKcvhvhE$EP%NchOdGRLOhwtSf#`JWX zxn`!9{oQ}faCUm;$6*5{z^2dfJFodeORy26qwhcm2_v8bxIc_7nO=-7!I`=fpx|k9 zx{W@==XtYfruw{>0@*)U>0FVn@~=PD`UHY*AZ}c)E7Z867NA~PkW?}$20Rw%kAdn z#^3hT#S?!Gn9KFw^mJD5u>ParhU31|rP~!85V=$4-q-MT(-X$GwriiJD28R4qB#0n z=HYwiY6x>r5ULN^*WT=ZQ6VkRz5ORb$B$GIL<0g4?z`mY@hdDT`v0!~@0HeRW|7)!qt~&Lf z)xIbL%uyO!vw3^zqA|d7k@|KTW9qv^SpH9O(l4Ct6lOkvrkT#X`q6%=6?pSEx0R;g z8{3v9lP1b)Q;i8PN`A35%P_T1b_@H$9>c>j)19VIZi~BAm`!Z!a}s(5-d6pP37M9L zWFZ5kna(gJ?VmBz^e|GH+0tbtA{dF`>Lx(ritttWI)RafNywDvjSG> z)51dYQDeA5I*18c3ET27ME%$599YLa>S1veB!)E5-<|p)79yC^FV;OdH-q(D*b$h` zV7P09`T|}gww3bmY+%wdgN|%DgT1(HB9FL{xv46tqC1WcY+$cwwBG-mnmNehi;Xm# zXq@j2`NGIxnh32T-FK6=-caVv9U<{HA@C-a9KENOAV(T&Zs(8qp$Vcd1dH;`f8a_G z^-t4k5Jj{g)sqYThXC*QY6zZ~a6V*+Py5pL2Ng*bew0Wn+`;8f4eqNj`tw$p8}L-h zK&#*<^nIr^ooM-Kyk?W;1Tw<&~|g3M_HSW^bQyf2YKZUkK;Cv~G> zYB5tZZ(8X$ak_6oa{sHOGF9??Q+x+;cH?TNdR0tn-heV|> z<`mE`F29tKezc>kjaWOP0C|NTmCcqdZzH8+h1j^2`U7v#iz(;p!Hf2#EJtZ;JQc1H z&+&y6T}vCLuO#+_g#TeWY#ca~nCG=MYR5$oyU3_6H#v;>o6;rMe2~Yv)POW@98xpz zYy1V7Sw5!3py3bG$ftxmjs|~;Qtsg&!q+J@BOzS6(^Slv zZ%S#8`jYu}*4W%d-u%%;3QIpC6%ViJg`C-=7*YecNS7@QcqVkYPd0J$1j?!HnhMWtz;TY-7pt{jJ z>U1S@ZaK6qrwrq})BdAilUPtMLbE)3@FLQrjk_ukWI-$p79)2kX?KlDipl?*N2P?J z9-+`kvoU0?THyA2;QLP9@(5q+ZW2zc_2Hr7U2o309mjI`b8W)T+kw0(cMOJqRs_;b zf>i&OsLpjRjJ_F)bl5>J<$NU)W?NR(mO&TQ1*MqPraZK3G-GfjKOYgnsv%C4#qb}& zLoz0tiF482WCDtGW!63Rig>CTH6G7rK{HBVwqNqzj65ZR|oTcA>`$c}h!5 z6HEuKiIcq|rtOukSv~F!ynpM4j6Et{$1tTfyiF#aN)IivSbokf4`oBP`Fmmm%14zb zXI?v{s$H3;Hp_?%+4tOVxQfRGjROCP3@K@J&EABeUR}vBa(PPwJx{IDXCS?#Bjmk4 z+KV?@U9yNUxV<)hY*D+-$}*HfD@`ryh)K737^wB=hv&Ii1MbmdOq6ygT>^2eF2a0) zKHWg1`mfuuU2?qSX}mGqa1@6VZM3r>Qz*;qh4&L_Es{|xRZlO<)vzVk$$K^JEZVU8 zmdf3dHN87byczVSxnl}BlWSv?U9Xd084}@Y8y9)V96b|@Lo?6{bCmbs{Fo4W>|mxV zXI9v*<+7}E{dd2GLTM4T{7(0mj4SUF#G6X8J{WYc)6SjMUd@dfpB6Bt~)G}kM1P0@SmI5J(K+qN6dyN@I40)wD_@Vb-q zdxQr`M7&x<-Ml8kiz(`rW6~9P+%O_OT0eFjDzOQ;I76adjNG7cg$VK>!bhtLI#cDw zRyC54C~uz_pKp_H!V1VbxkPO$@R_z^Sjz`k>)77X96e-%40ZPAM8kjzdG4eG7g6eS zL!d}dEOeK52QAJ?lg}wM!CQmZH*R0<0m6C-YrYPj%#%$BkIad)4RH(2@VW-IZ^nPl z8X{YJQ=Ri$1>vzyk!#TU{V6l0kC~Wr#DNIyuyd!$j{HNXuO4nh-IHP=nEBI>#WrbYntuM-@navH*@Qhd zIdh}TLfBLhp2Huw6r_#4gz1Q_EWn2Y4PR7*kUs4u=;bCMcy8fa7|7w*feBm2O&>Qp zLFOz}`!uBP|50LQ9laTvF~ft8lYYpoj)gg2!_S>OV)0LzdCUuq1I25s4w=1i)!W2K z3**Rc%uzTAVM~xdeffZknSJ1rCzvi}qP~Mj!YrdiE(84|vN8?*X2qCl5K5XM(hfFZ z1apxAu3LuhqPsR43{i~h%L<+tG~FFjV%yPl%a_J)Y~bZg9gm$(2PHA*oF^kONfh<8 z%bzJj!YOEn;nO_O!_1Qo6jD!+!i9lfr|4FAAAW6zg&Z~a2~EI8@@!PD5b?p236>Gq zzry67 zE^RK}*@?`XF8TR7Qo*0GFhbGuVWWP_n7cXSaM3eVo2$ZnCJVWtqaGs>U{*ZwftfB! z(PW{Q=+B-nM*$i^;W9gBSNdo$F3gUQm@3Q^)0yaNwEuv6XLuyU4(BKf$eD$7Uh`*k2o{tLWo+VVO$G7jeza9h42=# zsS{}gF`y+52qzYd|AGgR9>$WN-l12; ztPKXwbzqz>%W89=hm-bxQP4zgF1GBX`ECgbiS=+UA(Np*kirC8!w72JeSLeZiGum0 z0Z_5VKyqgCunF8V0LnWZLqKqz# zG4)3|!VVDp>*B&8BAT@=tGy?4<;hD8gFb z-Z?=(Qy(}Y`)cFixH%Mds}UEbrnX)}iKC|x7a}~5p$99rS~?Wnbd5T#trO%#5S9ul zqMoiXoR9<^u7=nUs=&$#5gu6KK-%4TVQ4;B6&-O3iwIXg6?ksN*^Uk+vT@RK{-$>gW4W~E)-p*5Q$M34_7k;)WwVuA;MVIk1atk@(7lm#!-B*(V^;QN5za6 zG+Tivfu0c+0!gDljR_Tk!F%muK*WeM*pwC^g^EzTXgeM1fN>Ag|GRJHVTn|Mq@$%1 zJ6H(O98-&4Y8RsZKb*Y-j4n~QEqL0t?e5dI|F&)0wr$%sPusR_+qO@0&b{y6nKzTX zd6`L8c6Qa5`gUb!rz*8;eQOEgvmwIO5(Z5Pr}+bzD5lg0g!Oj}!{r4^P2)U3L-P-t zQ{)v=&*ce$n^fnH7W#R8{`w01_3huRv-#Kd?tB3|_O^M??x{WI0^RHW?GgBI^p9KX z_PE)9?gW_UJbVTH5B!|o5cF*%C+tGIFHU@7J5BWdz#VY?B8G!Du{Cybb~G`t`OmJM zp(PwNBO?P7Ap_xm_O%F^nAmg(|8GI&{|*8G^wK7_X3pk>92`uX^r9Bl&L)oZqSgk^ zCc-90cE%?E6=o!4`UGQ}>- zD$U5TUXb}{{_xqR<(@WX=EfPV`{8`mCAu?GoIP6Z{@LI8$ot8D?49+iA%;K3SZalT%{W9l_`EER& z%$Lm3;UjJ0|NV*tZR#a>V}940_5)uq#|-H(pK)gW`~9U%j?h^QMKF>;)Tqb&G;bS^ z-~5|aK7WlltuMzeCRg-qh9-Co!YpXi)K|6K6SSbSCsclBUw`QEre3Qzd`=KvaMKsd zHO%|u=YC2g*taftE_K74G*?|$)HisCiuj$#Fl)f{t&@GE$JOh5rd6RG8tHA`%B<+< zua%bjY|5^-59>$ygTa|8Q7Zf(6_}>zRO33m_TOnVl^2Bx3XlosU|?4`l3b!Fma#z7 zUmmLWLXrvN7g#8XBq^Vh59s>s5q^$*0%aQNLnlr&lM@`OFVx1m?f+^)B#uE~V+^E+ zRDRM|1^zN{z=eS3iUwx@@)O)%XrN*ki`iDK>xQ*e;DXOuV~tThFE)wEHk%rARs4*CHJmM=$nj{?;Zf ztFuRhx3w>XK3eZ1J%XwjaCD(T3$q|`6SD;6&wogN#T{Yi#y zk2b8vLFX=rmWltZB2dudVtCtVng|n z?bpw?4D*TZ)Zi7(({m+?qB%7K!~#*LoWs~LwsdXydthaq3tgjlg2YfsyLtLrCgvui z?m1OWSy~bMqM%DLGB-K#VF0L*xdVefGgqVSHV|A!j`hehM)#G1TrnF5oz}i3B*aT` zBUHJ&o?XT7Q;kf&f!>7aWkV58RG)268b)97!7>JkzAJ{`<8Z-lRdEYgM4{RP2Pru{ z-4!J|iUW9?U#PCOF!0Rr7K}PGRQBR17pf<2-ubVGaWji_=^7=|Lo`RBQ$j-0fw<@2 ze{^*P z1}59g4k(uz9!3nQ>HG@8nhPZg#VXn$0u_z4((h)9VU><`$7Znr3c3jmvVkAuF(^F} z$Ye$2DnH=imHEi$RCPAn)(%Yd+8WgZDAt_p5`|!()?r!oUKFtAgxXC~#2eixatz1f z+2D%7SfE;i5M0_Wa(q|^V+*<850T^0__l?L?fFSvTqP5GB|w6j6uL8TDu-q$As6-2 zt62qm*rkpF0s))P&&Cn-p#61%A_MF6@D9s$P5~ppIFiH)H2st;krdIqhs8*aV_aMU z)+9Zp_js7h@K@`60!6gO<8PVxd_6oounFB*W-V`AF6qO=EQtTdK{oOW9-0 zPN?prIc|@Rz`2xoG-*bVouk(Z4guGo# z;cUdfO*`+lMw)VVZQmqT>CTv?`8H;rh%k)8%HVRl@2&#O*a4k;79nO70NOj2!A7K9 z@*_ct44}Iq2~+kv`#U3ZP!7g3HwFS(yA!r0PzE z#j2Q=B76Zbx-9AF!TVg}P1&c8v^wom==!M$ZXnu7Z8xEpzNV8N9=siW>D35~BE8vrz@4{or0J>CoP zei=|$bj){a_n%H>uza33yo0;EtEO*qX`yg_P8I`qS0$Tpd|fO?Z~Z0l`x#OcaA%1p z$UQ?LcO|7#Gy)oe25x&&Q+{3QMsJrQ%{*;f25-Cj{QU@#xc$!q10hR?oxAN}rO;a% zdOSy?V$Zd?Y#Y^ zfTS9^9Paauk3OhXom1I18VbzGh#8aw6g{5%gNPKANF#_79kJQzPT0rSSwENDEVJ0o z8-V@R^SIML2b;sG43ILN*KF=prPK&k6KawJ`5S0r7(wm?JgBk8jK6^nxJa9|+{wU)&XR)_B{sA40Uv8Jq$1a7&9~_ zZQhJ$(v)UTp9=|?PL|WNU4SI7zp|6Y+^m*G(6`nV59q1dZvx%#n+GFj7O|EX56Dl3 zP%e24Y~e%wEST-s*!<4?UYt7%XWU!}c|@{#%B3LiIbF;=0iwJ9?KA4VFta(Sx&<(5 zGX>P?!3nQ9kTa<>+;=1{NCJMr-vPW(1Z%yaxuU+#5O*IW&IF!_BM8vmJ#e$Xxk6He6#Dy!%q*E}BXuy$$DRxPF8SWqd;Nw2xK9*~r!JUyZ^ z*>1^&-jtR*#({3u)sj!Fl|M>DHGj4on{oS=sOf3YalM$((Y~J%QYCpjr6QwFn#^6i zoS0szn3pqm(WIm1V{er&p`jV8Jm2wqmQ4t{BPEE;)AbM|f{?ow23hIoDkbk8PPCz; zr0i5~CSzy+K(4UdOj0VGZA`Xiq=t3zf~^5g+X~?Vf_}Q*NR=IVcu;I?5fQT8c-f?( zrQJv^rClx@*CZ)AfmEHuY_=eNULjYVZDQCX4!l5h6zS>VS1MGko5ZbD#5nmA^`JcU z01kc@qTkR}n%~)EYLpPkNnw^dvyx`J#MKbV!YLAI9U?7i`>MxD1Jdf?SR(yGP_va# z`eUNv5o@copW#4-cFGo)y;b$fz%1z^z3GXv$&1e^rk70Sp z7V!0nrS&J^qottf=V?)lq6hWd`?a&WU#$P~U){*jG@%#wMT2U(b4)W?8ucU1dQ418 z^?I7Zv8tVs1AJ@!NauX*{p43+r-vDae;N^)RQTlP=IXmpikT5bZFLQE7en7_DOlSi5|T_-0Dc-fWkre1b^! zr02VaLdIuYKC_4!wdcdCrma{oO~sNBU)LinDkz0^EK;-jc%9yQp2b{CuWG%ZyQ@Ip zV=ET#{pGYyjb6P?dCpcNkf(L&lPUkYmZmyWRmmZD5u0C|Knpx+Vi#4G~$;K1OmP_ z$J#HxbHLh!8IYcBM!LXT)#+11Y?$Rf3gN;N0_w8gf-YGWkX6?CqyP)$1q%todTu_kLVvcwv4pr1boFdfYm?i`{6a7$zS2e0#-XOG#mnrYv};0B zs3zK|O`LZvJte2a4y*V2LQUAFeKwE`7lLhj*S1#0sUn-kM3yMx&6qDaS)*3HqR=4F-t2U7r z2bI3P@7Db?pF5&d;I}SVkAO)^;|lGV9(kkkD%yl&bc^s(5gazuWVR($v=g<9edUzy zRIT{Rc%C46yX_!H8HIZMR~k-Ne)L2coG5fCq1OvB}>^U=sxq3k{J1MGbWY zRZWFrWAb5lC%)+*RMlXFYL_sM^28t{8l%!R7;1id%d zh5p2xEl3pzl*=O5=T>u@Y?iXPek!SQG7`D~^q8_4=lNX*Owy#EyxX@(bv&8U{pUA_ zkE?I0bZ*IvZ)-UyijBR5g-L>>iZYa@Pe7K*=@C?gN(QUiYj<|!?egTL)fF~(@I#2H z{6)$?#$Bvpl~LJIJDA5sAZ|Oal$Nf%dW{O5p99>Vl|CQIEwU-Ta9yn$9jVD641F|5 zk~C{cHt=-x6e1F){@nGDtKZhwXEc7uuX`jyxxsjk(I~yz5)~ zUR^DfmFF#^n^|o#an#h*S}t*EmYM{!HiD_Cl~1U3O*E`l!olx&7kR^mNV*(DS#^&s zEiEhZ)ey`hRec+fvbz6u)5fGt1vZh8deWq4Rvnjbu$Ix*O1{w_^vf~nVF#x^*6 znBqon_IBp5$_sF}pYn0)S#>gjv=*(@I=mm+uXvCp7mqa+y8R(8oZ^0B6`)Q$vA~?QH!x zZ(MS6LaOapkKx}(!H)V|V>{8QpVQ=D*0$R6Y#&+*iYT9_3*%HOsbOB%XB3U%AMZc5 zO2f;OSE(0{I_Jx5LsiaLnEyTa?%>=%r*V{V-)(EM#E3gEx{ClQsxklj61JKOY#=s-M->fliEDH<(vHizeqR(mGbh*y| z^bcA^5pYeZQ?MT8gfYf0*&gh~qMvS`M)49K@%Mwgav>kdUPCmeV{)aRbRQbOpI~2# zdDu4=kQ$NBz1hFK7EfxRfGjN9ailxkrphOO|5IX}^E5Dk+<1zwSl=?16N`9;Zl#Fh zmk_Wnzsn&a$s{m{Sl7LP8C*0w?od0a1q)Ip2m${-tkV z9GXCf8XTH{V%|80VC1mz*uMzTc)E8}!u**3EM$jW&dY+3jI?(K!h3jzIn00!dNb