From b6d23f3f5857117c13012e6322bd0f581cbb734d Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 12 Feb 2025 12:01:23 -0300 Subject: [PATCH 01/23] chore: service provider integration tests --- packages/horizon/package.json | 1 + packages/horizon/tasks/e2e.ts | 33 ++ packages/horizon/tasks/migrate.ts | 6 + .../service-provider.test.ts | 204 ++++++++++++ .../test/integration/shared/staking.ts | 315 ++++++++++++++++++ .../horizon/test/integration/utils/types.ts | 10 + .../horizon/test/{ => unit}/GraphBase.t.sol | 8 +- .../{ => unit}/data-service/DataService.t.sol | 6 +- .../{ => unit}/data-service/DataService.tree | 0 .../data-service/DataServiceUpgradeable.t.sol | 2 +- .../extensions/DataServiceFees.t.sol | 6 +- .../extensions/DataServiceFees.tree | 0 .../extensions/DataServicePausable.t.sol | 2 +- .../extensions/DataServicePausable.tree | 0 .../DataServicePausableUpgradeable.t.sol | 2 +- .../implementations/DataServiceBase.sol | 4 +- .../DataServiceBaseUpgradeable.sol | 4 +- .../implementations/DataServiceImpFees.sol | 6 +- .../DataServiceImpPausable.sol | 6 +- .../DataServiceImpPausableUpgradeable.sol | 6 +- .../implementations/DataServiceOverride.sol | 0 .../libraries/ProvisionTracker.t.sol | 4 +- .../libraries/ProvisionTracker.tree | 0 .../ProvisionTrackerImplementation.sol | 2 +- .../test/{ => unit}/escrow/GraphEscrow.t.sol | 8 +- .../test/{ => unit}/escrow/collect.t.sol | 4 +- .../test/{ => unit}/escrow/deposit.t.sol | 0 .../test/{ => unit}/escrow/getters.t.sol | 2 +- .../test/{ => unit}/escrow/paused.t.sol | 4 +- .../horizon/test/{ => unit}/escrow/thaw.t.sol | 0 .../test/{ => unit}/escrow/withdraw.t.sol | 2 +- .../{ => unit}/libraries/LinkedList.t.sol | 2 +- .../test/{ => unit}/libraries/LinkedList.tree | 0 .../libraries/ListImplementation.sol | 2 +- .../test/{ => unit}/libraries/PPMMath.t.sol | 2 +- .../{ => unit}/payments/GraphPayments.t.sol | 10 +- .../GraphTallyCollector.t.sol | 14 +- .../collect/collect.t.sol | 4 +- .../signer/authorizeSigner.t.sol | 2 +- .../signer/cancelThawSigner.t.sol | 2 +- .../signer/revokeSigner.t.sol | 2 +- .../signer/thawSigner.t.sol | 2 +- .../HorizonStakingShared.t.sol | 20 +- .../PaymentsEscrowShared.t.sol | 2 +- .../{ => unit}/staking/HorizonStaking.t.sol | 0 .../staking/allocation/allocation.t.sol | 2 +- .../{ => unit}/staking/allocation/close.t.sol | 4 +- .../staking/allocation/collect.t.sol | 4 +- .../staking/delegation/addToPool.t.sol | 2 +- .../staking/delegation/delegate.t.sol | 2 +- .../staking/delegation/legacyWithdraw.t.sol | 8 +- .../staking/delegation/redelegate.t.sol | 2 +- .../staking/delegation/undelegate.t.sol | 2 +- .../staking/delegation/withdraw.t.sol | 6 +- .../staking/governance/governance.t.sol | 0 .../{ => unit}/staking/operator/locked.t.sol | 0 .../staking/operator/operator.t.sol | 0 .../staking/provision/deprovision.t.sol | 0 .../{ => unit}/staking/provision/locked.t.sol | 0 .../staking/provision/parameters.t.sol | 2 +- .../staking/provision/provision.t.sol | 0 .../staking/provision/reprovision.t.sol | 0 .../{ => unit}/staking/provision/thaw.t.sol | 2 +- .../serviceProvider/serviceProvider.t.sol | 4 +- .../staking/slash/legacySlash.t.sol | 2 +- .../test/{ => unit}/staking/slash/slash.t.sol | 2 +- .../test/{ => unit}/staking/stake/stake.t.sol | 0 .../{ => unit}/staking/stake/unstake.t.sol | 0 .../{ => unit}/staking/stake/withdraw.t.sol | 2 +- .../{ => unit}/utilities/Authorizable.t.sol | 4 +- .../{ => unit}/utilities/GraphDirectory.t.sol | 2 +- .../{ => unit}/utilities/GraphDirectory.tree | 0 .../GraphDirectoryImplementation.sol | 10 +- .../test/{ => unit}/utils/Bounder.t.sol | 0 .../test/{ => unit}/utils/Constants.sol | 0 .../horizon/test/{ => unit}/utils/Users.sol | 0 .../horizon/test/{ => unit}/utils/Utils.sol | 0 yarn.lock | 66 ++++ 78 files changed, 737 insertions(+), 102 deletions(-) create mode 100644 packages/horizon/tasks/e2e.ts create mode 100644 packages/horizon/tasks/migrate.ts create mode 100644 packages/horizon/test/integration/after-transition-period/service-provider.test.ts create mode 100644 packages/horizon/test/integration/shared/staking.ts create mode 100644 packages/horizon/test/integration/utils/types.ts rename packages/horizon/test/{ => unit}/GraphBase.t.sol (97%) rename packages/horizon/test/{ => unit}/data-service/DataService.t.sol (98%) rename packages/horizon/test/{ => unit}/data-service/DataService.tree (100%) rename packages/horizon/test/{ => unit}/data-service/DataServiceUpgradeable.t.sol (96%) rename packages/horizon/test/{ => unit}/data-service/extensions/DataServiceFees.t.sol (97%) rename packages/horizon/test/{ => unit}/data-service/extensions/DataServiceFees.tree (100%) rename packages/horizon/test/{ => unit}/data-service/extensions/DataServicePausable.t.sol (97%) rename packages/horizon/test/{ => unit}/data-service/extensions/DataServicePausable.tree (100%) rename packages/horizon/test/{ => unit}/data-service/extensions/DataServicePausableUpgradeable.t.sol (96%) rename packages/horizon/test/{ => unit}/data-service/implementations/DataServiceBase.sol (92%) rename packages/horizon/test/{ => unit}/data-service/implementations/DataServiceBaseUpgradeable.sol (85%) rename packages/horizon/test/{ => unit}/data-service/implementations/DataServiceImpFees.sol (83%) rename packages/horizon/test/{ => unit}/data-service/implementations/DataServiceImpPausable.sol (85%) rename packages/horizon/test/{ => unit}/data-service/implementations/DataServiceImpPausableUpgradeable.sol (78%) rename packages/horizon/test/{ => unit}/data-service/implementations/DataServiceOverride.sol (100%) rename packages/horizon/test/{ => unit}/data-service/libraries/ProvisionTracker.t.sol (95%) rename packages/horizon/test/{ => unit}/data-service/libraries/ProvisionTracker.tree (100%) rename packages/horizon/test/{ => unit}/data-service/libraries/ProvisionTrackerImplementation.sol (61%) rename packages/horizon/test/{ => unit}/escrow/GraphEscrow.t.sol (95%) rename packages/horizon/test/{ => unit}/escrow/collect.t.sol (95%) rename packages/horizon/test/{ => unit}/escrow/deposit.t.sol (100%) rename packages/horizon/test/{ => unit}/escrow/getters.t.sol (96%) rename packages/horizon/test/{ => unit}/escrow/paused.t.sol (93%) rename packages/horizon/test/{ => unit}/escrow/thaw.t.sol (100%) rename packages/horizon/test/{ => unit}/escrow/withdraw.t.sol (96%) rename packages/horizon/test/{ => unit}/libraries/LinkedList.t.sol (98%) rename packages/horizon/test/{ => unit}/libraries/LinkedList.tree (100%) rename packages/horizon/test/{ => unit}/libraries/ListImplementation.sol (95%) rename packages/horizon/test/{ => unit}/libraries/PPMMath.t.sol (96%) rename packages/horizon/test/{ => unit}/payments/GraphPayments.t.sol (96%) rename packages/horizon/test/{ => unit}/payments/graph-tally-collector/GraphTallyCollector.t.sol (90%) rename packages/horizon/test/{ => unit}/payments/graph-tally-collector/collect/collect.t.sol (98%) rename packages/horizon/test/{ => unit}/payments/graph-tally-collector/signer/authorizeSigner.t.sol (97%) rename packages/horizon/test/{ => unit}/payments/graph-tally-collector/signer/cancelThawSigner.t.sol (92%) rename packages/horizon/test/{ => unit}/payments/graph-tally-collector/signer/revokeSigner.t.sol (95%) rename packages/horizon/test/{ => unit}/payments/graph-tally-collector/signer/thawSigner.t.sol (95%) rename packages/horizon/test/{ => unit}/shared/horizon-staking/HorizonStakingShared.t.sol (99%) rename packages/horizon/test/{ => unit}/shared/payments-escrow/PaymentsEscrowShared.t.sol (94%) rename packages/horizon/test/{ => unit}/staking/HorizonStaking.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/allocation/allocation.t.sol (91%) rename packages/horizon/test/{ => unit}/staking/allocation/close.t.sol (95%) rename packages/horizon/test/{ => unit}/staking/allocation/collect.t.sol (94%) rename packages/horizon/test/{ => unit}/staking/delegation/addToPool.t.sol (98%) rename packages/horizon/test/{ => unit}/staking/delegation/delegate.t.sol (98%) rename packages/horizon/test/{ => unit}/staking/delegation/legacyWithdraw.t.sol (89%) rename packages/horizon/test/{ => unit}/staking/delegation/redelegate.t.sol (97%) rename packages/horizon/test/{ => unit}/staking/delegation/undelegate.t.sol (98%) rename packages/horizon/test/{ => unit}/staking/delegation/withdraw.t.sol (95%) rename packages/horizon/test/{ => unit}/staking/governance/governance.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/operator/locked.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/operator/operator.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/provision/deprovision.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/provision/locked.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/provision/parameters.t.sol (98%) rename packages/horizon/test/{ => unit}/staking/provision/provision.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/provision/reprovision.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/provision/thaw.t.sol (98%) rename packages/horizon/test/{ => unit}/staking/serviceProvider/serviceProvider.t.sol (96%) rename packages/horizon/test/{ => unit}/staking/slash/legacySlash.t.sol (98%) rename packages/horizon/test/{ => unit}/staking/slash/slash.t.sol (98%) rename packages/horizon/test/{ => unit}/staking/stake/stake.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/stake/unstake.t.sol (100%) rename packages/horizon/test/{ => unit}/staking/stake/withdraw.t.sol (95%) rename packages/horizon/test/{ => unit}/utilities/Authorizable.t.sol (99%) rename packages/horizon/test/{ => unit}/utilities/GraphDirectory.t.sol (97%) rename packages/horizon/test/{ => unit}/utilities/GraphDirectory.tree (100%) rename packages/horizon/test/{ => unit}/utilities/GraphDirectoryImplementation.sol (82%) rename packages/horizon/test/{ => unit}/utils/Bounder.t.sol (100%) rename packages/horizon/test/{ => unit}/utils/Constants.sol (100%) rename packages/horizon/test/{ => unit}/utils/Users.sol (100%) rename packages/horizon/test/{ => unit}/utils/Utils.sol (100%) diff --git a/packages/horizon/package.json b/packages/horizon/package.json index dcdc9122e..1166fa251 100644 --- a/packages/horizon/package.json +++ b/packages/horizon/package.json @@ -45,6 +45,7 @@ "eslint": "^8.56.0", "eslint-graph-config": "workspace:^0.0.1", "ethers": "^6.13.4", + "glob": "^11.0.1", "hardhat": "^2.22.18", "hardhat-contract-sizer": "^2.10.0", "hardhat-gas-reporter": "^1.0.8", diff --git a/packages/horizon/tasks/e2e.ts b/packages/horizon/tasks/e2e.ts new file mode 100644 index 000000000..b106679a9 --- /dev/null +++ b/packages/horizon/tasks/e2e.ts @@ -0,0 +1,33 @@ +import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' +import { task } from 'hardhat/config' +import { glob } from 'glob' + +task('test:integration', 'Runs all integration tests') + .addOptionalParam('deployType', 'Chose between deploy or migrate. If not specified, skips deployment.') + .setAction(async (taskArgs, hre) => { + // Require hardhat or localhost network + if (hre.network.name !== 'hardhat' && hre.network.name !== 'localhost') { + throw new Error('Integration tests can only be run on the hardhat or localhost network') + } + + // Handle deployment if mode is specified + if (taskArgs.deployType) { + switch (taskArgs.deployType.toLowerCase()) { + case 'deploy': + await hre.run('deploy', { deploymentId: 'integration-tests' }) + break + case 'migrate': + await hre.run('migrate') + break + default: + throw new Error('Invalid mode. Must be either deploy or migrate') + } + } + + const testFiles = await glob('test/integration/**/*.{js,ts}') + + // Use local addresses + hre.config.graph.deployments.horizon = './addresses-local.json' + + await hre.run(TASK_TEST, { testFiles: testFiles }) + }) diff --git a/packages/horizon/tasks/migrate.ts b/packages/horizon/tasks/migrate.ts new file mode 100644 index 000000000..907199ff5 --- /dev/null +++ b/packages/horizon/tasks/migrate.ts @@ -0,0 +1,6 @@ +import { task } from 'hardhat/config' + +task('migrate', 'Migrate contracts using Ignition') + .setAction(async (_) => { + // TODO: Implement migration task + }) diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts new file mode 100644 index 000000000..edf26104a --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -0,0 +1,204 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { addToProvision, deprovision, provision, reprovision, stake, stakeToProvision, thaw, unstake } from '../shared/staking' +import { PaymentTypes } from '../utils/types' + +describe('HorizonStaking Integration Tests', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let verifier: string + let serviceProvider: SignerWithAddress + let thawingPeriod: bigint + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon.contracts.HorizonStaking as HorizonStaking + graphToken = graph.horizon.contracts.GraphToken as IGraphToken + + verifier = await ethers.Wallet.createRandom().getAddress(); + + [serviceProvider] = await ethers.getSigners() + + thawingPeriod = await horizonStaking.getMaxThawingPeriod() + }) + + describe('Service provider', () => { + const stakeAmount = ethers.parseEther('1000') + + it('should allow staking tokens and unstake right after', async () => { + await stake(horizonStaking, graphToken, serviceProvider, stakeAmount) + await unstake(horizonStaking, graphToken, serviceProvider, stakeAmount) + }) + + it('should revert if unstaking more than the idle stake', async () => { + const idleStake = await horizonStaking.getIdleStake(serviceProvider.address) + await expect(horizonStaking.connect(serviceProvider).unstake(idleStake + 1n)) + .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientIdleStake') + .withArgs(idleStake + 1n, idleStake) + }) + + it('should be able to set delegation fee cut for payment type', async () => { + const delegationFeeCut = 10_000 // 10% + const paymentType = PaymentTypes.QueryFee + + const tx = await horizonStaking.connect(serviceProvider).setDelegationFeeCut( + serviceProvider.address, + verifier, + paymentType, + delegationFeeCut, + ) + await tx.wait() + + // Verify delegation fee cut was set + const delegationFeeCutAfterSet = await horizonStaking.getDelegationFeeCut( + serviceProvider.address, + verifier, + paymentType, + ) + expect(delegationFeeCutAfterSet).to.equal(delegationFeeCut, 'Delegation fee cut was not set') + }) + + describe('Provision', () => { + let maxVerifierCut: number + + before(async () => { + const tokensToStake = ethers.parseEther('100000') + maxVerifierCut = 50_000 // 50% + const createProvisionTokens = ethers.parseEther('10000') + + // Add idle stake + await stake(horizonStaking, graphToken, serviceProvider, tokensToStake) + + // Create provision + await provision(horizonStaking, serviceProvider, verifier, createProvisionTokens, maxVerifierCut, thawingPeriod) + }) + + it('should be able to stake to provision directly', async () => { + let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + const provisionTokensBefore = provision.tokens + + // Add stake and provision on the same transaction + const stakeToProvisionTokens = ethers.parseEther('100') + await stakeToProvision(horizonStaking, graphToken, serviceProvider, verifier, stakeToProvisionTokens) + + // Verify provision tokens were updated + provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokensBefore + stakeToProvisionTokens, 'Provision tokens were not updated') + }) + + it('should be able to add idle stake to provision', async () => { + let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + const provisionTokensBefore = provision.tokens + + // Add to provision using idle stake + const addToProvisionTokens = ethers.parseEther('100') + await addToProvision(horizonStaking, serviceProvider, verifier, addToProvisionTokens) + + // Verify provision tokens were updated + provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokensBefore + addToProvisionTokens, 'Provision tokens were not updated') + }) + + it('should revert if creating a provision with tokens greater than the idle stake', async () => { + const newVerifier = await ethers.Wallet.createRandom().getAddress() + const idleStake = await horizonStaking.getIdleStake(serviceProvider.address) + await expect(horizonStaking.connect(serviceProvider).provision( + serviceProvider.address, newVerifier, idleStake + 1n, maxVerifierCut, thawingPeriod)) + .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientIdleStake') + .withArgs(idleStake + 1n, idleStake) + }) + + it('should revert if adding to provision with tokens greater than the idle stake', async () => { + const idleStake = await horizonStaking.getIdleStake(serviceProvider.address) + await expect(horizonStaking.connect(serviceProvider).addToProvision( + serviceProvider.address, verifier, idleStake + 1n)) + .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientIdleStake') + .withArgs(idleStake + 1n, idleStake) + }) + + describe('Thawing', () => { + describe('Deprovisioning', () => { + it('should be able to thaw tokens, wait for thawing period, deprovision and unstake', async () => { + const tokensToThaw = ethers.parseEther('100') + await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Deprovision the single thaw request + await deprovision(horizonStaking, serviceProvider, verifier, 1n) + + // Unstake + await unstake(horizonStaking, graphToken, serviceProvider, tokensToThaw) + }) + + it('should be able to create multiple thaw requests and deprovision all at once', async () => { + const tokensToThaw = ethers.parseEther('100') + // Create 10 thaw requests for 100 GRT each + for (let i = 0; i < 10; i++) { + await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Deprovision all thaw requests + await deprovision(horizonStaking, serviceProvider, verifier, 0n) + }) + + it('should be able to create multiple thaw requests and deprovision one by one', async () => { + const tokensToThaw = ethers.parseEther('100') + // Create 3 thaw requests for 100 GRT each + for (let i = 0; i < 3; i++) { + await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Deprovision one by one + for (let i = 0; i < 3; i++) { + await deprovision(horizonStaking, serviceProvider, verifier, 1n) + } + }) + }) + + describe('Reprovisioning', () => { + let newVerifier: string + + before(async () => { + newVerifier = await ethers.Wallet.createRandom().getAddress() + await provision(horizonStaking, serviceProvider, newVerifier, ethers.parseEther('100'), maxVerifierCut, thawingPeriod) + }) + + it('should be able to thaw tokens, wait for thawing period and reprovision', async () => { + const tokensToThaw = ethers.parseEther('100') + await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Reprovision + await reprovision(horizonStaking, serviceProvider, verifier, newVerifier, 1n) + }) + + it('should revert if thawing period is not over', async () => { + const tokensToThaw = ethers.parseEther('100') + await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + + await expect(reprovision(horizonStaking, serviceProvider, verifier, newVerifier, 1n)) + .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidZeroTokens') + }) + }) + }) + }) + }) +}) diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts new file mode 100644 index 000000000..11c43c0f2 --- /dev/null +++ b/packages/horizon/test/integration/shared/staking.ts @@ -0,0 +1,315 @@ +import { expect } from 'chai' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { ThawRequestType } from '../utils/types' + +/* ////////////////////////////////////////////////////////////// + STAKE MANAGEMENT +////////////////////////////////////////////////////////////// */ + +export async function stake( + horizonStaking: HorizonStaking, + graphToken: IGraphToken, + serviceProvider: SignerWithAddress, + tokens: bigint, +): Promise { + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) + const stakingContractBalanceBefore = await graphToken.balanceOf(horizonStaking.target) + + const approveTx = await graphToken.connect(serviceProvider).approve(horizonStaking.target, tokens) + await approveTx.wait() + + const stakeTx = await horizonStaking.connect(serviceProvider).stake(tokens) + await stakeTx.wait() + + // Verify tokens were transferred from service provider to horizon staking + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore - tokens, 'Tokens were not transferred from service provider') + + // Verify tokens were transferred to horizon staking + const stakingContractBalanceAfter = await graphToken.balanceOf(horizonStaking.target) + expect(stakingContractBalanceAfter).to.equal(stakingContractBalanceBefore + tokens, 'Tokens were not transferred to horizon staking') + + // Verify service provider stake was updated + const serviceProviderStake = await horizonStaking.getStake(serviceProvider.address) + expect(serviceProviderStake).to.equal(tokens, 'Service provider stake was not updated') +} + +export async function unstake( + horizonStaking: HorizonStaking, + graphToken: IGraphToken, + serviceProvider: SignerWithAddress, + tokens: bigint, +): Promise { + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) + const stakingContractBalanceBefore = await graphToken.balanceOf(horizonStaking.target) + const serviceProviderStakeBefore = await horizonStaking.getStake(serviceProvider.address) + + const unstakeTx = await horizonStaking.connect(serviceProvider).unstake(tokens) + await unstakeTx.wait() + + // Verify tokens were transferred to service provider + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore + tokens, 'Tokens were not transferred to service provider') + + // Verify tokens were transferred from horizon staking contract + const stakingContractBalanceAfter = await graphToken.balanceOf(horizonStaking.target) + expect(stakingContractBalanceAfter).to.equal(stakingContractBalanceBefore - tokens, 'Tokens were not transferred from horizon staking contract') + + // Verify service provider stake was updated + const serviceProviderStakeAfterUnstake = await horizonStaking.getStake(serviceProvider.address) + expect(serviceProviderStakeAfterUnstake).to.equal(serviceProviderStakeBefore - tokens, 'Service provider stake was not updated') +} + +export async function stakeToProvision( + horizonStaking: HorizonStaking, + graphToken: IGraphToken, + serviceProvider: SignerWithAddress, + verifier: string, + tokens: bigint, +): Promise { + // Verify provision exists + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.not.equal(0, 'Provision should exist') + + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) + const stakingContractBalanceBefore = await graphToken.balanceOf(horizonStaking.target) + + const approveTx = await graphToken.connect(serviceProvider).approve(horizonStaking.target, tokens) + await approveTx.wait() + + const stakeToProvisionTx = await horizonStaking.connect(serviceProvider).stakeToProvision( + serviceProvider.address, + verifier, + tokens, + ) + await stakeToProvisionTx.wait() + + // Verify tokens were transferred from service provider + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore - tokens, 'Tokens were not transferred from service provider') + + // Verify tokens were transferred to horizon staking + const stakingContractBalanceAfter = await graphToken.balanceOf(horizonStaking.target) + expect(stakingContractBalanceAfter).to.equal(stakingContractBalanceBefore + tokens, 'Tokens were not transferred to horizon staking') +} + +/* //////////////////////////////////////////////////////////// + PROVISION MANAGEMENT +////////////////////////////////////////////////////////////// */ + +export async function provision( + horizonStaking: HorizonStaking, + serviceProvider: SignerWithAddress, + verifier: string, + tokens: bigint, + maxVerifierCut: number, + thawingPeriod: bigint, +): Promise { + const idleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + const createProvisionTx = await horizonStaking.connect(serviceProvider).provision( + serviceProvider.address, + verifier, + tokens, + maxVerifierCut, + thawingPeriod, + ) + await createProvisionTx.wait() + + // Verify provision was created + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(tokens, 'Provision tokens were not set') + expect(provision.maxVerifierCut).to.equal(maxVerifierCut, 'Provision max verifier cut was not set') + expect(provision.thawingPeriod).to.equal(thawingPeriod, 'Provision thawing period was not set') + + // Verify idle stake was updated + const idleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(idleStakeAfter).to.equal(idleStakeBefore - tokens, 'Idle stake was not updated') +} + +export async function thaw( + horizonStaking: HorizonStaking, + serviceProvider: SignerWithAddress, + verifier: string, + tokens: bigint, +): Promise { + let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + const provisionTokensBefore = provision.tokens + const provisionTokensThawingBefore = provision.tokensThawing + const expectedThawRequestShares = provision.tokensThawing == 0n + ? tokens + : ((provision.sharesThawing * tokens + provision.tokensThawing - 1n) / provision.tokensThawing) + + // Thaw tokens from provision + const thawTx = await horizonStaking.connect(serviceProvider).thaw( + serviceProvider.address, + verifier, + tokens, + ) + await thawTx.wait() + + // Verify provision tokens were updated + provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokensBefore, 'Provision tokens should not change') + expect(provision.tokensThawing).to.equal(provisionTokensThawingBefore + tokens, 'Provision tokens were not updated') + + // Verify thaw request was created + const thawRequestList = await horizonStaking.getThawRequestList( + ThawRequestType.Provision, + serviceProvider.address, + verifier, + serviceProvider.address, + ) + // Check the last thaw request we created + const thawRequestId = thawRequestList.tail + const thawRequest = await horizonStaking.getThawRequest( + ThawRequestType.Provision, + thawRequestId, + ) + expect(thawRequest.shares).to.equal(expectedThawRequestShares, 'Thaw request shares were not set') +} + +export async function addToProvision( + horizonStaking: HorizonStaking, + serviceProvider: SignerWithAddress, + verifier: string, + tokens: bigint, +): Promise { + const idleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + const provisionTokensBefore = provision.tokens + + const addToProvisionTx = await horizonStaking.connect(serviceProvider).addToProvision( + serviceProvider.address, + verifier, + tokens, + ) + await addToProvisionTx.wait() + + // Verify tokens were added to provision + provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokensBefore + tokens, 'Tokens were not added to provision') + + // Verify idle stake was updated + const idleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(idleStakeAfter).to.equal(idleStakeBefore - tokens, 'Idle stake was not updated') +} + +export async function deprovision( + horizonStaking: HorizonStaking, + serviceProvider: SignerWithAddress, + verifier: string, + nThawRequests: bigint, +): Promise { + let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + const provisionTokensBefore = provision.tokens + const provisionTokensThawingBefore = provision.tokensThawing + + // Find the amount of tokens we are deprovisioning from thaw request shares + const tokensToDeprovision = await calculateTokensFromThawRequests( + horizonStaking, + serviceProvider, + verifier, + provision, + nThawRequests, + ) + + const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + const deprovisionTx = await horizonStaking.connect(serviceProvider).deprovision( + serviceProvider.address, + verifier, + nThawRequests, + ) + await deprovisionTx.wait() + + // Verify tokens were added to idle stake + const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(serviceProviderIdleStakeAfter).to.equal(serviceProviderIdleStakeBefore + tokensToDeprovision, 'Tokens were not added to idle stake') + + // Verify tokens were removed from provision + provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokensBefore - tokensToDeprovision, 'Provision should be deprovisioned') + expect(provision.tokensThawing).to.equal(provisionTokensThawingBefore - tokensToDeprovision, 'Provision tokens thawing should be updated') +} + +export async function reprovision( + horizonStaking: HorizonStaking, + serviceProvider: SignerWithAddress, + oldVerifier: string, + newVerifier: string, + nThawRequests: bigint, +): Promise { + let oldVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, oldVerifier) + const oldVerifierProvisionTokens = oldVerifierProvision.tokens + const oldVerifierProvisionTokensThawing = oldVerifierProvision.tokensThawing + let newVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, newVerifier) + const newVerifierProvisionTokens = newVerifierProvision.tokens + + // Find the amount of tokens we are reprovisioning from thaw request shares + const tokensToReprovision = await calculateTokensFromThawRequests( + horizonStaking, + serviceProvider, + oldVerifier, + oldVerifierProvision, + nThawRequests, + ) + + const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + const reprovisionTx = await horizonStaking.connect(serviceProvider).reprovision( + serviceProvider.address, + oldVerifier, + newVerifier, + nThawRequests, + ) + await reprovisionTx.wait() + + // Verify tokens were removed from oldVerifier provision + oldVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, oldVerifier) + expect(oldVerifierProvision.tokens).to.equal(oldVerifierProvisionTokens - tokensToReprovision, 'Old provision tokens were not updated') + expect(oldVerifierProvision.tokensThawing).to.equal(oldVerifierProvisionTokensThawing - tokensToReprovision, 'Old provision tokens thawing were not updated') + + // Verify tokens were added to newVerifier provision + newVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, newVerifier) + expect(newVerifierProvision.tokens).to.equal(newVerifierProvisionTokens + tokensToReprovision, 'New provision tokens were not updated') + + // Verify tokens idle did not change + const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(serviceProviderIdleStakeAfter).to.equal(serviceProviderIdleStakeBefore, 'Tokens idle should not change') +} + +/* //////////////////////////////////////////////////////////// + HELPER FUNCTIONS +////////////////////////////////////////////////////////////// */ + +async function calculateTokensFromThawRequests( + horizonStaking: HorizonStaking, + serviceProvider: SignerWithAddress, + verifier: string, + provision: { tokensThawing: bigint, sharesThawing: bigint }, + nThawRequests: bigint, +): Promise { + const thawRequestList = await horizonStaking.getThawRequestList( + ThawRequestType.Provision, + serviceProvider.address, + verifier, + serviceProvider.address, + ) + + // If nThawRequests is 0, process all thaw requests + if (nThawRequests == 0n) { + nThawRequests = thawRequestList.count + } + + // Calculate total tokens from thaw request shares + let totalTokens = 0n + let thawRequestId = thawRequestList.head + for (let i = 0; i < nThawRequests; i++) { + const thawRequest = await horizonStaking.getThawRequest( + ThawRequestType.Provision, + thawRequestId, + ) + totalTokens += (thawRequest.shares * provision.tokensThawing) / provision.sharesThawing + thawRequestId = thawRequest.next + } + return totalTokens +} diff --git a/packages/horizon/test/integration/utils/types.ts b/packages/horizon/test/integration/utils/types.ts new file mode 100644 index 000000000..4dfa68d00 --- /dev/null +++ b/packages/horizon/test/integration/utils/types.ts @@ -0,0 +1,10 @@ +export enum PaymentTypes { + QueryFee = 0, + IndexingFee = 1, + IndexingRewards = 2, +} + +export enum ThawRequestType { + Provision = 0, + Delegation = 1, +} diff --git a/packages/horizon/test/GraphBase.t.sol b/packages/horizon/test/unit/GraphBase.t.sol similarity index 97% rename from packages/horizon/test/GraphBase.t.sol rename to packages/horizon/test/unit/GraphBase.t.sol index fcbbf7b48..0a72c8c0e 100644 --- a/packages/horizon/test/GraphBase.t.sol +++ b/packages/horizon/test/unit/GraphBase.t.sol @@ -16,10 +16,10 @@ import { IHorizonStaking } from "contracts/interfaces/IHorizonStaking.sol"; import { HorizonStaking } from "contracts/staking/HorizonStaking.sol"; import { HorizonStakingExtension } from "contracts/staking/HorizonStakingExtension.sol"; import { IHorizonStakingTypes } from "contracts/interfaces/internal/IHorizonStakingTypes.sol"; -import { MockGRTToken } from "../contracts/mocks/MockGRTToken.sol"; -import { EpochManagerMock } from "../contracts/mocks/EpochManagerMock.sol"; -import { RewardsManagerMock } from "../contracts/mocks/RewardsManagerMock.sol"; -import { CurationMock } from "../contracts/mocks/CurationMock.sol"; +import { MockGRTToken } from "../../contracts/mocks/MockGRTToken.sol"; +import { EpochManagerMock } from "contracts/mocks/EpochManagerMock.sol"; +import { RewardsManagerMock } from "contracts/mocks/RewardsManagerMock.sol"; +import { CurationMock } from "contracts/mocks/CurationMock.sol"; import { Constants } from "./utils/Constants.sol"; import { Users } from "./utils/Users.sol"; import { Utils } from "./utils/Utils.sol"; diff --git a/packages/horizon/test/data-service/DataService.t.sol b/packages/horizon/test/unit/data-service/DataService.t.sol similarity index 98% rename from packages/horizon/test/data-service/DataService.t.sol rename to packages/horizon/test/unit/data-service/DataService.t.sol index 4a29a523f..2bd30a6a0 100644 --- a/packages/horizon/test/data-service/DataService.t.sol +++ b/packages/horizon/test/unit/data-service/DataService.t.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.27; -import { IHorizonStakingMain } from "../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; import { HorizonStakingSharedTest } from "../shared/horizon-staking/HorizonStakingShared.t.sol"; import { DataServiceBase } from "./implementations/DataServiceBase.sol"; import { DataServiceOverride } from "./implementations/DataServiceOverride.sol"; -import { ProvisionManager } from "./../../contracts/data-service/utilities/ProvisionManager.sol"; -import { PPMMath } from "./../../contracts/libraries/PPMMath.sol"; +import { ProvisionManager } from "./../../../contracts/data-service/utilities/ProvisionManager.sol"; +import { PPMMath } from "./../../../contracts/libraries/PPMMath.sol"; contract DataServiceTest is HorizonStakingSharedTest { DataServiceBase dataService; diff --git a/packages/horizon/test/data-service/DataService.tree b/packages/horizon/test/unit/data-service/DataService.tree similarity index 100% rename from packages/horizon/test/data-service/DataService.tree rename to packages/horizon/test/unit/data-service/DataService.tree diff --git a/packages/horizon/test/data-service/DataServiceUpgradeable.t.sol b/packages/horizon/test/unit/data-service/DataServiceUpgradeable.t.sol similarity index 96% rename from packages/horizon/test/data-service/DataServiceUpgradeable.t.sol rename to packages/horizon/test/unit/data-service/DataServiceUpgradeable.t.sol index be33173f8..1d0e533da 100644 --- a/packages/horizon/test/data-service/DataServiceUpgradeable.t.sol +++ b/packages/horizon/test/unit/data-service/DataServiceUpgradeable.t.sol @@ -5,7 +5,7 @@ import { GraphBaseTest } from "../GraphBase.t.sol"; import { DataServiceBaseUpgradeable } from "./implementations/DataServiceBaseUpgradeable.sol"; import { UnsafeUpgrades } from "openzeppelin-foundry-upgrades/Upgrades.sol"; -import { PPMMath } from "./../../contracts/libraries/PPMMath.sol"; +import { PPMMath } from "./../../../contracts/libraries/PPMMath.sol"; contract DataServiceUpgradeableTest is GraphBaseTest { function test_WhenTheContractIsDeployed() external { diff --git a/packages/horizon/test/data-service/extensions/DataServiceFees.t.sol b/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol similarity index 97% rename from packages/horizon/test/data-service/extensions/DataServiceFees.t.sol rename to packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol index 345a86db7..cd6e7bf46 100644 --- a/packages/horizon/test/data-service/extensions/DataServiceFees.t.sol +++ b/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol @@ -3,9 +3,9 @@ pragma solidity 0.8.27; import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; import { DataServiceImpFees } from "../implementations/DataServiceImpFees.sol"; -import { IDataServiceFees } from "../../../contracts/data-service/interfaces/IDataServiceFees.sol"; -import { ProvisionTracker } from "../../../contracts/data-service/libraries/ProvisionTracker.sol"; -import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; +import { IDataServiceFees } from "../../../../contracts/data-service/interfaces/IDataServiceFees.sol"; +import { ProvisionTracker } from "../../../../contracts/data-service/libraries/ProvisionTracker.sol"; +import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol"; contract DataServiceFeesTest is HorizonStakingSharedTest { function test_Lock_RevertWhen_ZeroTokensAreLocked() diff --git a/packages/horizon/test/data-service/extensions/DataServiceFees.tree b/packages/horizon/test/unit/data-service/extensions/DataServiceFees.tree similarity index 100% rename from packages/horizon/test/data-service/extensions/DataServiceFees.tree rename to packages/horizon/test/unit/data-service/extensions/DataServiceFees.tree diff --git a/packages/horizon/test/data-service/extensions/DataServicePausable.t.sol b/packages/horizon/test/unit/data-service/extensions/DataServicePausable.t.sol similarity index 97% rename from packages/horizon/test/data-service/extensions/DataServicePausable.t.sol rename to packages/horizon/test/unit/data-service/extensions/DataServicePausable.t.sol index 46cded2eb..f43191a94 100644 --- a/packages/horizon/test/data-service/extensions/DataServicePausable.t.sol +++ b/packages/horizon/test/unit/data-service/extensions/DataServicePausable.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; import { DataServiceImpPausable } from "../implementations/DataServiceImpPausable.sol"; -import { IDataServicePausable } from "./../../../contracts/data-service/interfaces/IDataServicePausable.sol"; +import { IDataServicePausable } from "./../../../../contracts/data-service/interfaces/IDataServicePausable.sol"; contract DataServicePausableTest is HorizonStakingSharedTest { DataServiceImpPausable dataService; diff --git a/packages/horizon/test/data-service/extensions/DataServicePausable.tree b/packages/horizon/test/unit/data-service/extensions/DataServicePausable.tree similarity index 100% rename from packages/horizon/test/data-service/extensions/DataServicePausable.tree rename to packages/horizon/test/unit/data-service/extensions/DataServicePausable.tree diff --git a/packages/horizon/test/data-service/extensions/DataServicePausableUpgradeable.t.sol b/packages/horizon/test/unit/data-service/extensions/DataServicePausableUpgradeable.t.sol similarity index 96% rename from packages/horizon/test/data-service/extensions/DataServicePausableUpgradeable.t.sol rename to packages/horizon/test/unit/data-service/extensions/DataServicePausableUpgradeable.t.sol index 6e58810c1..ca54042c8 100644 --- a/packages/horizon/test/data-service/extensions/DataServicePausableUpgradeable.t.sol +++ b/packages/horizon/test/unit/data-service/extensions/DataServicePausableUpgradeable.t.sol @@ -5,7 +5,7 @@ import { GraphBaseTest } from "../../GraphBase.t.sol"; import { DataServiceImpPausableUpgradeable } from "../implementations/DataServiceImpPausableUpgradeable.sol"; import { UnsafeUpgrades } from "openzeppelin-foundry-upgrades/Upgrades.sol"; -import { PPMMath } from "./../../../contracts/libraries/PPMMath.sol"; +import { PPMMath } from "./../../../../contracts/libraries/PPMMath.sol"; contract DataServicePausableUpgradeableTest is GraphBaseTest { function test_WhenTheContractIsDeployed() external { diff --git a/packages/horizon/test/data-service/implementations/DataServiceBase.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceBase.sol similarity index 92% rename from packages/horizon/test/data-service/implementations/DataServiceBase.sol rename to packages/horizon/test/unit/data-service/implementations/DataServiceBase.sol index e31b21a7b..30a40b4db 100644 --- a/packages/horizon/test/data-service/implementations/DataServiceBase.sol +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceBase.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; -import { DataService } from "../../../contracts/data-service/DataService.sol"; -import { IGraphPayments } from "./../../../contracts/interfaces/IGraphPayments.sol"; +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { IGraphPayments } from "./../../../../contracts/interfaces/IGraphPayments.sol"; contract DataServiceBase is DataService { uint32 public constant DELEGATION_RATIO = 100; diff --git a/packages/horizon/test/data-service/implementations/DataServiceBaseUpgradeable.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceBaseUpgradeable.sol similarity index 85% rename from packages/horizon/test/data-service/implementations/DataServiceBaseUpgradeable.sol rename to packages/horizon/test/unit/data-service/implementations/DataServiceBaseUpgradeable.sol index 907ad6e3a..d24e831af 100644 --- a/packages/horizon/test/data-service/implementations/DataServiceBaseUpgradeable.sol +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceBaseUpgradeable.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; -import { DataService } from "../../../contracts/data-service/DataService.sol"; -import { IGraphPayments } from "./../../../contracts/interfaces/IGraphPayments.sol"; +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { IGraphPayments } from "./../../../../contracts/interfaces/IGraphPayments.sol"; contract DataServiceBaseUpgradeable is DataService { constructor(address controller_) DataService(controller_) { diff --git a/packages/horizon/test/data-service/implementations/DataServiceImpFees.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceImpFees.sol similarity index 83% rename from packages/horizon/test/data-service/implementations/DataServiceImpFees.sol rename to packages/horizon/test/unit/data-service/implementations/DataServiceImpFees.sol index 163281d32..04d0ca336 100644 --- a/packages/horizon/test/data-service/implementations/DataServiceImpFees.sol +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceImpFees.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; -import { DataService } from "../../../contracts/data-service/DataService.sol"; -import { DataServiceFees } from "../../../contracts/data-service/extensions/DataServiceFees.sol"; -import { IGraphPayments } from "./../../../contracts/interfaces/IGraphPayments.sol"; +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { DataServiceFees } from "../../../../contracts/data-service/extensions/DataServiceFees.sol"; +import { IGraphPayments } from "./../../../../contracts/interfaces/IGraphPayments.sol"; contract DataServiceImpFees is DataServiceFees { uint256 public constant STAKE_TO_FEES_RATIO = 1000; diff --git a/packages/horizon/test/data-service/implementations/DataServiceImpPausable.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausable.sol similarity index 85% rename from packages/horizon/test/data-service/implementations/DataServiceImpPausable.sol rename to packages/horizon/test/unit/data-service/implementations/DataServiceImpPausable.sol index 678f46cc0..00e9c94a9 100644 --- a/packages/horizon/test/data-service/implementations/DataServiceImpPausable.sol +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausable.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; -import { DataService } from "../../../contracts/data-service/DataService.sol"; -import { DataServicePausable } from "../../../contracts/data-service/extensions/DataServicePausable.sol"; -import { IGraphPayments } from "./../../../contracts/interfaces/IGraphPayments.sol"; +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { DataServicePausable } from "../../../../contracts/data-service/extensions/DataServicePausable.sol"; +import { IGraphPayments } from "./../../../../contracts/interfaces/IGraphPayments.sol"; contract DataServiceImpPausable is DataServicePausable { uint32 public constant DELEGATION_RATIO = 100; diff --git a/packages/horizon/test/data-service/implementations/DataServiceImpPausableUpgradeable.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausableUpgradeable.sol similarity index 78% rename from packages/horizon/test/data-service/implementations/DataServiceImpPausableUpgradeable.sol rename to packages/horizon/test/unit/data-service/implementations/DataServiceImpPausableUpgradeable.sol index dd2ea21f1..e50864ace 100644 --- a/packages/horizon/test/data-service/implementations/DataServiceImpPausableUpgradeable.sol +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausableUpgradeable.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.27; -import { DataService } from "../../../contracts/data-service/DataService.sol"; -import { DataServicePausableUpgradeable } from "../../../contracts/data-service/extensions/DataServicePausableUpgradeable.sol"; -import { IGraphPayments } from "./../../../contracts/interfaces/IGraphPayments.sol"; +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { DataServicePausableUpgradeable } from "../../../../contracts/data-service/extensions/DataServicePausableUpgradeable.sol"; +import { IGraphPayments } from "./../../../../contracts/interfaces/IGraphPayments.sol"; contract DataServiceImpPausableUpgradeable is DataServicePausableUpgradeable { constructor(address controller_) DataService(controller_) { diff --git a/packages/horizon/test/data-service/implementations/DataServiceOverride.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceOverride.sol similarity index 100% rename from packages/horizon/test/data-service/implementations/DataServiceOverride.sol rename to packages/horizon/test/unit/data-service/implementations/DataServiceOverride.sol diff --git a/packages/horizon/test/data-service/libraries/ProvisionTracker.t.sol b/packages/horizon/test/unit/data-service/libraries/ProvisionTracker.t.sol similarity index 95% rename from packages/horizon/test/data-service/libraries/ProvisionTracker.t.sol rename to packages/horizon/test/unit/data-service/libraries/ProvisionTracker.t.sol index 7d8541cec..ab6a6f584 100644 --- a/packages/horizon/test/data-service/libraries/ProvisionTracker.t.sol +++ b/packages/horizon/test/unit/data-service/libraries/ProvisionTracker.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.27; import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; import { ProvisionTrackerImplementation } from "./ProvisionTrackerImplementation.sol"; -import { ProvisionTracker } from "../../../contracts/data-service/libraries/ProvisionTracker.sol"; -import { IHorizonStaking } from "./../../../contracts/interfaces/IHorizonStaking.sol"; +import { ProvisionTracker } from "../../../../contracts/data-service/libraries/ProvisionTracker.sol"; +import { IHorizonStaking } from "./../../../../contracts/interfaces/IHorizonStaking.sol"; // Wrapper required because when using vm.expectRevert, the error is expected in the next immediate call // Which in the case of this library is an internal call to the staking contract diff --git a/packages/horizon/test/data-service/libraries/ProvisionTracker.tree b/packages/horizon/test/unit/data-service/libraries/ProvisionTracker.tree similarity index 100% rename from packages/horizon/test/data-service/libraries/ProvisionTracker.tree rename to packages/horizon/test/unit/data-service/libraries/ProvisionTracker.tree diff --git a/packages/horizon/test/data-service/libraries/ProvisionTrackerImplementation.sol b/packages/horizon/test/unit/data-service/libraries/ProvisionTrackerImplementation.sol similarity index 61% rename from packages/horizon/test/data-service/libraries/ProvisionTrackerImplementation.sol rename to packages/horizon/test/unit/data-service/libraries/ProvisionTrackerImplementation.sol index d79d13da0..1f897fd02 100644 --- a/packages/horizon/test/data-service/libraries/ProvisionTrackerImplementation.sol +++ b/packages/horizon/test/unit/data-service/libraries/ProvisionTrackerImplementation.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.27; -import { ProvisionTracker } from "../../../contracts/data-service/libraries/ProvisionTracker.sol"; +import { ProvisionTracker } from "../../../../contracts/data-service/libraries/ProvisionTracker.sol"; contract ProvisionTrackerImplementation { mapping(address => uint256) public provisionTracker; diff --git a/packages/horizon/test/escrow/GraphEscrow.t.sol b/packages/horizon/test/unit/escrow/GraphEscrow.t.sol similarity index 95% rename from packages/horizon/test/escrow/GraphEscrow.t.sol rename to packages/horizon/test/unit/escrow/GraphEscrow.t.sol index 4c6933adf..39605390c 100644 --- a/packages/horizon/test/escrow/GraphEscrow.t.sol +++ b/packages/horizon/test/unit/escrow/GraphEscrow.t.sol @@ -2,13 +2,13 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IPaymentsEscrow } from "../../contracts/interfaces/IPaymentsEscrow.sol"; -import { IGraphPayments } from "../../contracts/interfaces/IGraphPayments.sol"; -import { IHorizonStakingTypes } from "../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; +import { IPaymentsEscrow } from "../../../contracts/interfaces/IPaymentsEscrow.sol"; +import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; +import { IHorizonStakingTypes } from "../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; import { HorizonStakingSharedTest } from "../shared/horizon-staking/HorizonStakingShared.t.sol"; import { PaymentsEscrowSharedTest } from "../shared/payments-escrow/PaymentsEscrowShared.t.sol"; -import { PPMMath } from "../../contracts/libraries/PPMMath.sol"; +import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; contract GraphEscrowTest is HorizonStakingSharedTest, PaymentsEscrowSharedTest { using PPMMath for uint256; diff --git a/packages/horizon/test/escrow/collect.t.sol b/packages/horizon/test/unit/escrow/collect.t.sol similarity index 95% rename from packages/horizon/test/escrow/collect.t.sol rename to packages/horizon/test/unit/escrow/collect.t.sol index f4357d213..08b6354ee 100644 --- a/packages/horizon/test/escrow/collect.t.sol +++ b/packages/horizon/test/unit/escrow/collect.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../contracts/interfaces/internal/IHorizonStakingMain.sol"; -import { IGraphPayments } from "../../contracts/interfaces/IGraphPayments.sol"; +import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; import { GraphEscrowTest } from "./GraphEscrow.t.sol"; diff --git a/packages/horizon/test/escrow/deposit.t.sol b/packages/horizon/test/unit/escrow/deposit.t.sol similarity index 100% rename from packages/horizon/test/escrow/deposit.t.sol rename to packages/horizon/test/unit/escrow/deposit.t.sol diff --git a/packages/horizon/test/escrow/getters.t.sol b/packages/horizon/test/unit/escrow/getters.t.sol similarity index 96% rename from packages/horizon/test/escrow/getters.t.sol rename to packages/horizon/test/unit/escrow/getters.t.sol index 6434e1b30..b966141e4 100644 --- a/packages/horizon/test/escrow/getters.t.sol +++ b/packages/horizon/test/unit/escrow/getters.t.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IGraphPayments } from "../../contracts/interfaces/IGraphPayments.sol"; +import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; import { GraphEscrowTest } from "./GraphEscrow.t.sol"; diff --git a/packages/horizon/test/escrow/paused.t.sol b/packages/horizon/test/unit/escrow/paused.t.sol similarity index 93% rename from packages/horizon/test/escrow/paused.t.sol rename to packages/horizon/test/unit/escrow/paused.t.sol index a75532ed6..dad7745a8 100644 --- a/packages/horizon/test/escrow/paused.t.sol +++ b/packages/horizon/test/unit/escrow/paused.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IGraphPayments } from "../../contracts/interfaces/IGraphPayments.sol"; -import { IPaymentsEscrow } from "../../contracts/interfaces/IPaymentsEscrow.sol"; +import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; +import { IPaymentsEscrow } from "../../../contracts/interfaces/IPaymentsEscrow.sol"; import { GraphEscrowTest } from "./GraphEscrow.t.sol"; diff --git a/packages/horizon/test/escrow/thaw.t.sol b/packages/horizon/test/unit/escrow/thaw.t.sol similarity index 100% rename from packages/horizon/test/escrow/thaw.t.sol rename to packages/horizon/test/unit/escrow/thaw.t.sol diff --git a/packages/horizon/test/escrow/withdraw.t.sol b/packages/horizon/test/unit/escrow/withdraw.t.sol similarity index 96% rename from packages/horizon/test/escrow/withdraw.t.sol rename to packages/horizon/test/unit/escrow/withdraw.t.sol index ff4d98650..4e5c9e4a7 100644 --- a/packages/horizon/test/escrow/withdraw.t.sol +++ b/packages/horizon/test/unit/escrow/withdraw.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IGraphPayments } from "../../contracts/interfaces/IGraphPayments.sol"; +import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; import { GraphEscrowTest } from "./GraphEscrow.t.sol"; contract GraphEscrowWithdrawTest is GraphEscrowTest { diff --git a/packages/horizon/test/libraries/LinkedList.t.sol b/packages/horizon/test/unit/libraries/LinkedList.t.sol similarity index 98% rename from packages/horizon/test/libraries/LinkedList.t.sol rename to packages/horizon/test/unit/libraries/LinkedList.t.sol index 1f7cb6ea9..13f31b8ad 100644 --- a/packages/horizon/test/libraries/LinkedList.t.sol +++ b/packages/horizon/test/unit/libraries/LinkedList.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/console.sol"; import { Test } from "forge-std/Test.sol"; -import { LinkedList } from "../../contracts/libraries/LinkedList.sol"; +import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; import { ListImplementation } from "./ListImplementation.sol"; diff --git a/packages/horizon/test/libraries/LinkedList.tree b/packages/horizon/test/unit/libraries/LinkedList.tree similarity index 100% rename from packages/horizon/test/libraries/LinkedList.tree rename to packages/horizon/test/unit/libraries/LinkedList.tree diff --git a/packages/horizon/test/libraries/ListImplementation.sol b/packages/horizon/test/unit/libraries/ListImplementation.sol similarity index 95% rename from packages/horizon/test/libraries/ListImplementation.sol rename to packages/horizon/test/unit/libraries/ListImplementation.sol index fda762c6d..5f1c6ce3b 100644 --- a/packages/horizon/test/libraries/ListImplementation.sol +++ b/packages/horizon/test/unit/libraries/ListImplementation.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.27; -import { LinkedList } from "../../contracts/libraries/LinkedList.sol"; +import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; contract ListImplementation { using LinkedList for LinkedList.List; diff --git a/packages/horizon/test/libraries/PPMMath.t.sol b/packages/horizon/test/unit/libraries/PPMMath.t.sol similarity index 96% rename from packages/horizon/test/libraries/PPMMath.t.sol rename to packages/horizon/test/unit/libraries/PPMMath.t.sol index e2240dbcd..a2d011aeb 100644 --- a/packages/horizon/test/libraries/PPMMath.t.sol +++ b/packages/horizon/test/unit/libraries/PPMMath.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/console.sol"; import { Test } from "forge-std/Test.sol"; -import { PPMMath } from "../../contracts/libraries/PPMMath.sol"; +import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; contract PPMMathTest is Test { uint32 private constant MAX_PPM = 1000000; diff --git a/packages/horizon/test/payments/GraphPayments.t.sol b/packages/horizon/test/unit/payments/GraphPayments.t.sol similarity index 96% rename from packages/horizon/test/payments/GraphPayments.t.sol rename to packages/horizon/test/unit/payments/GraphPayments.t.sol index 9ab5fae1d..153fb9522 100644 --- a/packages/horizon/test/payments/GraphPayments.t.sol +++ b/packages/horizon/test/unit/payments/GraphPayments.t.sol @@ -3,13 +3,13 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../contracts/interfaces/internal/IHorizonStakingMain.sol"; -import { IHorizonStakingTypes } from "../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; -import { IGraphPayments } from "../../contracts/interfaces/IGraphPayments.sol"; -import { GraphPayments } from "../../contracts/payments/GraphPayments.sol"; +import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingTypes } from "../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; +import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; +import { GraphPayments } from "../../../contracts/payments/GraphPayments.sol"; import { HorizonStakingSharedTest } from "../shared/horizon-staking/HorizonStakingShared.t.sol"; -import { PPMMath } from "../../contracts/libraries/PPMMath.sol"; +import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; import { IERC20Errors } from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; contract GraphPaymentsExtended is GraphPayments { diff --git a/packages/horizon/test/payments/graph-tally-collector/GraphTallyCollector.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol similarity index 90% rename from packages/horizon/test/payments/graph-tally-collector/GraphTallyCollector.t.sol rename to packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol index 4d0bb4233..ca9ff235d 100644 --- a/packages/horizon/test/payments/graph-tally-collector/GraphTallyCollector.t.sol +++ b/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol @@ -5,13 +5,13 @@ import "forge-std/Test.sol"; import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; -import { IGraphTallyCollector } from "../../../contracts/interfaces/IGraphTallyCollector.sol"; -import { IPaymentsCollector } from "../../../contracts/interfaces/IPaymentsCollector.sol"; -import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; -import { IAuthorizable } from "../../../contracts/interfaces/IAuthorizable.sol"; -import { GraphTallyCollector } from "../../../contracts/payments/collectors/GraphTallyCollector.sol"; -import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IGraphTallyCollector } from "../../../../contracts/interfaces/IGraphTallyCollector.sol"; +import { IPaymentsCollector } from "../../../../contracts/interfaces/IPaymentsCollector.sol"; +import { IGraphPayments } from "../../../../contracts/interfaces/IGraphPayments.sol"; +import { IAuthorizable } from "../../../../contracts/interfaces/IAuthorizable.sol"; +import { GraphTallyCollector } from "../../../../contracts/payments/collectors/GraphTallyCollector.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; import { PaymentsEscrowSharedTest } from "../../shared/payments-escrow/PaymentsEscrowShared.t.sol"; diff --git a/packages/horizon/test/payments/graph-tally-collector/collect/collect.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/collect/collect.t.sol similarity index 98% rename from packages/horizon/test/payments/graph-tally-collector/collect/collect.t.sol rename to packages/horizon/test/unit/payments/graph-tally-collector/collect/collect.t.sol index 364536fbb..c0c30fb78 100644 --- a/packages/horizon/test/payments/graph-tally-collector/collect/collect.t.sol +++ b/packages/horizon/test/unit/payments/graph-tally-collector/collect/collect.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IGraphTallyCollector } from "../../../../contracts/interfaces/IGraphTallyCollector.sol"; -import { IGraphPayments } from "../../../../contracts/interfaces/IGraphPayments.sol"; +import { IGraphTallyCollector } from "../../../../../contracts/interfaces/IGraphTallyCollector.sol"; +import { IGraphPayments } from "../../../../../contracts/interfaces/IGraphPayments.sol"; import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; diff --git a/packages/horizon/test/payments/graph-tally-collector/signer/authorizeSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/authorizeSigner.t.sol similarity index 97% rename from packages/horizon/test/payments/graph-tally-collector/signer/authorizeSigner.t.sol rename to packages/horizon/test/unit/payments/graph-tally-collector/signer/authorizeSigner.t.sol index ecdef7004..3eb65e094 100644 --- a/packages/horizon/test/payments/graph-tally-collector/signer/authorizeSigner.t.sol +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/authorizeSigner.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IAuthorizable } from "../../../../contracts/interfaces/IAuthorizable.sol"; +import { IAuthorizable } from "../../../../../contracts/interfaces/IAuthorizable.sol"; import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; diff --git a/packages/horizon/test/payments/graph-tally-collector/signer/cancelThawSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/cancelThawSigner.t.sol similarity index 92% rename from packages/horizon/test/payments/graph-tally-collector/signer/cancelThawSigner.t.sol rename to packages/horizon/test/unit/payments/graph-tally-collector/signer/cancelThawSigner.t.sol index 460f47d46..c70379e94 100644 --- a/packages/horizon/test/payments/graph-tally-collector/signer/cancelThawSigner.t.sol +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/cancelThawSigner.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IAuthorizable } from "../../../../contracts/interfaces/IAuthorizable.sol"; +import { IAuthorizable } from "../../../../../contracts/interfaces/IAuthorizable.sol"; import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; diff --git a/packages/horizon/test/payments/graph-tally-collector/signer/revokeSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/revokeSigner.t.sol similarity index 95% rename from packages/horizon/test/payments/graph-tally-collector/signer/revokeSigner.t.sol rename to packages/horizon/test/unit/payments/graph-tally-collector/signer/revokeSigner.t.sol index ec32dfce8..cdc4f5d36 100644 --- a/packages/horizon/test/payments/graph-tally-collector/signer/revokeSigner.t.sol +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/revokeSigner.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IAuthorizable } from "../../../../contracts/interfaces/IAuthorizable.sol"; +import { IAuthorizable } from "../../../../../contracts/interfaces/IAuthorizable.sol"; import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; diff --git a/packages/horizon/test/payments/graph-tally-collector/signer/thawSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/thawSigner.t.sol similarity index 95% rename from packages/horizon/test/payments/graph-tally-collector/signer/thawSigner.t.sol rename to packages/horizon/test/unit/payments/graph-tally-collector/signer/thawSigner.t.sol index 49d5ace10..3e62dd6ff 100644 --- a/packages/horizon/test/payments/graph-tally-collector/signer/thawSigner.t.sol +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/thawSigner.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IAuthorizable } from "../../../../contracts/interfaces/IAuthorizable.sol"; +import { IAuthorizable } from "../../../../../contracts/interfaces/IAuthorizable.sol"; import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; diff --git a/packages/horizon/test/shared/horizon-staking/HorizonStakingShared.t.sol b/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol similarity index 99% rename from packages/horizon/test/shared/horizon-staking/HorizonStakingShared.t.sol rename to packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol index 2c845f0c4..3818dc200 100644 --- a/packages/horizon/test/shared/horizon-staking/HorizonStakingShared.t.sol +++ b/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol @@ -4,16 +4,16 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; import { GraphBaseTest } from "../../GraphBase.t.sol"; -import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; -import { IHorizonStakingBase } from "../../../contracts/interfaces/internal/IHorizonStakingBase.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; -import { IHorizonStakingExtension } from "../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; -import { IHorizonStakingTypes } from "../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; - -import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; -import { MathUtils } from "../../../contracts/libraries/MathUtils.sol"; -import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; -import { ExponentialRebates } from "../../../contracts/staking/libraries/ExponentialRebates.sol"; +import { IGraphPayments } from "../../../../contracts/interfaces/IGraphPayments.sol"; +import { IHorizonStakingBase } from "../../../../contracts/interfaces/internal/IHorizonStakingBase.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingExtension } from "../../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; +import { IHorizonStakingTypes } from "../../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; + +import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol"; +import { MathUtils } from "../../../../contracts/libraries/MathUtils.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; +import { ExponentialRebates } from "../../../../contracts/staking/libraries/ExponentialRebates.sol"; abstract contract HorizonStakingSharedTest is GraphBaseTest { using LinkedList for LinkedList.List; diff --git a/packages/horizon/test/shared/payments-escrow/PaymentsEscrowShared.t.sol b/packages/horizon/test/unit/shared/payments-escrow/PaymentsEscrowShared.t.sol similarity index 94% rename from packages/horizon/test/shared/payments-escrow/PaymentsEscrowShared.t.sol rename to packages/horizon/test/unit/shared/payments-escrow/PaymentsEscrowShared.t.sol index 72e92dfde..0e6c91b81 100644 --- a/packages/horizon/test/shared/payments-escrow/PaymentsEscrowShared.t.sol +++ b/packages/horizon/test/unit/shared/payments-escrow/PaymentsEscrowShared.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IPaymentsEscrow } from "../../../contracts/interfaces/IPaymentsEscrow.sol"; +import { IPaymentsEscrow } from "../../../../contracts/interfaces/IPaymentsEscrow.sol"; import { GraphBaseTest } from "../../GraphBase.t.sol"; abstract contract PaymentsEscrowSharedTest is GraphBaseTest { diff --git a/packages/horizon/test/staking/HorizonStaking.t.sol b/packages/horizon/test/unit/staking/HorizonStaking.t.sol similarity index 100% rename from packages/horizon/test/staking/HorizonStaking.t.sol rename to packages/horizon/test/unit/staking/HorizonStaking.t.sol diff --git a/packages/horizon/test/staking/allocation/allocation.t.sol b/packages/horizon/test/unit/staking/allocation/allocation.t.sol similarity index 91% rename from packages/horizon/test/staking/allocation/allocation.t.sol rename to packages/horizon/test/unit/staking/allocation/allocation.t.sol index 189423632..64b830be0 100644 --- a/packages/horizon/test/staking/allocation/allocation.t.sol +++ b/packages/horizon/test/unit/staking/allocation/allocation.t.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; -import { IHorizonStakingExtension } from "../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; +import { IHorizonStakingExtension } from "../../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; contract HorizonStakingAllocationTest is HorizonStakingTest { /* diff --git a/packages/horizon/test/staking/allocation/close.t.sol b/packages/horizon/test/unit/staking/allocation/close.t.sol similarity index 95% rename from packages/horizon/test/staking/allocation/close.t.sol rename to packages/horizon/test/unit/staking/allocation/close.t.sol index da2e869a3..5bb3bc979 100644 --- a/packages/horizon/test/staking/allocation/close.t.sol +++ b/packages/horizon/test/unit/staking/allocation/close.t.sol @@ -4,8 +4,8 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; -import { IHorizonStakingExtension } from "../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; -import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; +import { IHorizonStakingExtension } from "../../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; contract HorizonStakingCloseAllocationTest is HorizonStakingTest { using PPMMath for uint256; diff --git a/packages/horizon/test/staking/allocation/collect.t.sol b/packages/horizon/test/unit/staking/allocation/collect.t.sol similarity index 94% rename from packages/horizon/test/staking/allocation/collect.t.sol rename to packages/horizon/test/unit/staking/allocation/collect.t.sol index 6b0c6cfcd..bdf488c8b 100644 --- a/packages/horizon/test/staking/allocation/collect.t.sol +++ b/packages/horizon/test/unit/staking/allocation/collect.t.sol @@ -4,8 +4,8 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; -import { ExponentialRebates } from "../../../contracts/staking/libraries/ExponentialRebates.sol"; -import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; +import { ExponentialRebates } from "../../../../contracts/staking/libraries/ExponentialRebates.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; contract HorizonStakingCollectAllocationTest is HorizonStakingTest { using PPMMath for uint256; diff --git a/packages/horizon/test/staking/delegation/addToPool.t.sol b/packages/horizon/test/unit/staking/delegation/addToPool.t.sol similarity index 98% rename from packages/horizon/test/staking/delegation/addToPool.t.sol rename to packages/horizon/test/unit/staking/delegation/addToPool.t.sol index 7652478e2..d07fbc713 100644 --- a/packages/horizon/test/staking/delegation/addToPool.t.sol +++ b/packages/horizon/test/unit/staking/delegation/addToPool.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; contract HorizonStakingDelegationAddToPoolTest is HorizonStakingTest { diff --git a/packages/horizon/test/staking/delegation/delegate.t.sol b/packages/horizon/test/unit/staking/delegation/delegate.t.sol similarity index 98% rename from packages/horizon/test/staking/delegation/delegate.t.sol rename to packages/horizon/test/unit/staking/delegation/delegate.t.sol index 463bc7b32..48ff6abd7 100644 --- a/packages/horizon/test/staking/delegation/delegate.t.sol +++ b/packages/horizon/test/unit/staking/delegation/delegate.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/delegation/legacyWithdraw.t.sol b/packages/horizon/test/unit/staking/delegation/legacyWithdraw.t.sol similarity index 89% rename from packages/horizon/test/staking/delegation/legacyWithdraw.t.sol rename to packages/horizon/test/unit/staking/delegation/legacyWithdraw.t.sol index 89b156085..f18485fd5 100644 --- a/packages/horizon/test/staking/delegation/legacyWithdraw.t.sol +++ b/packages/horizon/test/unit/staking/delegation/legacyWithdraw.t.sol @@ -3,10 +3,10 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; -import { IHorizonStakingTypes } from "../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; -import { IHorizonStakingExtension } from "../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; -import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingTypes } from "../../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; +import { IHorizonStakingExtension } from "../../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; +import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/delegation/redelegate.t.sol b/packages/horizon/test/unit/staking/delegation/redelegate.t.sol similarity index 97% rename from packages/horizon/test/staking/delegation/redelegate.t.sol rename to packages/horizon/test/unit/staking/delegation/redelegate.t.sol index a4d9c8e03..27399328d 100644 --- a/packages/horizon/test/staking/delegation/redelegate.t.sol +++ b/packages/horizon/test/unit/staking/delegation/redelegate.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/delegation/undelegate.t.sol b/packages/horizon/test/unit/staking/delegation/undelegate.t.sol similarity index 98% rename from packages/horizon/test/staking/delegation/undelegate.t.sol rename to packages/horizon/test/unit/staking/delegation/undelegate.t.sol index 54ad91cff..fcdca8107 100644 --- a/packages/horizon/test/staking/delegation/undelegate.t.sol +++ b/packages/horizon/test/unit/staking/delegation/undelegate.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/delegation/withdraw.t.sol b/packages/horizon/test/unit/staking/delegation/withdraw.t.sol similarity index 95% rename from packages/horizon/test/staking/delegation/withdraw.t.sol rename to packages/horizon/test/unit/staking/delegation/withdraw.t.sol index bbf7ecd1b..7c2c1ec53 100644 --- a/packages/horizon/test/staking/delegation/withdraw.t.sol +++ b/packages/horizon/test/unit/staking/delegation/withdraw.t.sol @@ -3,9 +3,9 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; -import { IHorizonStakingTypes } from "../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; -import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingTypes } from "../../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; +import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/governance/governance.t.sol b/packages/horizon/test/unit/staking/governance/governance.t.sol similarity index 100% rename from packages/horizon/test/staking/governance/governance.t.sol rename to packages/horizon/test/unit/staking/governance/governance.t.sol diff --git a/packages/horizon/test/staking/operator/locked.t.sol b/packages/horizon/test/unit/staking/operator/locked.t.sol similarity index 100% rename from packages/horizon/test/staking/operator/locked.t.sol rename to packages/horizon/test/unit/staking/operator/locked.t.sol diff --git a/packages/horizon/test/staking/operator/operator.t.sol b/packages/horizon/test/unit/staking/operator/operator.t.sol similarity index 100% rename from packages/horizon/test/staking/operator/operator.t.sol rename to packages/horizon/test/unit/staking/operator/operator.t.sol diff --git a/packages/horizon/test/staking/provision/deprovision.t.sol b/packages/horizon/test/unit/staking/provision/deprovision.t.sol similarity index 100% rename from packages/horizon/test/staking/provision/deprovision.t.sol rename to packages/horizon/test/unit/staking/provision/deprovision.t.sol diff --git a/packages/horizon/test/staking/provision/locked.t.sol b/packages/horizon/test/unit/staking/provision/locked.t.sol similarity index 100% rename from packages/horizon/test/staking/provision/locked.t.sol rename to packages/horizon/test/unit/staking/provision/locked.t.sol diff --git a/packages/horizon/test/staking/provision/parameters.t.sol b/packages/horizon/test/unit/staking/provision/parameters.t.sol similarity index 98% rename from packages/horizon/test/staking/provision/parameters.t.sol rename to packages/horizon/test/unit/staking/provision/parameters.t.sol index ff08edf79..d87fce9f5 100644 --- a/packages/horizon/test/staking/provision/parameters.t.sol +++ b/packages/horizon/test/unit/staking/provision/parameters.t.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; contract HorizonStakingProvisionParametersTest is HorizonStakingTest { /* diff --git a/packages/horizon/test/staking/provision/provision.t.sol b/packages/horizon/test/unit/staking/provision/provision.t.sol similarity index 100% rename from packages/horizon/test/staking/provision/provision.t.sol rename to packages/horizon/test/unit/staking/provision/provision.t.sol diff --git a/packages/horizon/test/staking/provision/reprovision.t.sol b/packages/horizon/test/unit/staking/provision/reprovision.t.sol similarity index 100% rename from packages/horizon/test/staking/provision/reprovision.t.sol rename to packages/horizon/test/unit/staking/provision/reprovision.t.sol diff --git a/packages/horizon/test/staking/provision/thaw.t.sol b/packages/horizon/test/unit/staking/provision/thaw.t.sol similarity index 98% rename from packages/horizon/test/staking/provision/thaw.t.sol rename to packages/horizon/test/unit/staking/provision/thaw.t.sol index 46c666618..6b57a7b70 100644 --- a/packages/horizon/test/staking/provision/thaw.t.sol +++ b/packages/horizon/test/unit/staking/provision/thaw.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingTypes } from "../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; +import { IHorizonStakingTypes } from "../../../../contracts/interfaces/internal/IHorizonStakingTypes.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; contract HorizonStakingThawTest is HorizonStakingTest { diff --git a/packages/horizon/test/staking/serviceProvider/serviceProvider.t.sol b/packages/horizon/test/unit/staking/serviceProvider/serviceProvider.t.sol similarity index 96% rename from packages/horizon/test/staking/serviceProvider/serviceProvider.t.sol rename to packages/horizon/test/unit/staking/serviceProvider/serviceProvider.t.sol index 6c5fe4904..053130db1 100644 --- a/packages/horizon/test/staking/serviceProvider/serviceProvider.t.sol +++ b/packages/horizon/test/unit/staking/serviceProvider/serviceProvider.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; -import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IGraphPayments } from "../../../../contracts/interfaces/IGraphPayments.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/slash/legacySlash.t.sol b/packages/horizon/test/unit/staking/slash/legacySlash.t.sol similarity index 98% rename from packages/horizon/test/staking/slash/legacySlash.t.sol rename to packages/horizon/test/unit/staking/slash/legacySlash.t.sol index abb587404..f463489f3 100644 --- a/packages/horizon/test/staking/slash/legacySlash.t.sol +++ b/packages/horizon/test/unit/staking/slash/legacySlash.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingExtension } from "../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; +import { IHorizonStakingExtension } from "../../../../contracts/interfaces/internal/IHorizonStakingExtension.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/slash/slash.t.sol b/packages/horizon/test/unit/staking/slash/slash.t.sol similarity index 98% rename from packages/horizon/test/staking/slash/slash.t.sol rename to packages/horizon/test/unit/staking/slash/slash.t.sol index 3f67a9e59..a51db1e25 100644 --- a/packages/horizon/test/staking/slash/slash.t.sol +++ b/packages/horizon/test/unit/staking/slash/slash.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/staking/stake/stake.t.sol b/packages/horizon/test/unit/staking/stake/stake.t.sol similarity index 100% rename from packages/horizon/test/staking/stake/stake.t.sol rename to packages/horizon/test/unit/staking/stake/stake.t.sol diff --git a/packages/horizon/test/staking/stake/unstake.t.sol b/packages/horizon/test/unit/staking/stake/unstake.t.sol similarity index 100% rename from packages/horizon/test/staking/stake/unstake.t.sol rename to packages/horizon/test/unit/staking/stake/unstake.t.sol diff --git a/packages/horizon/test/staking/stake/withdraw.t.sol b/packages/horizon/test/unit/staking/stake/withdraw.t.sol similarity index 95% rename from packages/horizon/test/staking/stake/withdraw.t.sol rename to packages/horizon/test/unit/staking/stake/withdraw.t.sol index b28dea022..5968838b4 100644 --- a/packages/horizon/test/staking/stake/withdraw.t.sol +++ b/packages/horizon/test/unit/staking/stake/withdraw.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; -import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingMain } from "../../../../contracts/interfaces/internal/IHorizonStakingMain.sol"; import { HorizonStakingTest } from "../HorizonStaking.t.sol"; diff --git a/packages/horizon/test/utilities/Authorizable.t.sol b/packages/horizon/test/unit/utilities/Authorizable.t.sol similarity index 99% rename from packages/horizon/test/utilities/Authorizable.t.sol rename to packages/horizon/test/unit/utilities/Authorizable.t.sol index c31721af8..4528b339d 100644 --- a/packages/horizon/test/utilities/Authorizable.t.sol +++ b/packages/horizon/test/unit/utilities/Authorizable.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.27; import { Test } from "forge-std/Test.sol"; -import { Authorizable } from "../../contracts/utilities/Authorizable.sol"; -import { IAuthorizable } from "../../contracts/interfaces/IAuthorizable.sol"; +import { Authorizable } from "../../../contracts/utilities/Authorizable.sol"; +import { IAuthorizable } from "../../../contracts/interfaces/IAuthorizable.sol"; import { Bounder } from "../utils/Bounder.t.sol"; import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; diff --git a/packages/horizon/test/utilities/GraphDirectory.t.sol b/packages/horizon/test/unit/utilities/GraphDirectory.t.sol similarity index 97% rename from packages/horizon/test/utilities/GraphDirectory.t.sol rename to packages/horizon/test/unit/utilities/GraphDirectory.t.sol index 606933699..180590a1e 100644 --- a/packages/horizon/test/utilities/GraphDirectory.t.sol +++ b/packages/horizon/test/unit/utilities/GraphDirectory.t.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.27; import "forge-std/Test.sol"; import { stdStorage, StdStorage } from "forge-std/Test.sol"; import { GraphBaseTest } from "../GraphBase.t.sol"; -import { GraphDirectory } from "./../../contracts/utilities/GraphDirectory.sol"; +import { GraphDirectory } from "./../../../contracts/utilities/GraphDirectory.sol"; import { GraphDirectoryImplementation } from "./GraphDirectoryImplementation.sol"; contract GraphDirectoryTest is GraphBaseTest { diff --git a/packages/horizon/test/utilities/GraphDirectory.tree b/packages/horizon/test/unit/utilities/GraphDirectory.tree similarity index 100% rename from packages/horizon/test/utilities/GraphDirectory.tree rename to packages/horizon/test/unit/utilities/GraphDirectory.tree diff --git a/packages/horizon/test/utilities/GraphDirectoryImplementation.sol b/packages/horizon/test/unit/utilities/GraphDirectoryImplementation.sol similarity index 82% rename from packages/horizon/test/utilities/GraphDirectoryImplementation.sol rename to packages/horizon/test/unit/utilities/GraphDirectoryImplementation.sol index 1095adc3a..bf40a35b8 100644 --- a/packages/horizon/test/utilities/GraphDirectoryImplementation.sol +++ b/packages/horizon/test/unit/utilities/GraphDirectoryImplementation.sol @@ -3,18 +3,18 @@ pragma solidity 0.8.27; import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; -import { IHorizonStaking } from "../../contracts/interfaces/IHorizonStaking.sol"; -import { IGraphPayments } from "../../contracts/interfaces/IGraphPayments.sol"; -import { IPaymentsEscrow } from "../../contracts/interfaces/IPaymentsEscrow.sol"; +import { IHorizonStaking } from "../../../contracts/interfaces/IHorizonStaking.sol"; +import { IGraphPayments } from "../../../contracts/interfaces/IGraphPayments.sol"; +import { IPaymentsEscrow } from "../../../contracts/interfaces/IPaymentsEscrow.sol"; import { IController } from "@graphprotocol/contracts/contracts/governance/IController.sol"; import { IEpochManager } from "@graphprotocol/contracts/contracts/epochs/IEpochManager.sol"; import { IRewardsManager } from "@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol"; import { ITokenGateway } from "@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol"; -import { IGraphProxyAdmin } from "../../contracts/interfaces/IGraphProxyAdmin.sol"; +import { IGraphProxyAdmin } from "../../../contracts/interfaces/IGraphProxyAdmin.sol"; import { ICuration } from "@graphprotocol/contracts/contracts/curation/ICuration.sol"; -import { GraphDirectory } from "./../../contracts/utilities/GraphDirectory.sol"; +import { GraphDirectory } from "./../../../contracts/utilities/GraphDirectory.sol"; contract GraphDirectoryImplementation is GraphDirectory { constructor(address controller) GraphDirectory(controller) {} diff --git a/packages/horizon/test/utils/Bounder.t.sol b/packages/horizon/test/unit/utils/Bounder.t.sol similarity index 100% rename from packages/horizon/test/utils/Bounder.t.sol rename to packages/horizon/test/unit/utils/Bounder.t.sol diff --git a/packages/horizon/test/utils/Constants.sol b/packages/horizon/test/unit/utils/Constants.sol similarity index 100% rename from packages/horizon/test/utils/Constants.sol rename to packages/horizon/test/unit/utils/Constants.sol diff --git a/packages/horizon/test/utils/Users.sol b/packages/horizon/test/unit/utils/Users.sol similarity index 100% rename from packages/horizon/test/utils/Users.sol rename to packages/horizon/test/unit/utils/Users.sol diff --git a/packages/horizon/test/utils/Utils.sol b/packages/horizon/test/unit/utils/Utils.sol similarity index 100% rename from packages/horizon/test/utils/Utils.sol rename to packages/horizon/test/unit/utils/Utils.sol diff --git a/yarn.lock b/yarn.lock index b12f304e5..a7ea5693e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2964,6 +2964,7 @@ __metadata: eslint: "npm:^8.56.0" eslint-graph-config: "workspace:^0.0.1" ethers: "npm:^6.13.4" + glob: "npm:^11.0.1" hardhat: "npm:^2.22.18" hardhat-contract-sizer: "npm:^2.10.0" hardhat-gas-reporter: "npm:^1.0.8" @@ -14075,6 +14076,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^11.0.1": + version: 11.0.1 + resolution: "glob@npm:11.0.1" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^4.0.1" + minimatch: "npm:^10.0.0" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 2b32588be52e9e90f914c7d8dec32f3144b81b84054b0f70e9adfebf37cd7014570489f2a79d21f7801b9a4bd4cca94f426966bfd00fb64a5b705cfe10da3a03 + languageName: node + linkType: hard + "glob@npm:^5.0.15": version: 5.0.15 resolution: "glob@npm:5.0.15" @@ -16663,6 +16680,15 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.0.1": + version: 4.0.2 + resolution: "jackspeak@npm:4.0.2" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + checksum: b26039d11c0163a95b1e58851b9ac453cce64ad6d1eb98a00b303ad5eeb761b29d33c9419d1e16c016d3f7151c8edf7df223e6cf93a1907655fd95d6ce85c0de + languageName: node + linkType: hard + "jiti@npm:^1.19.1": version: 1.21.0 resolution: "jiti@npm:1.21.0" @@ -17869,6 +17895,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0": + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: c993b8e06ead0b24b969c1dbb5b301716aed66e320e9014a80012f5febe280b438f28ff50046b2c55ff404e889351ccb332ff91f8dd175a21f5eae80e3fb155f + languageName: node + linkType: hard + "lru-cache@npm:^3.2.0": version: 3.2.0 resolution: "lru-cache@npm:3.2.0" @@ -18412,6 +18445,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: e6c29a81fe83e1877ad51348306be2e8aeca18c88fdee7a99df44322314279e15799e41d7cb274e4e8bb0b451a3bc622d6182e157dfa1717d6cda75e9cd8cd5d + languageName: node + linkType: hard + "minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -18530,6 +18572,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + "minizlib@npm:^1.3.3": version: 1.3.3 resolution: "minizlib@npm:1.3.3" @@ -19832,6 +19881,13 @@ __metadata: languageName: node linkType: hard +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + "package-json@npm:^8.1.0": version: 8.1.1 resolution: "package-json@npm:8.1.1" @@ -20127,6 +20183,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 3da4adedaa8e7ef8d6dc4f35a0ff8f05a9b4d8365f2b28047752b62d4c1ad73eec21e37b1579ef2d075920157856a3b52ae8309c480a6f1a8bbe06ff8e52b33c + languageName: node + linkType: hard + "path-starts-with@npm:^2.0.0": version: 2.0.1 resolution: "path-starts-with@npm:2.0.1" From 5e32650d21f8c20515b841e7095a63df1c9dd3b2 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 12 Feb 2025 13:20:05 -0300 Subject: [PATCH 02/23] fix: import hardhat tasks after build/contracts exist --- packages/horizon/hardhat.config.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts index 339168126..d940aea11 100644 --- a/packages/horizon/hardhat.config.ts +++ b/packages/horizon/hardhat.config.ts @@ -1,4 +1,6 @@ import { hardhatBaseConfig } from 'hardhat-graph-protocol/sdk' +import { existsSync, readdirSync } from 'fs' +import { join } from 'path' // Hardhat plugins import '@nomicfoundation/hardhat-foundry' @@ -8,6 +10,20 @@ import 'hardhat-contract-sizer' import 'hardhat-secure-accounts' import { HardhatUserConfig } from 'hardhat/types' +// Hardhat tasks +function loadTasks() { + const tasksPath = join(__dirname, 'tasks') + readdirSync(tasksPath) + .filter(pth => pth.includes('.ts')) + .forEach((file) => { + require(join(tasksPath, file)) + }) +} + +if (existsSync(join(__dirname, 'build/contracts'))) { + loadTasks() +} + // Skip importing hardhat-graph-protocol when building the project, it has circular dependency if (process.env.BUILD_RUN !== 'true') { require('hardhat-graph-protocol') From bdd8b9dd8a8fb27c2eb36a26ffeda5379aada05c Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Thu, 13 Feb 2025 11:46:20 -0300 Subject: [PATCH 03/23] fix: run integration tests on CI --- packages/horizon/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/horizon/package.json b/packages/horizon/package.json index 1166fa251..e59e40e02 100644 --- a/packages/horizon/package.json +++ b/packages/horizon/package.json @@ -20,7 +20,8 @@ "clean": "rm -rf build dist cache cache_forge typechain-types", "build": "BUILD_RUN=true hardhat compile", "test": "forge test", - "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test" + "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test", + "test:integration": "hardhat test:integration --deploy-type deploy" }, "devDependencies": { "@defi-wonderland/natspec-smells": "^1.1.6", From dfab1db6ab1530a3d10928cf46547738cd1a418e Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 19 Feb 2025 17:46:03 -0300 Subject: [PATCH 04/23] chore: added operator tests --- packages/horizon/tasks/deploy.ts | 2 +- packages/horizon/tasks/e2e.ts | 9 +- packages/horizon/tasks/migrate.ts | 6 - .../after-transition-period/operator.test.ts | 197 ++++++++++++ .../service-provider.test.ts | 145 +++++++-- .../test/integration/shared/staking.ts | 293 +++++++----------- 6 files changed, 424 insertions(+), 228 deletions(-) delete mode 100644 packages/horizon/tasks/migrate.ts create mode 100644 packages/horizon/test/integration/after-transition-period/operator.test.ts diff --git a/packages/horizon/tasks/deploy.ts b/packages/horizon/tasks/deploy.ts index 511a7550a..7bde23b3e 100644 --- a/packages/horizon/tasks/deploy.ts +++ b/packages/horizon/tasks/deploy.ts @@ -32,7 +32,7 @@ task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon cont // Deploy the contracts console.log(`\n========== 🚧 Deploy protocol ==========`) const deployment = await hre.ignition.deploy(DeployModule, { - displayUi: true, + displayUi: args.displayUi ?? true, parameters: HorizonConfig, }) diff --git a/packages/horizon/tasks/e2e.ts b/packages/horizon/tasks/e2e.ts index b106679a9..d390b499d 100644 --- a/packages/horizon/tasks/e2e.ts +++ b/packages/horizon/tasks/e2e.ts @@ -14,10 +14,7 @@ task('test:integration', 'Runs all integration tests') if (taskArgs.deployType) { switch (taskArgs.deployType.toLowerCase()) { case 'deploy': - await hre.run('deploy', { deploymentId: 'integration-tests' }) - break - case 'migrate': - await hre.run('migrate') + await hre.run('deploy:protocol') break default: throw new Error('Invalid mode. Must be either deploy or migrate') @@ -26,7 +23,9 @@ task('test:integration', 'Runs all integration tests') const testFiles = await glob('test/integration/**/*.{js,ts}') - // Use local addresses + // Initialize graph config if not exists + hre.config.graph = hre.config.graph || {} + hre.config.graph.deployments = hre.config.graph.deployments || {} hre.config.graph.deployments.horizon = './addresses-local.json' await hre.run(TASK_TEST, { testFiles: testFiles }) diff --git a/packages/horizon/tasks/migrate.ts b/packages/horizon/tasks/migrate.ts deleted file mode 100644 index 907199ff5..000000000 --- a/packages/horizon/tasks/migrate.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { task } from 'hardhat/config' - -task('migrate', 'Migrate contracts using Ignition') - .setAction(async (_) => { - // TODO: Implement migration task - }) diff --git a/packages/horizon/test/integration/after-transition-period/operator.test.ts b/packages/horizon/test/integration/after-transition-period/operator.test.ts new file mode 100644 index 000000000..dbca382f7 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/operator.test.ts @@ -0,0 +1,197 @@ +import hre from 'hardhat' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { createProvision, deprovision, reprovision, stakeTo, thaw, unstake } from '../shared/staking' +import { PaymentTypes } from '../utils/types' + +describe('Operator', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let serviceProvider: SignerWithAddress + let verifier: string + let operator: SignerWithAddress + + const tokens = ethers.parseEther('100000') + const maxVerifierCut = 1000000 // 100% + const thawingPeriod = 2419200 + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + // Get signers + [serviceProvider, operator] = await ethers.getSigners() + verifier = await ethers.Wallet.createRandom().getAddress() + + // Authorize operator for verifier + await horizonStaking.connect(serviceProvider).setOperator(verifier, operator.address, true) + + // Fund operator with tokens + await graphToken.connect(serviceProvider).transfer(operator.address, tokens) + }) + + it('operator stakes using stakeTo and service provider unstakes', async () => { + const stakeTokens = ethers.parseEther('100') + const operatorBalanceBefore = await graphToken.balanceOf(operator.address) + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Operator stakes on behalf of service provider + await stakeTo(horizonStaking, graphToken, operator, serviceProvider, stakeTokens) + + // Service provider unstakes + await unstake(horizonStaking, serviceProvider, stakeTokens) + + // Verify tokens were removed from operator's address + const operatorBalanceAfter = await graphToken.balanceOf(operator.address) + expect(operatorBalanceAfter).to.be.equal(operatorBalanceBefore - stakeTokens) + + // Verify tokens were added to service provider's address + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.be.equal(serviceProviderBalanceBefore + stakeTokens) + }) + + it('operator sets delegation fee cut', async () => { + const feeCut = 100000 // 10% + const paymentType = PaymentTypes.QueryFee + + // Operator sets delegation fee cut + await horizonStaking.connect(operator).setDelegationFeeCut( + serviceProvider.address, + verifier, + paymentType, + feeCut, + ) + + // Verify fee cut + const delegationFeeCut = await horizonStaking.getDelegationFeeCut( + serviceProvider.address, + verifier, + paymentType, + ) + expect(delegationFeeCut).to.equal(feeCut) + }) + + describe('Provision', () => { + before(async () => { + const provisionTokens = ethers.parseEther('10000') + // Operator stakes tokens to service provider + await stakeTo(horizonStaking, graphToken, operator, serviceProvider, provisionTokens) + + // Operator creates provision + await createProvision({ + horizonStaking, + serviceProvider, + verifier, + tokens: provisionTokens, + maxVerifierCut, + thawingPeriod, + signer: operator, + }) + + // Verify provision + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokens) + }) + + it('operator thaws and deprovisions', async () => { + const thawTokens = ethers.parseEther('100') + const idleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + const provisionTokensBefore = (await horizonStaking.getProvision(serviceProvider.address, verifier)).tokens + + // Operator thaws tokens + await thaw({ + horizonStaking, + serviceProvider, + verifier, + tokens: thawTokens, + signer: operator, + }) + + // Increase time + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_mine', []) + + // Operator deprovisions + await deprovision({ + horizonStaking, + serviceProvider, + verifier, + nThawRequests: 1n, + signer: operator, + }) + + // Verify idle stake increased by thawed tokens + const idleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(idleStakeAfter).to.equal(idleStakeBefore + thawTokens) + + // Verify provision tokens decreased by thawed tokens + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokensBefore - thawTokens) + }) + + it('operator thaws and reprovisions', async () => { + const thawTokens = ethers.parseEther('100') + + // Operator thaws tokens + await thaw({ + horizonStaking, + serviceProvider, + verifier, + tokens: thawTokens, + signer: operator, + }) + + // Increase time + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_mine', []) + + // Create new verifier and authorize operator + const newVerifier = await ethers.Wallet.createRandom().getAddress() + await horizonStaking.connect(serviceProvider).setOperator(newVerifier, operator.address, true) + + // Operator creates a provision for the new verifier + await createProvision({ + horizonStaking, + serviceProvider, + verifier: newVerifier, + tokens: thawTokens, + maxVerifierCut, + thawingPeriod, + signer: operator, + }) + + // Operator reprovisions + await reprovision({ + horizonStaking, + serviceProvider, + verifier, + newVerifier, + nThawRequests: 1n, + signer: operator, + }) + }) + + it('operator sets provision parameters', async () => { + const newMaxVerifierCut = 500000 // 50% + const newThawingPeriod = 7200 // 2 hours + + // Operator sets new parameters + await horizonStaking.connect(operator).setProvisionParameters( + serviceProvider.address, + verifier, + newMaxVerifierCut, + newThawingPeriod, + ) + + // Verify new parameters + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.maxVerifierCutPending).to.equal(newMaxVerifierCut) + expect(provision.thawingPeriodPending).to.equal(newThawingPeriod) + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index edf26104a..a8c4d2ed6 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -4,7 +4,7 @@ import { expect } from 'chai' import { HorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' -import { addToProvision, deprovision, provision, reprovision, stake, stakeToProvision, thaw, unstake } from '../shared/staking' +import { addToProvision, createProvision, deprovision, reprovision, stake, stakeToProvision, thaw, unstake } from '../shared/staking' import { PaymentTypes } from '../utils/types' describe('HorizonStaking Integration Tests', () => { @@ -12,26 +12,28 @@ describe('HorizonStaking Integration Tests', () => { let graphToken: IGraphToken let verifier: string let serviceProvider: SignerWithAddress - let thawingPeriod: bigint + const thawingPeriod = 2419200 + before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon.contracts.HorizonStaking as HorizonStaking - graphToken = graph.horizon.contracts.GraphToken as IGraphToken + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken verifier = await ethers.Wallet.createRandom().getAddress(); [serviceProvider] = await ethers.getSigners() - - thawingPeriod = await horizonStaking.getMaxThawingPeriod() }) describe('Service provider', () => { const stakeAmount = ethers.parseEther('1000') it('should allow staking tokens and unstake right after', async () => { + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) await stake(horizonStaking, graphToken, serviceProvider, stakeAmount) - await unstake(horizonStaking, graphToken, serviceProvider, stakeAmount) + await unstake(horizonStaking, serviceProvider, stakeAmount) + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore, 'Service provider balance should not change') }) it('should revert if unstaking more than the idle stake', async () => { @@ -62,6 +64,23 @@ describe('HorizonStaking Integration Tests', () => { expect(delegationFeeCutAfterSet).to.equal(delegationFeeCut, 'Delegation fee cut was not set') }) + it('should be able to set an operator for a verifier', async () => { + const operator = await ethers.Wallet.createRandom().getAddress() + await horizonStaking.connect(serviceProvider).setOperator( + verifier, + operator, + true, + ) + + // Verify operator was set + const isAuthorized = await horizonStaking.isAuthorized( + serviceProvider.address, + verifier, + operator, + ) + expect(isAuthorized).to.be.true + }) + describe('Provision', () => { let maxVerifierCut: number @@ -74,7 +93,14 @@ describe('HorizonStaking Integration Tests', () => { await stake(horizonStaking, graphToken, serviceProvider, tokensToStake) // Create provision - await provision(horizonStaking, serviceProvider, verifier, createProvisionTokens, maxVerifierCut, thawingPeriod) + await createProvision({ + horizonStaking, + serviceProvider, + verifier, + tokens: createProvisionTokens, + maxVerifierCut, + thawingPeriod, + }) }) it('should be able to stake to provision directly', async () => { @@ -96,7 +122,7 @@ describe('HorizonStaking Integration Tests', () => { // Add to provision using idle stake const addToProvisionTokens = ethers.parseEther('100') - await addToProvision(horizonStaking, serviceProvider, verifier, addToProvisionTokens) + await addToProvision({ horizonStaking, serviceProvider, verifier, tokens: addToProvisionTokens }) // Verify provision tokens were updated provision = await horizonStaking.getProvision(serviceProvider.address, verifier) @@ -123,50 +149,65 @@ describe('HorizonStaking Integration Tests', () => { describe('Thawing', () => { describe('Deprovisioning', () => { it('should be able to thaw tokens, wait for thawing period, deprovision and unstake', async () => { + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) const tokensToThaw = ethers.parseEther('100') - await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) await ethers.provider.send('evm_mine', []) // Deprovision the single thaw request - await deprovision(horizonStaking, serviceProvider, verifier, 1n) + await deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 1n }) // Unstake - await unstake(horizonStaking, graphToken, serviceProvider, tokensToThaw) + await unstake(horizonStaking, serviceProvider, tokensToThaw) + + // Verify service provider balance increased by the unstake tokens + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore + tokensToThaw, 'Service provider balance should increase by the thawed tokens') }) it('should be able to create multiple thaw requests and deprovision all at once', async () => { + const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) const tokensToThaw = ethers.parseEther('100') // Create 10 thaw requests for 100 GRT each for (let i = 0; i < 10; i++) { - await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) } // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) await ethers.provider.send('evm_mine', []) // Deprovision all thaw requests - await deprovision(horizonStaking, serviceProvider, verifier, 0n) + await deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 10n }) + + // Verify service provider idle stake increased by the deprovisioned tokens + const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(serviceProviderIdleStakeAfter).to.equal(serviceProviderIdleStakeBefore + tokensToThaw * 10n, 'Service provider idle stake should increase by the deprovisioned tokens') }) it('should be able to create multiple thaw requests and deprovision one by one', async () => { + const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) const tokensToThaw = ethers.parseEther('100') // Create 3 thaw requests for 100 GRT each for (let i = 0; i < 3; i++) { - await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) } // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) await ethers.provider.send('evm_mine', []) // Deprovision one by one for (let i = 0; i < 3; i++) { - await deprovision(horizonStaking, serviceProvider, verifier, 1n) + await deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 1n }) } + + // Verify service provider idle stake increased by the deprovisioned tokens + const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(serviceProviderIdleStakeAfter).to.equal(serviceProviderIdleStakeBefore + tokensToThaw * 3n, 'Service provider idle stake should increase by the deprovisioned tokens') }) }) @@ -175,30 +216,80 @@ describe('HorizonStaking Integration Tests', () => { before(async () => { newVerifier = await ethers.Wallet.createRandom().getAddress() - await provision(horizonStaking, serviceProvider, newVerifier, ethers.parseEther('100'), maxVerifierCut, thawingPeriod) + await createProvision({ + horizonStaking, + serviceProvider, + verifier: newVerifier, + tokens: ethers.parseEther('100'), + maxVerifierCut, + thawingPeriod, + }) }) it('should be able to thaw tokens, wait for thawing period and reprovision', async () => { + const serviceProviderNewProvisionSizeBefore = (await horizonStaking.getProvision(serviceProvider.address, newVerifier)).tokens + const serviceProviderOldProvisionSizeBefore = (await horizonStaking.getProvision(serviceProvider.address, verifier)).tokens const tokensToThaw = ethers.parseEther('100') - await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) + + // Thaw tokens + await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) await ethers.provider.send('evm_mine', []) // Reprovision - await reprovision(horizonStaking, serviceProvider, verifier, newVerifier, 1n) + await reprovision({ + horizonStaking, + serviceProvider, + verifier, + newVerifier, + nThawRequests: 1n, + }) + + // Verify new provision size increased by the reprovisioned tokens + const serviceProviderNewProvisionSizeAfter = (await horizonStaking.getProvision(serviceProvider.address, newVerifier)).tokens + expect(serviceProviderNewProvisionSizeAfter).to.equal(serviceProviderNewProvisionSizeBefore + tokensToThaw, 'New provision size should increase by the reprovisioned tokens') + + // Verify old provision size decreased by the reprovisioned tokens + const serviceProviderOldProvisionSizeAfter = (await horizonStaking.getProvision(serviceProvider.address, verifier)).tokens + expect(serviceProviderOldProvisionSizeAfter).to.equal(serviceProviderOldProvisionSizeBefore - tokensToThaw, 'Old provision size should decrease by the reprovisioned tokens') }) it('should revert if thawing period is not over', async () => { const tokensToThaw = ethers.parseEther('100') - await thaw(horizonStaking, serviceProvider, verifier, tokensToThaw) - - await expect(reprovision(horizonStaking, serviceProvider, verifier, newVerifier, 1n)) - .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidZeroTokens') + await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) + + await expect(reprovision({ + horizonStaking, + serviceProvider, + verifier, + newVerifier, + nThawRequests: 1n, + })).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidZeroTokens') }) }) }) + + describe('Set parameters', () => { + it('should be able to set provision parameters', async () => { + const newMaxVerifierCut = 20_000 // 20% + const newThawingPeriod = 1000 + + // Set parameters + await horizonStaking.connect(serviceProvider).setProvisionParameters( + serviceProvider.address, + verifier, + newMaxVerifierCut, + newThawingPeriod, + ) + + // Verify parameters were set as pending + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.maxVerifierCutPending).to.equal(newMaxVerifierCut, 'Max verifier cut should be set') + expect(provision.thawingPeriodPending).to.equal(newThawingPeriod, 'Thawing period should be set') + }) + }) }) }) }) diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts index 11c43c0f2..a51cf2d93 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/horizon/test/integration/shared/staking.ts @@ -3,6 +3,32 @@ import { HorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { ThawRequestType } from '../utils/types' +/* ////////////////////////////////////////////////////////////// + INTERFACE DEFINITIONS +////////////////////////////////////////////////////////////// */ + +interface ProvisionParams { + horizonStaking: HorizonStaking + serviceProvider: SignerWithAddress + verifier: string + tokens: bigint + signer?: SignerWithAddress +} + +interface CreateProvisionParams extends ProvisionParams { + maxVerifierCut: number + thawingPeriod: number +} + +interface DeprovisionParams extends Omit { + nThawRequests: bigint +} + +interface ReprovisionParams extends Omit { + newVerifier: string + nThawRequests: bigint +} + /* ////////////////////////////////////////////////////////////// STAKE MANAGEMENT ////////////////////////////////////////////////////////////// */ @@ -13,52 +39,31 @@ export async function stake( serviceProvider: SignerWithAddress, tokens: bigint, ): Promise { - const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) - const stakingContractBalanceBefore = await graphToken.balanceOf(horizonStaking.target) - - const approveTx = await graphToken.connect(serviceProvider).approve(horizonStaking.target, tokens) - await approveTx.wait() - + await approve(graphToken, serviceProvider, await horizonStaking.getAddress(), tokens) const stakeTx = await horizonStaking.connect(serviceProvider).stake(tokens) await stakeTx.wait() +} - // Verify tokens were transferred from service provider to horizon staking - const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) - expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore - tokens, 'Tokens were not transferred from service provider') - - // Verify tokens were transferred to horizon staking - const stakingContractBalanceAfter = await graphToken.balanceOf(horizonStaking.target) - expect(stakingContractBalanceAfter).to.equal(stakingContractBalanceBefore + tokens, 'Tokens were not transferred to horizon staking') +export async function stakeTo( + horizonStaking: HorizonStaking, + graphToken: IGraphToken, + signer: SignerWithAddress, + serviceProvider: SignerWithAddress, + tokens: bigint, +): Promise { + await approve(graphToken, signer, await horizonStaking.getAddress(), tokens) - // Verify service provider stake was updated - const serviceProviderStake = await horizonStaking.getStake(serviceProvider.address) - expect(serviceProviderStake).to.equal(tokens, 'Service provider stake was not updated') + const stakeToTx = await horizonStaking.connect(signer).stakeTo(serviceProvider.address, tokens) + await stakeToTx.wait() } export async function unstake( horizonStaking: HorizonStaking, - graphToken: IGraphToken, serviceProvider: SignerWithAddress, tokens: bigint, ): Promise { - const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) - const stakingContractBalanceBefore = await graphToken.balanceOf(horizonStaking.target) - const serviceProviderStakeBefore = await horizonStaking.getStake(serviceProvider.address) - const unstakeTx = await horizonStaking.connect(serviceProvider).unstake(tokens) await unstakeTx.wait() - - // Verify tokens were transferred to service provider - const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) - expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore + tokens, 'Tokens were not transferred to service provider') - - // Verify tokens were transferred from horizon staking contract - const stakingContractBalanceAfter = await graphToken.balanceOf(horizonStaking.target) - expect(stakingContractBalanceAfter).to.equal(stakingContractBalanceBefore - tokens, 'Tokens were not transferred from horizon staking contract') - - // Verify service provider stake was updated - const serviceProviderStakeAfterUnstake = await horizonStaking.getStake(serviceProvider.address) - expect(serviceProviderStakeAfterUnstake).to.equal(serviceProviderStakeBefore - tokens, 'Service provider stake was not updated') } export async function stakeToProvision( @@ -72,9 +77,6 @@ export async function stakeToProvision( const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) expect(provision.tokens).to.not.equal(0, 'Provision should exist') - const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) - const stakingContractBalanceBefore = await graphToken.balanceOf(horizonStaking.target) - const approveTx = await graphToken.connect(serviceProvider).approve(horizonStaking.target, tokens) await approveTx.wait() @@ -84,30 +86,23 @@ export async function stakeToProvision( tokens, ) await stakeToProvisionTx.wait() - - // Verify tokens were transferred from service provider - const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) - expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore - tokens, 'Tokens were not transferred from service provider') - - // Verify tokens were transferred to horizon staking - const stakingContractBalanceAfter = await graphToken.balanceOf(horizonStaking.target) - expect(stakingContractBalanceAfter).to.equal(stakingContractBalanceBefore + tokens, 'Tokens were not transferred to horizon staking') } /* //////////////////////////////////////////////////////////// PROVISION MANAGEMENT ////////////////////////////////////////////////////////////// */ -export async function provision( - horizonStaking: HorizonStaking, - serviceProvider: SignerWithAddress, - verifier: string, - tokens: bigint, - maxVerifierCut: number, - thawingPeriod: bigint, -): Promise { - const idleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) - const createProvisionTx = await horizonStaking.connect(serviceProvider).provision( +export async function createProvision({ + horizonStaking, + serviceProvider, + verifier, + tokens, + maxVerifierCut, + thawingPeriod, + signer, +}: CreateProvisionParams): Promise { + const effectiveSigner = signer || serviceProvider + const createProvisionTx = await horizonStaking.connect(effectiveSigner).provision( serviceProvider.address, verifier, tokens, @@ -121,18 +116,32 @@ export async function provision( expect(provision.tokens).to.equal(tokens, 'Provision tokens were not set') expect(provision.maxVerifierCut).to.equal(maxVerifierCut, 'Provision max verifier cut was not set') expect(provision.thawingPeriod).to.equal(thawingPeriod, 'Provision thawing period was not set') +} - // Verify idle stake was updated - const idleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) - expect(idleStakeAfter).to.equal(idleStakeBefore - tokens, 'Idle stake was not updated') +export async function addToProvision({ + horizonStaking, + serviceProvider, + verifier, + tokens, + signer, +}: ProvisionParams): Promise { + const effectiveSigner = signer || serviceProvider + const addToProvisionTx = await horizonStaking.connect(effectiveSigner).addToProvision( + serviceProvider.address, + verifier, + tokens, + ) + await addToProvisionTx.wait() } -export async function thaw( - horizonStaking: HorizonStaking, - serviceProvider: SignerWithAddress, - verifier: string, - tokens: bigint, -): Promise { +export async function thaw({ + horizonStaking, + serviceProvider, + verifier, + tokens, + signer, +}: ProvisionParams): Promise { + // Get provision state before thawing let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) const provisionTokensBefore = provision.tokens const provisionTokensThawingBefore = provision.tokensThawing @@ -140,8 +149,9 @@ export async function thaw( ? tokens : ((provision.sharesThawing * tokens + provision.tokensThawing - 1n) / provision.tokensThawing) - // Thaw tokens from provision - const thawTx = await horizonStaking.connect(serviceProvider).thaw( + // Thaw tokens + const effectiveSigner = signer || serviceProvider + const thawTx = await horizonStaking.connect(effectiveSigner).thaw( serviceProvider.address, verifier, tokens, @@ -160,156 +170,61 @@ export async function thaw( verifier, serviceProvider.address, ) + // Check the last thaw request we created const thawRequestId = thawRequestList.tail const thawRequest = await horizonStaking.getThawRequest( ThawRequestType.Provision, thawRequestId, ) - expect(thawRequest.shares).to.equal(expectedThawRequestShares, 'Thaw request shares were not set') -} -export async function addToProvision( - horizonStaking: HorizonStaking, - serviceProvider: SignerWithAddress, - verifier: string, - tokens: bigint, -): Promise { - const idleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) - let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) - const provisionTokensBefore = provision.tokens - - const addToProvisionTx = await horizonStaking.connect(serviceProvider).addToProvision( - serviceProvider.address, - verifier, - tokens, - ) - await addToProvisionTx.wait() - - // Verify tokens were added to provision - provision = await horizonStaking.getProvision(serviceProvider.address, verifier) - expect(provision.tokens).to.equal(provisionTokensBefore + tokens, 'Tokens were not added to provision') - - // Verify idle stake was updated - const idleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) - expect(idleStakeAfter).to.equal(idleStakeBefore - tokens, 'Idle stake was not updated') + expect(thawRequest.shares).to.equal(expectedThawRequestShares, 'Thaw request shares were not set') } -export async function deprovision( - horizonStaking: HorizonStaking, - serviceProvider: SignerWithAddress, - verifier: string, - nThawRequests: bigint, -): Promise { - let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) - const provisionTokensBefore = provision.tokens - const provisionTokensThawingBefore = provision.tokensThawing - - // Find the amount of tokens we are deprovisioning from thaw request shares - const tokensToDeprovision = await calculateTokensFromThawRequests( - horizonStaking, - serviceProvider, - verifier, - provision, - nThawRequests, - ) - - const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) - const deprovisionTx = await horizonStaking.connect(serviceProvider).deprovision( +export async function deprovision({ + horizonStaking, + serviceProvider, + verifier, + nThawRequests, + signer, +}: DeprovisionParams): Promise { + const effectiveSigner = signer || serviceProvider + const deprovisionTx = await horizonStaking.connect(effectiveSigner).deprovision( serviceProvider.address, verifier, nThawRequests, ) await deprovisionTx.wait() - - // Verify tokens were added to idle stake - const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) - expect(serviceProviderIdleStakeAfter).to.equal(serviceProviderIdleStakeBefore + tokensToDeprovision, 'Tokens were not added to idle stake') - - // Verify tokens were removed from provision - provision = await horizonStaking.getProvision(serviceProvider.address, verifier) - expect(provision.tokens).to.equal(provisionTokensBefore - tokensToDeprovision, 'Provision should be deprovisioned') - expect(provision.tokensThawing).to.equal(provisionTokensThawingBefore - tokensToDeprovision, 'Provision tokens thawing should be updated') } -export async function reprovision( - horizonStaking: HorizonStaking, - serviceProvider: SignerWithAddress, - oldVerifier: string, - newVerifier: string, - nThawRequests: bigint, -): Promise { - let oldVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, oldVerifier) - const oldVerifierProvisionTokens = oldVerifierProvision.tokens - const oldVerifierProvisionTokensThawing = oldVerifierProvision.tokensThawing - let newVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, newVerifier) - const newVerifierProvisionTokens = newVerifierProvision.tokens - - // Find the amount of tokens we are reprovisioning from thaw request shares - const tokensToReprovision = await calculateTokensFromThawRequests( - horizonStaking, - serviceProvider, - oldVerifier, - oldVerifierProvision, - nThawRequests, - ) - - const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) - const reprovisionTx = await horizonStaking.connect(serviceProvider).reprovision( +export async function reprovision({ + horizonStaking, + serviceProvider, + verifier: oldVerifier, + newVerifier, + nThawRequests, + signer, +}: ReprovisionParams): Promise { + const effectiveSigner = signer || serviceProvider + const reprovisionTx = await horizonStaking.connect(effectiveSigner).reprovision( serviceProvider.address, oldVerifier, newVerifier, nThawRequests, ) await reprovisionTx.wait() - - // Verify tokens were removed from oldVerifier provision - oldVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, oldVerifier) - expect(oldVerifierProvision.tokens).to.equal(oldVerifierProvisionTokens - tokensToReprovision, 'Old provision tokens were not updated') - expect(oldVerifierProvision.tokensThawing).to.equal(oldVerifierProvisionTokensThawing - tokensToReprovision, 'Old provision tokens thawing were not updated') - - // Verify tokens were added to newVerifier provision - newVerifierProvision = await horizonStaking.getProvision(serviceProvider.address, newVerifier) - expect(newVerifierProvision.tokens).to.equal(newVerifierProvisionTokens + tokensToReprovision, 'New provision tokens were not updated') - - // Verify tokens idle did not change - const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) - expect(serviceProviderIdleStakeAfter).to.equal(serviceProviderIdleStakeBefore, 'Tokens idle should not change') } /* //////////////////////////////////////////////////////////// HELPER FUNCTIONS ////////////////////////////////////////////////////////////// */ -async function calculateTokensFromThawRequests( - horizonStaking: HorizonStaking, - serviceProvider: SignerWithAddress, - verifier: string, - provision: { tokensThawing: bigint, sharesThawing: bigint }, - nThawRequests: bigint, -): Promise { - const thawRequestList = await horizonStaking.getThawRequestList( - ThawRequestType.Provision, - serviceProvider.address, - verifier, - serviceProvider.address, - ) - - // If nThawRequests is 0, process all thaw requests - if (nThawRequests == 0n) { - nThawRequests = thawRequestList.count - } - - // Calculate total tokens from thaw request shares - let totalTokens = 0n - let thawRequestId = thawRequestList.head - for (let i = 0; i < nThawRequests; i++) { - const thawRequest = await horizonStaking.getThawRequest( - ThawRequestType.Provision, - thawRequestId, - ) - totalTokens += (thawRequest.shares * provision.tokensThawing) / provision.sharesThawing - thawRequestId = thawRequest.next - } - return totalTokens +async function approve( + graphToken: IGraphToken, + signer: SignerWithAddress, + spender: string, + tokens: bigint, +): Promise { + const approveTx = await graphToken.connect(signer).approve(spender, tokens) + await approveTx.wait() } From 8d6fe67dd3e989a288379d928fc2d78508bff900 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Thu, 20 Feb 2025 17:27:54 -0300 Subject: [PATCH 05/23] chore: add delegators integration tests --- .../after-transition-period/delegator.test.ts | 363 ++++++++++++++++++ .../service-provider.test.ts | 11 +- .../test/integration/shared/staking.ts | 152 ++++++-- 3 files changed, 499 insertions(+), 27 deletions(-) create mode 100644 packages/horizon/test/integration/after-transition-period/delegator.test.ts diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts new file mode 100644 index 000000000..93b25790b --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -0,0 +1,363 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { + createProvision, + delegate, + redelegate, + stake, + undelegate, + withdrawDelegated, +} from '../shared/staking' + +describe('Delegator (after transition period)', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let delegator: SignerWithAddress + let serviceProvider: SignerWithAddress + let newServiceProvider: SignerWithAddress + let verifier: string + let newVerifier: string + + const maxVerifierCut = 1000000 + const thawingPeriod = 2419200 // 28 days + const tokens = ethers.parseEther('100000') + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + [serviceProvider, delegator, newServiceProvider] = await ethers.getSigners() + + verifier = await ethers.Wallet.createRandom().getAddress() + newVerifier = await ethers.Wallet.createRandom().getAddress() + + // Servide provider stake + await stake(horizonStaking, graphToken, serviceProvider, tokens) + + // Create provision + await createProvision({ + horizonStaking, + serviceProvider, + verifier, + tokens, + maxVerifierCut, + thawingPeriod, + }) + + // Send funds to delegator and new service provider + await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) + await graphToken.connect(serviceProvider).transfer(newServiceProvider.address, tokens) + }) + + it('should allow delegator to delegate to a service provider and verifier, undelegate and withdraw tokens', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationTokens = ethers.parseEther('1000') + + // Delegate tokens to the service provider and verifier + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens: delegationTokens, + minSharesOut: 0n, + }) + + // Verify delegation tokens were added to the delegation pool + const delegationPool = await horizonStaking.getDelegationPool( + serviceProvider.address, + verifier, + ) + expect(delegationPool.tokens).to.equal(delegationTokens, 'Delegation tokens were not added to the delegation pool') + + // Verify delegation shares were minted, since it's the first delegation + // shares should be equal to tokens + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + expect(delegation.shares).to.equal(delegationTokens, 'Delegation shares were not minted correctly') + + // Undelegate tokens + await undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares: delegationTokens, + }) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_mine', []) + + // Withdraw tokens + await withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests: BigInt(1), + }) + + // Delegator should have received their tokens back + expect(await graphToken.balanceOf(delegator.address)).to.equal(delegatorBalanceBefore, 'Delegator balance should be the same as before delegation') + }) + + it('should revert when delegating to an invalid provision', async () => { + const delegateTokens = ethers.parseEther('1000') + const invalidVerifier = await ethers.Wallet.createRandom().getAddress() + + await expect( + delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: invalidVerifier, + tokens: delegateTokens, + minSharesOut: 0n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidProvision') + }) + + it('should revert when delegating less than minimum delegation', async () => { + const minDelegation = ethers.parseEther('1') + + await expect( + delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens: minDelegation - 1n, + minSharesOut: 0n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientDelegationTokens') + }) + + describe('Delegation pool already exists', () => { + const newProvisionTokens = ethers.parseEther('10000') + const delegationPoolTokens = ethers.parseEther('1000') + + before(async () => { + // Delegate tokens to initialize the delegation pool + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens: delegationPoolTokens, + minSharesOut: 0n, + }) + + // Create new provision for a new service provider and verifier combo + await stake(horizonStaking, graphToken, newServiceProvider, newProvisionTokens) + await createProvision({ + horizonStaking, + serviceProvider: newServiceProvider, + verifier: newVerifier, + tokens: newProvisionTokens, + maxVerifierCut, + thawingPeriod, + }) + }) + + it('should allow delegator to undelegate and redelegate to new provider and verifier', async () => { + // Undelegate 20% of delegator's shares + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 5n + + await undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares: undelegateShares, + }) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_mine', []) + + await redelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + newServiceProvider, + newVerifier, + minSharesForNewProvider: 0n, + nThawRequests: BigInt(1), + }) + + // Verify delegation shares were transferred to the new service provider + const delegationPool = await horizonStaking.getDelegationPool( + newServiceProvider.address, + newVerifier, + ) + expect(delegationPool.tokens).to.equal(undelegateShares, 'Delegation tokens were not transferred to the new service provider') + + const newDelegation = await horizonStaking.getDelegation( + newServiceProvider.address, + newVerifier, + delegator.address, + ) + expect(newDelegation.shares).to.equal(undelegateShares, 'Delegation shares were not transferred to the new service provider') + }) + + it('should handle multiple undelegations with nThawRequests = 0', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationPool = await horizonStaking.getDelegationPool( + serviceProvider.address, + verifier, + ) + + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 10n + + let totalExpectedTokens = 0n + let remainingShares = delegation.shares + let remainingPoolTokens = delegationPool.tokens + + // Undelegate shares in 3 different transactions + for (let i = 0; i < 3; i++) { + const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares + totalExpectedTokens += tokensOut + + await undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares: undelegateShares, + }) + + remainingShares -= undelegateShares + remainingPoolTokens -= tokensOut + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_mine', []) + + // Withdraw all thaw requests + await withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests: BigInt(0), // Withdraw all + }) + + // Verify tokens were transferred to delegator + expect(await graphToken.balanceOf(delegator.address)) + .to.equal(delegatorBalanceBefore + totalExpectedTokens, 'Delegator balance should be the same as before delegation') + }) + + it('should handle multiple undelegations with nThawRequests = 1', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationPool = await horizonStaking.getDelegationPool( + serviceProvider.address, + verifier, + ) + + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 10n + + let totalExpectedTokens = 0n + let remainingShares = delegation.shares + let remainingPoolTokens = delegationPool.tokens + + // Undelegate shares in 3 different transactions + for (let i = 0; i < 3; i++) { + const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares + totalExpectedTokens += tokensOut + + await undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares: undelegateShares, + }) + + remainingShares -= undelegateShares + remainingPoolTokens -= tokensOut + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_mine', []) + + // Withdraw each thaw request individually + for (let i = 0; i < 3; i++) { + await withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests: BigInt(1), // Withdraw one thaw request at a time + }) + } + + // Verify tokens were transferred to delegator + expect(await graphToken.balanceOf(delegator.address)) + .to.equal(delegatorBalanceBefore + totalExpectedTokens, 'Delegator balance should be the same as before delegation') + }) + + it('should not revert when withdrawing before thawing period', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 10n + + await undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares: undelegateShares, + }) + + await expect( + withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests: BigInt(1), + }), + ).to.not.be.reverted + + // Verify tokens were not transferred to delegator + expect(await graphToken.balanceOf(delegator.address)) + .to.equal(delegatorBalanceBefore, 'Delegator balance should be the same as before delegation') + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index a8c4d2ed6..07339869f 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -4,7 +4,16 @@ import { expect } from 'chai' import { HorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' -import { addToProvision, createProvision, deprovision, reprovision, stake, stakeToProvision, thaw, unstake } from '../shared/staking' +import { + addToProvision, + createProvision, + deprovision, + reprovision, + stake, + stakeToProvision, + thaw, + unstake, +} from '../shared/staking' import { PaymentTypes } from '../utils/types' describe('HorizonStaking Integration Tests', () => { diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts index a51cf2d93..60858795a 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/horizon/test/integration/shared/staking.ts @@ -3,32 +3,6 @@ import { HorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { ThawRequestType } from '../utils/types' -/* ////////////////////////////////////////////////////////////// - INTERFACE DEFINITIONS -////////////////////////////////////////////////////////////// */ - -interface ProvisionParams { - horizonStaking: HorizonStaking - serviceProvider: SignerWithAddress - verifier: string - tokens: bigint - signer?: SignerWithAddress -} - -interface CreateProvisionParams extends ProvisionParams { - maxVerifierCut: number - thawingPeriod: number -} - -interface DeprovisionParams extends Omit { - nThawRequests: bigint -} - -interface ReprovisionParams extends Omit { - newVerifier: string - nThawRequests: bigint -} - /* ////////////////////////////////////////////////////////////// STAKE MANAGEMENT ////////////////////////////////////////////////////////////// */ @@ -92,6 +66,28 @@ export async function stakeToProvision( PROVISION MANAGEMENT ////////////////////////////////////////////////////////////// */ +interface ProvisionParams { + horizonStaking: HorizonStaking + serviceProvider: SignerWithAddress + verifier: string + tokens: bigint + signer?: SignerWithAddress +} + +interface CreateProvisionParams extends ProvisionParams { + maxVerifierCut: number + thawingPeriod: number +} + +interface DeprovisionParams extends Omit { + nThawRequests: bigint +} + +interface ReprovisionParams extends Omit { + newVerifier: string + nThawRequests: bigint +} + export async function createProvision({ horizonStaking, serviceProvider, @@ -215,6 +211,110 @@ export async function reprovision({ await reprovisionTx.wait() } +/* //////////////////////////////////////////////////////////// + DELEGATION +////////////////////////////////////////////////////////////// */ + +interface DelegationParams { + horizonStaking: HorizonStaking + delegator: SignerWithAddress + serviceProvider: SignerWithAddress + verifier: string +} + +interface DelegateParams extends DelegationParams { + graphToken: IGraphToken + tokens: bigint + minSharesOut: bigint +} + +export async function delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens, + minSharesOut, +}: DelegateParams): Promise { + // Approve horizon staking contract to pull tokens from delegator + await approve(graphToken, delegator, await horizonStaking.getAddress(), tokens) + + const delegateTx = await horizonStaking.connect(delegator)['delegate(address,address,uint256,uint256)']( + serviceProvider.address, + verifier, + tokens, + minSharesOut, + ) + await delegateTx.wait() +} + +interface UndelegateParams extends DelegationParams { + shares: bigint +} + +export async function undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares, +}: UndelegateParams): Promise { + const undelegateTx = await horizonStaking.connect(delegator)['undelegate(address,address,uint256)']( + serviceProvider.address, + verifier, + shares, + ) + await undelegateTx.wait() +} + +interface WithdrawDelegatedParams extends DelegationParams { + nThawRequests: bigint +} + +interface RedelegateParams extends DelegationParams { + newServiceProvider: SignerWithAddress + newVerifier: string + minSharesForNewProvider: bigint + nThawRequests: bigint +} + +export async function redelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + newServiceProvider, + newVerifier, + minSharesForNewProvider, + nThawRequests, +}: RedelegateParams): Promise { + const redelegateTx = await horizonStaking.connect(delegator).redelegate( + serviceProvider.address, + verifier, + newServiceProvider.address, + newVerifier, + minSharesForNewProvider, + nThawRequests, + ) + await redelegateTx.wait() +} + +export async function withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests, +}: WithdrawDelegatedParams): Promise { + const withdrawDelegatedTx = await horizonStaking.connect(delegator)['withdrawDelegated(address,address,uint256)']( + serviceProvider.address, + verifier, + nThawRequests, + ) + await withdrawDelegatedTx.wait() +} + /* //////////////////////////////////////////////////////////// HELPER FUNCTIONS ////////////////////////////////////////////////////////////// */ From 9a0bae75d1412cfbd924a9fa9cc264cee6c4ccf3 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Fri, 21 Feb 2025 10:01:02 -0300 Subject: [PATCH 06/23] chore: add to delegation pool integration tests --- .../add-to-delegation-pool.test.ts | 223 ++++++++++++++++++ .../after-transition-period/delegator.test.ts | 9 +- .../after-transition-period/operator.test.ts | 18 +- .../service-provider.test.ts | 16 +- .../test/integration/shared/staking.ts | 117 +++++++-- 5 files changed, 348 insertions(+), 35 deletions(-) create mode 100644 packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts diff --git a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts new file mode 100644 index 000000000..57f6a96fe --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts @@ -0,0 +1,223 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { + addToDelegationPool, + createProvision, + delegate, + slash, + stake, +} from '../shared/staking' + +describe('Add to delegation pool (after transition period)', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let governor: SignerWithAddress + let serviceProvider: SignerWithAddress + let delegator: SignerWithAddress + let signer: SignerWithAddress + let verifier: string + let slashingVerifier: SignerWithAddress + + const maxVerifierCut = 1000000 + const thawingPeriod = 2419200 // 28 days + const tokens = ethers.parseEther('100000') + const delegationTokens = ethers.parseEther('1000') + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + [serviceProvider, governor, delegator, signer, slashingVerifier] = await ethers.getSigners() + verifier = await ethers.Wallet.createRandom().getAddress() + + // Enable delegation slashing + await horizonStaking.connect(governor).setDelegationSlashingEnabled() + + // Service provider stake + await stake({ + horizonStaking, + graphToken, + serviceProvider, + tokens, + }) + + // Create provision + const provisionTokens = ethers.parseEther('1000') + await createProvision({ + horizonStaking, + serviceProvider, + verifier, + tokens: provisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Send funds to delegator and signer + await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) + await graphToken.connect(serviceProvider).transfer(signer.address, tokens) + + // Initialize delegation pool + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens: delegationTokens, + minSharesOut: 0n, + }) + }) + + it('should add tokens to an existing delegation pool', async () => { + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier) + const addTokens = ethers.parseEther('500') + + // Add tokens to the delegation pool + await addToDelegationPool({ + horizonStaking, + graphToken, + signer, + serviceProvider, + verifier, + tokens: addTokens, + }) + + // Verify tokens were added to the pool + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, verifier) + expect(poolAfter.tokens).to.equal(poolBefore.tokens + addTokens, 'Pool tokens should increase') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Pool shares should remain the same') + }) + + it('should revert when adding tokens to a non-existent provision', async () => { + const invalidVerifier = await ethers.Wallet.createRandom().getAddress() + const addTokens = ethers.parseEther('500') + + // Attempt to add tokens to a non-existent provision + await expect( + addToDelegationPool({ + horizonStaking, + graphToken, + signer, + serviceProvider, + verifier: invalidVerifier, + tokens: addTokens, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidProvision') + }) + + it('should revert when adding tokens to a provision with zero shares in delegation pool', async () => { + // Create new provision without any delegations + const newVerifier = await ethers.Wallet.createRandom().getAddress() + const newVerifierProvisionTokens = ethers.parseEther('1000') + await createProvision({ + horizonStaking, + serviceProvider, + verifier: newVerifier, + tokens: newVerifierProvisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Attempt to add tokens to the new provision + const addTokens = ethers.parseEther('500') + await expect( + addToDelegationPool({ + horizonStaking, + graphToken, + signer, + serviceProvider, + verifier: newVerifier, + tokens: addTokens, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPool') + }) + + it('should recover delegation pool from invalid state by adding tokens', async () => { + // Create a new provision for the slashing verifier + const slashingVerifierProvisionTokens = ethers.parseEther('1000') + await createProvision({ + horizonStaking, + serviceProvider, + verifier: slashingVerifier.address, + tokens: slashingVerifierProvisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Initialize delegation pool + const initialDelegation = ethers.parseEther('1000') + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: slashingVerifier.address, + tokens: initialDelegation, + minSharesOut: 0n, + }) + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) + + // Slash entire provision (service provider tokens + delegation pool tokens) + const slashTokens = slashingVerifierProvisionTokens + initialDelegation + const tokensVerifier = slashingVerifierProvisionTokens / 2n + await slash({ + horizonStaking, + verifier: slashingVerifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination: slashingVerifier.address, + }) + + // Log pool tokens after slashing + // const poolAfterSlashing = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) + // console.log('Pool tokens after slashing:', poolAfterSlashing.tokens.toString()) + + // Delegating should revert since pool.tokens == 0 and pool.shares != 0 + const delegateTokens = ethers.parseEther('500') + await expect( + delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: slashingVerifier.address, + tokens: delegateTokens, + minSharesOut: 0n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + + // Add tokens to the delegation pool to recover the pool + const recoverPoolTokens = ethers.parseEther('500') + await addToDelegationPool({ + horizonStaking, + graphToken, + signer, + serviceProvider, + verifier: slashingVerifier.address, + tokens: recoverPoolTokens, + }) + + // Verify delegation pool is recovered + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) + expect(poolAfter.tokens).to.equal(recoverPoolTokens, 'Pool tokens should be recovered') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Pool shares should remain the same') + + // Delegation should now succeed + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: slashingVerifier.address, + tokens: delegateTokens, + minSharesOut: 0n, + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts index 93b25790b..b01c6b8c1 100644 --- a/packages/horizon/test/integration/after-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -38,7 +38,7 @@ describe('Delegator (after transition period)', () => { newVerifier = await ethers.Wallet.createRandom().getAddress() // Servide provider stake - await stake(horizonStaking, graphToken, serviceProvider, tokens) + await stake({ horizonStaking, graphToken, serviceProvider, tokens }) // Create provision await createProvision({ @@ -162,7 +162,12 @@ describe('Delegator (after transition period)', () => { }) // Create new provision for a new service provider and verifier combo - await stake(horizonStaking, graphToken, newServiceProvider, newProvisionTokens) + await stake({ + horizonStaking, + graphToken, + serviceProvider: newServiceProvider, + tokens: newProvisionTokens, + }) await createProvision({ horizonStaking, serviceProvider: newServiceProvider, diff --git a/packages/horizon/test/integration/after-transition-period/operator.test.ts b/packages/horizon/test/integration/after-transition-period/operator.test.ts index dbca382f7..6754905ee 100644 --- a/packages/horizon/test/integration/after-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/operator.test.ts @@ -41,10 +41,16 @@ describe('Operator', () => { const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) // Operator stakes on behalf of service provider - await stakeTo(horizonStaking, graphToken, operator, serviceProvider, stakeTokens) + await stakeTo({ + horizonStaking, + graphToken, + signer: operator, + serviceProvider, + tokens: stakeTokens, + }) // Service provider unstakes - await unstake(horizonStaking, serviceProvider, stakeTokens) + await unstake({ horizonStaking, serviceProvider, tokens: stakeTokens }) // Verify tokens were removed from operator's address const operatorBalanceAfter = await graphToken.balanceOf(operator.address) @@ -80,7 +86,13 @@ describe('Operator', () => { before(async () => { const provisionTokens = ethers.parseEther('10000') // Operator stakes tokens to service provider - await stakeTo(horizonStaking, graphToken, operator, serviceProvider, provisionTokens) + await stakeTo({ + horizonStaking, + graphToken, + signer: operator, + serviceProvider, + tokens: provisionTokens, + }) // Operator creates provision await createProvision({ diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index 07339869f..94c887f1d 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -39,8 +39,8 @@ describe('HorizonStaking Integration Tests', () => { it('should allow staking tokens and unstake right after', async () => { const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) - await stake(horizonStaking, graphToken, serviceProvider, stakeAmount) - await unstake(horizonStaking, serviceProvider, stakeAmount) + await stake({ horizonStaking, graphToken, serviceProvider, tokens: stakeAmount }) + await unstake({ horizonStaking, serviceProvider, tokens: stakeAmount }) const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore, 'Service provider balance should not change') }) @@ -99,7 +99,7 @@ describe('HorizonStaking Integration Tests', () => { const createProvisionTokens = ethers.parseEther('10000') // Add idle stake - await stake(horizonStaking, graphToken, serviceProvider, tokensToStake) + await stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) // Create provision await createProvision({ @@ -118,7 +118,13 @@ describe('HorizonStaking Integration Tests', () => { // Add stake and provision on the same transaction const stakeToProvisionTokens = ethers.parseEther('100') - await stakeToProvision(horizonStaking, graphToken, serviceProvider, verifier, stakeToProvisionTokens) + await stakeToProvision({ + horizonStaking, + graphToken, + serviceProvider, + verifier, + tokens: stakeToProvisionTokens, + }) // Verify provision tokens were updated provision = await horizonStaking.getProvision(serviceProvider.address, verifier) @@ -170,7 +176,7 @@ describe('HorizonStaking Integration Tests', () => { await deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 1n }) // Unstake - await unstake(horizonStaking, serviceProvider, tokensToThaw) + await unstake({ horizonStaking, serviceProvider, tokens: tokensToThaw }) // Verify service provider balance increased by the unstake tokens const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts index 60858795a..1df62d4d8 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/horizon/test/integration/shared/staking.ts @@ -7,46 +7,63 @@ import { ThawRequestType } from '../utils/types' STAKE MANAGEMENT ////////////////////////////////////////////////////////////// */ -export async function stake( - horizonStaking: HorizonStaking, - graphToken: IGraphToken, - serviceProvider: SignerWithAddress, - tokens: bigint, -): Promise { +interface StakeParams { + horizonStaking: HorizonStaking + graphToken: IGraphToken + serviceProvider: SignerWithAddress + tokens: bigint +} + +export async function stake({ + horizonStaking, + graphToken, + serviceProvider, + tokens, +}: StakeParams): Promise { await approve(graphToken, serviceProvider, await horizonStaking.getAddress(), tokens) const stakeTx = await horizonStaking.connect(serviceProvider).stake(tokens) await stakeTx.wait() } -export async function stakeTo( - horizonStaking: HorizonStaking, - graphToken: IGraphToken, - signer: SignerWithAddress, - serviceProvider: SignerWithAddress, - tokens: bigint, -): Promise { +interface StakeToParams extends StakeParams { + signer: SignerWithAddress +} + +export async function stakeTo({ + horizonStaking, + graphToken, + signer, + serviceProvider, + tokens, +}: StakeToParams): Promise { await approve(graphToken, signer, await horizonStaking.getAddress(), tokens) const stakeToTx = await horizonStaking.connect(signer).stakeTo(serviceProvider.address, tokens) await stakeToTx.wait() } -export async function unstake( - horizonStaking: HorizonStaking, - serviceProvider: SignerWithAddress, - tokens: bigint, -): Promise { +interface UnstakeParams extends Omit {} + +export async function unstake({ + horizonStaking, + serviceProvider, + tokens, +}: UnstakeParams): Promise { const unstakeTx = await horizonStaking.connect(serviceProvider).unstake(tokens) await unstakeTx.wait() } -export async function stakeToProvision( - horizonStaking: HorizonStaking, - graphToken: IGraphToken, - serviceProvider: SignerWithAddress, - verifier: string, - tokens: bigint, -): Promise { +interface StakeToProvisionParams extends StakeParams { + verifier: string +} + +export async function stakeToProvision({ + horizonStaking, + graphToken, + serviceProvider, + verifier, + tokens, +}: StakeToProvisionParams): Promise { // Verify provision exists const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) expect(provision.tokens).to.not.equal(0, 'Provision should exist') @@ -62,6 +79,30 @@ export async function stakeToProvision( await stakeToProvisionTx.wait() } +interface SlashParams extends Omit { + verifier: SignerWithAddress + tokens: bigint + tokensVerifier: bigint + verifierDestination: string +} + +export async function slash({ + horizonStaking, + verifier, + serviceProvider, + tokens, + tokensVerifier, + verifierDestination, +}: SlashParams): Promise { + const slashTx = await horizonStaking.connect(verifier).slash( + serviceProvider.address, + tokens, + tokensVerifier, + verifierDestination, + ) + await slashTx.wait() +} + /* //////////////////////////////////////////////////////////// PROVISION MANAGEMENT ////////////////////////////////////////////////////////////// */ @@ -315,6 +356,32 @@ export async function withdrawDelegated({ await withdrawDelegatedTx.wait() } +interface AddToDelegationPoolParams extends Omit { + graphToken: IGraphToken + signer: SignerWithAddress + tokens: bigint +} + +export async function addToDelegationPool({ + horizonStaking, + graphToken, + signer, + serviceProvider, + verifier, + tokens, +}: AddToDelegationPoolParams): Promise { + // Approve horizon staking contract to pull tokens from delegator + await approve(graphToken, signer, await horizonStaking.getAddress(), tokens) + + // Add tokens to delegation pool + const addToDelegationPoolTx = await horizonStaking.connect(signer).addToDelegationPool( + serviceProvider.address, + verifier, + tokens, + ) + await addToDelegationPoolTx.wait() +} + /* //////////////////////////////////////////////////////////// HELPER FUNCTIONS ////////////////////////////////////////////////////////////// */ From b1c26c4c1c9d8fd043f95401757e922760f18770 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Fri, 21 Feb 2025 19:24:06 -0300 Subject: [PATCH 07/23] chore: working on e2e scripts --- .gitignore | 1 + packages/horizon/scripts/e2e | 79 +++++++++ packages/horizon/tasks/e2e.ts | 45 +++-- packages/horizon/tasks/transitions.ts | 23 +++ .../add-to-delegation-pool.test.ts | 159 ++++++++++++++++++ .../slashing.test.ts | 155 +++++++++++++++++ .../add-to-delegation-pool.test.ts | 93 +--------- .../after-transition-period/delegator.test.ts | 2 +- .../service-provider.test.ts | 2 +- .../after-transition-period/slashing.test.ts | 129 ++++++++++++++ .../during-transition-period/slashing.test.ts | 89 ++++++++++ .../test/integration/shared/staking.ts | 5 +- 12 files changed, 664 insertions(+), 118 deletions(-) create mode 100755 packages/horizon/scripts/e2e create mode 100644 packages/horizon/tasks/transitions.ts create mode 100644 packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts create mode 100644 packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/slashing.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/slashing.test.ts diff --git a/.gitignore b/.gitignore index 864406f29..598010c91 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Logs yarn-debug.log* yarn-error.log* +node.log # Dependency directories node_modules/ diff --git a/packages/horizon/scripts/e2e b/packages/horizon/scripts/e2e new file mode 100755 index 000000000..de62653e9 --- /dev/null +++ b/packages/horizon/scripts/e2e @@ -0,0 +1,79 @@ +#!/bin/bash + +set -eo pipefail + +# Check required env variables +if [ -z "$ARBITRUM_SEPOLIA_RPC" ]; then + echo "ARBITRUM_SEPOLIA_RPC environment variable is required" + exit 1 +fi + +if [ -z "$DEPLOYER_PRIVATE_KEY" ]; then + echo "DEPLOYER_PRIVATE_KEY environment variable is required" + exit 1 +fi + +if [ -z "$GOVERNOR_PRIVATE_KEY" ]; then + echo "GOVERNOR_PRIVATE_KEY environment variable is required" + exit 1 +fi + +echo "Starting e2e tests..." + +# Check if port 8545 is in use +if lsof -i:8545 > /dev/null 2>&1; then + echo "Error: Port 8545 is already in use" + exit 1 +fi + +# Start local hardhat node forked from Arbitrum Sepolia +echo "Starting local hardhat node..." +npx hardhat node --fork $ARBITRUM_SEPOLIA_RPC > node.log 2>&1 & +NODE_PID=$! + +# Wait for node to start +sleep 10 + +# Run migration steps +echo "Running migration steps..." + +# Step 1 - Deployer +echo "Step 1 - Deployer" +npx hardhat deploy:migrate --network localhost --step 1 + +# Step 2 - Governor +echo "Step 2 - Governor" +npx hardhat deploy:migrate --network localhost --step 2 --patch-config + +# Step 3 - Deployer +echo "Step 3 - Deployer" +npx hardhat deploy:migrate --network localhost --step 3 --patch-config + +# Step 4 - Governor +echo "Step 4 - Governor" +npx hardhat deploy:migrate --network localhost --step 4 --patch-config + +# Run integration tests - During transition period +echo "Running during-transition-period tests..." +npx hardhat test:integration --phase during-transition --network localhost + +# Clear thawing period +echo "Clearing thawing period..." +npx hardhat transition:clear-thawing + +# Run integration tests - After transition period +echo "Running after-transition-period tests..." +npx hardhat test:integration --phase after-transition --network localhost + +# Enable delegation slashing +echo "Enabling delegation slashing..." +npx hardhat transition:enable-delegation-slashing + +# Run integration tests - After delegation slashing enabled +echo "Running after-delegation-slashing tests..." +npx hardhat test:integration --phase after-delegation-slashing --network localhost + +# Cleanup +kill $NODE_PID + +echo "E2E tests completed successfully!" diff --git a/packages/horizon/tasks/e2e.ts b/packages/horizon/tasks/e2e.ts index d390b499d..4c867240c 100644 --- a/packages/horizon/tasks/e2e.ts +++ b/packages/horizon/tasks/e2e.ts @@ -3,30 +3,29 @@ import { task } from 'hardhat/config' import { glob } from 'glob' task('test:integration', 'Runs all integration tests') - .addOptionalParam('deployType', 'Chose between deploy or migrate. If not specified, skips deployment.') + .addParam( + 'phase', + 'Test phase to run: "during-transition", "after-transition", "after-delegation-slashing"', + ) .setAction(async (taskArgs, hre) => { - // Require hardhat or localhost network - if (hre.network.name !== 'hardhat' && hre.network.name !== 'localhost') { - throw new Error('Integration tests can only be run on the hardhat or localhost network') - } + // Get test files for each phase + const duringTransitionPeriodFiles = await glob('test/integration/during-transition-period/**/*.{js,ts}') + const afterTransitionPeriodFiles = await glob('test/integration/after-transition-period/**/*.{js,ts}') + const afterDelegationSlashingEnabledFiles = await glob('test/integration/after-delegation-slashing-enabled/**/*.{js,ts}') - // Handle deployment if mode is specified - if (taskArgs.deployType) { - switch (taskArgs.deployType.toLowerCase()) { - case 'deploy': - await hre.run('deploy:protocol') - break - default: - throw new Error('Invalid mode. Must be either deploy or migrate') - } + switch (taskArgs.phase) { + case 'during-transition': + await hre.run(TASK_TEST, { testFiles: duringTransitionPeriodFiles }) + break + case 'after-transition': + await hre.run(TASK_TEST, { testFiles: afterTransitionPeriodFiles }) + break + case 'after-delegation-slashing': + await hre.run(TASK_TEST, { testFiles: afterDelegationSlashingEnabledFiles }) + break + default: + throw new Error( + 'Invalid phase. Must be "during-transition", "after-transition", "after-delegation-slashing", or "all"', + ) } - - const testFiles = await glob('test/integration/**/*.{js,ts}') - - // Initialize graph config if not exists - hre.config.graph = hre.config.graph || {} - hre.config.graph.deployments = hre.config.graph.deployments || {} - hre.config.graph.deployments.horizon = './addresses-local.json' - - await hre.run(TASK_TEST, { testFiles: testFiles }) }) diff --git a/packages/horizon/tasks/transitions.ts b/packages/horizon/tasks/transitions.ts new file mode 100644 index 000000000..103db0ee1 --- /dev/null +++ b/packages/horizon/tasks/transitions.ts @@ -0,0 +1,23 @@ +import { task } from 'hardhat/config' + +task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') + .setAction(async (_, hre) => { + const [governor] = await hre.ethers.getSigners() + const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking + + console.log('Clearing thawing period...') + const tx = await horizonStaking.connect(governor).clearThawingPeriod() + await tx.wait() + console.log('Thawing period cleared') + }) + +task('transition:enable-delegation-slashing', 'Enables delegation slashing in HorizonStaking') + .setAction(async (_, hre) => { + const [governor] = await hre.ethers.getSigners() + const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking + + console.log('Enabling delegation slashing...') + const tx = await horizonStaking.connect(governor).setDelegationSlashingEnabled() + await tx.wait() + console.log('Delegation slashing enabled') + }) diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts new file mode 100644 index 000000000..208508adc --- /dev/null +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts @@ -0,0 +1,159 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { + addToDelegationPool, + createProvision, + delegate, + slash, + stake, +} from '../shared/staking' + +describe('Add to delegation pool', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let serviceProvider: SignerWithAddress + let delegator: SignerWithAddress + let signer: SignerWithAddress + let verifier: string + + const maxVerifierCut = 1000000 + const thawingPeriod = 2419200 // 28 days + const tokens = ethers.parseEther('100000') + const delegationTokens = ethers.parseEther('1000') + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + [serviceProvider, delegator, signer] = await ethers.getSigners() + verifier = await ethers.Wallet.createRandom().getAddress() + + // Service provider stake + await stake({ + horizonStaking, + graphToken, + serviceProvider, + tokens, + }) + + // Create provision + const provisionTokens = ethers.parseEther('1000') + await createProvision({ + horizonStaking, + serviceProvider, + verifier, + tokens: provisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Send funds to delegator and signer + await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) + await graphToken.connect(serviceProvider).transfer(signer.address, tokens) + + // Initialize delegation pool + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens: delegationTokens, + minSharesOut: 0n, + }) + }) + + it('should recover delegation pool from invalid state by adding tokens', async () => { + // Setup a new verifier + const newVerifier = ethers.Wallet.createRandom().connect(ethers.provider) + // Send eth to new verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: newVerifier.address, + value: ethers.parseEther('0.1'), + }) + + // Create a provision for the new verifier + const newVerifierProvisionTokens = ethers.parseEther('1000') + await createProvision({ + horizonStaking, + serviceProvider, + verifier: newVerifier.address, + tokens: newVerifierProvisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Initialize delegation pool + const initialDelegation = ethers.parseEther('1000') + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: newVerifier.address, + tokens: initialDelegation, + minSharesOut: 0n, + }) + + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, newVerifier.address) + + // Slash entire provision (service provider tokens + delegation pool tokens) + const slashTokens = newVerifierProvisionTokens + initialDelegation + const tokensVerifier = newVerifierProvisionTokens / 2n + await slash({ + horizonStaking, + verifier: newVerifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination: newVerifier.address, + }) + + // Delegating should revert since pool.tokens == 0 and pool.shares != 0 + const delegateTokens = ethers.parseEther('500') + await expect( + delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: newVerifier.address, + tokens: delegateTokens, + minSharesOut: 0n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + + // Add tokens to the delegation pool to recover the pool + const recoverPoolTokens = ethers.parseEther('500') + await addToDelegationPool({ + horizonStaking, + graphToken, + signer, + serviceProvider, + verifier: newVerifier.address, + tokens: recoverPoolTokens, + }) + + // Verify delegation pool is recovered + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, newVerifier.address) + expect(poolAfter.tokens).to.equal(recoverPoolTokens, 'Pool tokens should be recovered') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Pool shares should remain the same') + + // Delegation should now succeed + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: newVerifier.address, + tokens: delegateTokens, + minSharesOut: 0n, + }) + }) +}) diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts new file mode 100644 index 000000000..ca3863146 --- /dev/null +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts @@ -0,0 +1,155 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { HDNodeWallet } from 'ethers' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { + createProvision, + delegate, + slash, + stake, + undelegate, + withdrawDelegated, +} from '../shared/staking' + +describe('Slashing', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let serviceProvider: SignerWithAddress + let delegator: SignerWithAddress + let verifier: HDNodeWallet + let verifierDestination: string + + const maxVerifierCut = 1000000 // 100% + const thawingPeriod = 2419200 // 28 days + const provisionTokens = ethers.parseEther('10000') + const delegationTokens = ethers.parseEther('1000') + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + [serviceProvider, delegator] = await ethers.getSigners() + + // Send funds to delegator + await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens * 3n) + }) + + beforeEach(async () => { + verifier = ethers.Wallet.createRandom().connect(ethers.provider) + verifierDestination = await ethers.Wallet.createRandom().getAddress() + + // Create provision + await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) + await createProvision({ + horizonStaking, + serviceProvider, + verifier: verifier.address, + tokens: provisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Initialize delegation pool if it does not exist + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: verifier.address, + tokens: delegationTokens, + minSharesOut: 0n, + }) + + // Send eth to verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: verifier.address, + value: ethers.parseEther('0.1'), + }) + }) + + it('should slash service provider and delegation pool tokens', async () => { + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + const slashTokens = provisionBefore.tokens + poolBefore.tokens / 2n + const tokensVerifier = slashTokens / 2n + + // Slash the provision for all service provider and half of the delegation pool tokens + await slash({ + horizonStaking, + verifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination, + }) + + // Verify provision tokens should be slashed completely + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + expect(provisionAfter.tokens).to.be.equal(0, 'Provision tokens should be slashed completely') + + // Verify the remaining half of the delegation pool tokens are not slashed + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + expect(poolAfter.tokens).to.be.equal(poolBefore.tokens / 2n, 'Delegation pool tokens should be slashed') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Delegation pool shares should remain the same') + }) + + it('should handle delegation operations after complete provision is completely slashed', async () => { + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + const slashTokens = provisionBefore.tokens + poolBefore.tokens + const tokensVerifier = slashTokens / 2n + + // Slash the provision for all service provider and delegation pool tokens + await slash({ + horizonStaking, + verifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination, + }) + + const delegateAmount = ethers.parseEther('100') + const undelegateShares = ethers.parseEther('50') + + // Try to delegate to slashed pool + await expect( + delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: verifier.address, + tokens: delegateAmount, + minSharesOut: 0n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + + // Try to undelegate from slashed pool + await expect( + undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier: verifier.address, + shares: undelegateShares, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + + // Try to withdraw from slashed pool + await expect( + withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier: verifier.address, + nThawRequests: 1n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts index 57f6a96fe..ef389abbc 100644 --- a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts @@ -8,19 +8,16 @@ import { addToDelegationPool, createProvision, delegate, - slash, stake, } from '../shared/staking' -describe('Add to delegation pool (after transition period)', () => { +describe('Add to delegation pool', () => { let horizonStaking: HorizonStaking let graphToken: IGraphToken - let governor: SignerWithAddress let serviceProvider: SignerWithAddress let delegator: SignerWithAddress let signer: SignerWithAddress let verifier: string - let slashingVerifier: SignerWithAddress const maxVerifierCut = 1000000 const thawingPeriod = 2419200 // 28 days @@ -33,12 +30,9 @@ describe('Add to delegation pool (after transition period)', () => { horizonStaking = graph.horizon!.contracts.HorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken - [serviceProvider, governor, delegator, signer, slashingVerifier] = await ethers.getSigners() + [serviceProvider, delegator, signer] = await ethers.getSigners() verifier = await ethers.Wallet.createRandom().getAddress() - // Enable delegation slashing - await horizonStaking.connect(governor).setDelegationSlashingEnabled() - // Service provider stake await stake({ horizonStaking, @@ -137,87 +131,4 @@ describe('Add to delegation pool (after transition period)', () => { }), ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPool') }) - - it('should recover delegation pool from invalid state by adding tokens', async () => { - // Create a new provision for the slashing verifier - const slashingVerifierProvisionTokens = ethers.parseEther('1000') - await createProvision({ - horizonStaking, - serviceProvider, - verifier: slashingVerifier.address, - tokens: slashingVerifierProvisionTokens, - maxVerifierCut, - thawingPeriod, - }) - - // Initialize delegation pool - const initialDelegation = ethers.parseEther('1000') - await delegate({ - horizonStaking, - graphToken, - delegator, - serviceProvider, - verifier: slashingVerifier.address, - tokens: initialDelegation, - minSharesOut: 0n, - }) - const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) - - // Slash entire provision (service provider tokens + delegation pool tokens) - const slashTokens = slashingVerifierProvisionTokens + initialDelegation - const tokensVerifier = slashingVerifierProvisionTokens / 2n - await slash({ - horizonStaking, - verifier: slashingVerifier, - serviceProvider, - tokens: slashTokens, - tokensVerifier, - verifierDestination: slashingVerifier.address, - }) - - // Log pool tokens after slashing - // const poolAfterSlashing = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) - // console.log('Pool tokens after slashing:', poolAfterSlashing.tokens.toString()) - - // Delegating should revert since pool.tokens == 0 and pool.shares != 0 - const delegateTokens = ethers.parseEther('500') - await expect( - delegate({ - horizonStaking, - graphToken, - delegator, - serviceProvider, - verifier: slashingVerifier.address, - tokens: delegateTokens, - minSharesOut: 0n, - }), - ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') - - // Add tokens to the delegation pool to recover the pool - const recoverPoolTokens = ethers.parseEther('500') - await addToDelegationPool({ - horizonStaking, - graphToken, - signer, - serviceProvider, - verifier: slashingVerifier.address, - tokens: recoverPoolTokens, - }) - - // Verify delegation pool is recovered - const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) - expect(poolAfter.tokens).to.equal(recoverPoolTokens, 'Pool tokens should be recovered') - expect(poolAfter.shares).to.equal(poolBefore.shares, 'Pool shares should remain the same') - - // Delegation should now succeed - await delegate({ - horizonStaking, - graphToken, - delegator, - serviceProvider, - verifier: slashingVerifier.address, - tokens: delegateTokens, - minSharesOut: 0n, - }) - }) }) diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts index b01c6b8c1..06825f3d9 100644 --- a/packages/horizon/test/integration/after-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -13,7 +13,7 @@ import { withdrawDelegated, } from '../shared/staking' -describe('Delegator (after transition period)', () => { +describe('Delegator', () => { let horizonStaking: HorizonStaking let graphToken: IGraphToken let delegator: SignerWithAddress diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index 94c887f1d..aabd5e435 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -16,7 +16,7 @@ import { } from '../shared/staking' import { PaymentTypes } from '../utils/types' -describe('HorizonStaking Integration Tests', () => { +describe('Service provider', () => { let horizonStaking: HorizonStaking let graphToken: IGraphToken let verifier: string diff --git a/packages/horizon/test/integration/after-transition-period/slashing.test.ts b/packages/horizon/test/integration/after-transition-period/slashing.test.ts new file mode 100644 index 000000000..1363b74e8 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/slashing.test.ts @@ -0,0 +1,129 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { HDNodeWallet } from 'ethers' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { + createProvision, + delegate, + slash, + stake, + thaw, +} from '../shared/staking' + +describe('Slashing', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let serviceProvider: SignerWithAddress + let delegator: SignerWithAddress + let verifier: HDNodeWallet + let verifierDestination: string + + const maxVerifierCut = 1000000 // 100% + const thawingPeriod = 2419200 // 28 days + const provisionTokens = ethers.parseEther('10000') + const delegationTokens = ethers.parseEther('1000') + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + [serviceProvider, delegator] = await ethers.getSigners() + verifier = ethers.Wallet.createRandom().connect(ethers.provider) + verifierDestination = await ethers.Wallet.createRandom().getAddress() + + // Create provision + await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) + await createProvision({ + horizonStaking, + serviceProvider, + verifier: verifier.address, + tokens: provisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Send funds to delegator + await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens * 3n) + + // Initialize delegation pool if it does not exist + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: verifier.address, + tokens: delegationTokens, + minSharesOut: 0n, + }) + + // Send eth to verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: verifier.address, + value: ethers.parseEther('0.1'), + }) + }) + + it('should slash service provider tokens', async () => { + const slashTokens = ethers.parseEther('1000') + const tokensVerifier = slashTokens / 2n + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + const verifierDestinationBalanceBefore = await graphToken.balanceOf(verifierDestination) + + // Slash provision + await slash({ + horizonStaking, + verifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination, + }) + + // Verify provision tokens are reduced + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + expect(provisionAfter.tokens).to.equal(provisionBefore.tokens - slashTokens, 'Provision tokens should be reduced') + + // Verify verifier destination received the tokens + const verifierDestinationBalanceAfter = await graphToken.balanceOf(verifierDestination) + expect(verifierDestinationBalanceAfter).to.equal(verifierDestinationBalanceBefore + tokensVerifier, 'Verifier destination should receive the tokens') + }) + + it('should slash service provider tokens when tokens are thawing', async () => { + // Start thawing + const thawTokens = ethers.parseEther('1000') + await thaw({ + horizonStaking, + serviceProvider, + verifier: verifier.address, + tokens: thawTokens, + }) + + const slashTokens = ethers.parseEther('500') + const tokensVerifier = slashTokens / 2n + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + const verifierDestinationBalanceBefore = await graphToken.balanceOf(verifierDestination) + + // Slash provision + await slash({ + horizonStaking, + verifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination, + }) + + // Verify provision tokens are reduced + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + expect(provisionAfter.tokens).to.equal(provisionBefore.tokens - slashTokens, 'Provision tokens should be reduced') + + // Verify verifier destination received the tokens + const verifierDestinationBalanceAfter = await graphToken.balanceOf(verifierDestination) + expect(verifierDestinationBalanceAfter).to.equal(verifierDestinationBalanceBefore + tokensVerifier, 'Verifier destination should receive the tokens') + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/slashing.test.ts b/packages/horizon/test/integration/during-transition-period/slashing.test.ts new file mode 100644 index 000000000..117aa5c77 --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/slashing.test.ts @@ -0,0 +1,89 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { + createProvision, + delegate, + slash, + stake, +} from '../shared/staking' + +describe('Slashing', () => { + let horizonStaking: HorizonStaking + let graphToken: IGraphToken + let serviceProvider: SignerWithAddress + let delegator: SignerWithAddress + let verifier: SignerWithAddress + let verifierDestination: string + + const maxVerifierCut = 1000000 // 100% + const thawingPeriod = 2419200 // 28 days + const provisionTokens = ethers.parseEther('10000') + const delegationTokens = ethers.parseEther('1000') + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + // Verify delegation slashing is disabled + expect(await horizonStaking.isDelegationSlashingEnabled()).to.be.equal(false, 'Delegation slashing should be disabled') + + ;[serviceProvider, delegator, verifier] = await ethers.getSigners() + verifierDestination = await ethers.Wallet.createRandom().getAddress() + + // Service provider stake and create provision + await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) + await createProvision({ + horizonStaking, + serviceProvider, + verifier: verifier.address, + tokens: provisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Send funds to delegator + await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens) + + // Initialize delegation pool + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: verifier.address, + tokens: delegationTokens, + minSharesOut: 0n, + }) + }) + + it('should only slash service provider when delegation slashing is disabled', async () => { + const slashTokens = provisionTokens + delegationTokens + const tokensVerifier = slashTokens / 2n + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + + // Slash the provision for all service provider and delegation pool tokens + await slash({ + horizonStaking, + verifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination, + }) + + // Verify provision tokens were completely slashed + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + expect(provisionAfter.tokens).to.be.equal(0, 'Provision tokens should be slashed completely') + + // Verify delegation pool tokens are not reduced + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + expect(poolAfter.tokens).to.equal(poolBefore.tokens, 'Delegation pool tokens should not be reduced') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Delegation pool shares should remain the same') + }) +}) diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts index 1df62d4d8..86a9b757d 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/horizon/test/integration/shared/staking.ts @@ -2,6 +2,7 @@ import { expect } from 'chai' import { HorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { ThawRequestType } from '../utils/types' +import { HDNodeWallet } from 'ethers' /* ////////////////////////////////////////////////////////////// STAKE MANAGEMENT @@ -66,7 +67,7 @@ export async function stakeToProvision({ }: StakeToProvisionParams): Promise { // Verify provision exists const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) - expect(provision.tokens).to.not.equal(0, 'Provision should exist') + expect(provision.createdAt).to.not.equal(0n, 'Provision should exist') const approveTx = await graphToken.connect(serviceProvider).approve(horizonStaking.target, tokens) await approveTx.wait() @@ -80,7 +81,7 @@ export async function stakeToProvision({ } interface SlashParams extends Omit { - verifier: SignerWithAddress + verifier: SignerWithAddress | HDNodeWallet tokens: bigint tokensVerifier: bigint verifierDestination: string From a727158efebec04e9ba17e975b07e0321c487a76 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Mon, 10 Mar 2025 16:52:49 +0000 Subject: [PATCH 08/23] chore: added pre horizon upgrade state setup scripts --- .../src/sdk/hardhat.base.config.ts | 9 +- .../hardhat-graph-protocol/src/sdk/index.ts | 3 +- .../ignition/configs/migrate.e2e-test.json5 | 50 +++ packages/horizon/package.json | 3 +- packages/horizon/scripts/e2e | 79 ----- packages/horizon/scripts/e2e/e2e | 106 ++++++ .../scripts/e2e/fixtures/delegators.ts | 58 ++++ .../horizon/scripts/e2e/fixtures/indexers.ts | 93 +++++ packages/horizon/scripts/e2e/pre-upgrade.ts | 203 +++++++++++ .../horizon/scripts/e2e/transfer-ownership.ts | 92 +++++ packages/horizon/tasks/deploy.ts | 20 +- packages/horizon/tasks/e2e.ts | 46 ++- packages/horizon/tasks/transitions.ts | 59 +++- .../add-to-delegation-pool.test.ts | 15 +- .../slashing.test.ts | 10 +- .../add-to-delegation-pool.test.ts | 6 +- .../after-transition-period/delegator.test.ts | 18 +- .../after-transition-period/operator.test.ts | 6 +- .../service-provider.test.ts | 6 +- .../after-transition-period/slashing.test.ts | 62 +++- .../delegator.test.ts | 0 .../service-provider.test.ts | 318 ++++++++++++++++++ .../during-transition-period/slashing.test.ts | 89 ----- .../test/integration/shared/staking.ts | 18 +- .../integration/shared/stakingExtension.ts | 43 +++ .../unit/staking/allocation/collect.t.sol | 2 +- packages/sdk/src/utils/index.ts | 1 + 27 files changed, 1193 insertions(+), 222 deletions(-) create mode 100644 packages/horizon/ignition/configs/migrate.e2e-test.json5 delete mode 100755 packages/horizon/scripts/e2e create mode 100755 packages/horizon/scripts/e2e/e2e create mode 100644 packages/horizon/scripts/e2e/fixtures/delegators.ts create mode 100644 packages/horizon/scripts/e2e/fixtures/indexers.ts create mode 100644 packages/horizon/scripts/e2e/pre-upgrade.ts create mode 100644 packages/horizon/scripts/e2e/transfer-ownership.ts create mode 100644 packages/horizon/test/integration/during-transition-period/delegator.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/service-provider.test.ts delete mode 100644 packages/horizon/test/integration/during-transition-period/slashing.test.ts create mode 100644 packages/horizon/test/integration/shared/stakingExtension.ts diff --git a/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts index 048ae999a..5e23a44c7 100644 --- a/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts +++ b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts @@ -76,9 +76,12 @@ export const networksUserConfig: BaseNetworksUserConfig = { secureAccounts: { enabled: true, }, - ...(vars.has('LOCALHOST_ACCOUNTS_MNEMONIC') && { - accounts: { mnemonic: vars.get('LOCALHOST_ACCOUNTS_MNEMONIC') }, - }), + ...(vars.has('FORK') && vars.get('FORK') === 'true' + ? { accounts: 'remote' } + : vars.has('LOCALHOST_ACCOUNTS_MNEMONIC') + ? { accounts: { mnemonic: vars.get('LOCALHOST_ACCOUNTS_MNEMONIC') } } + : {} + ), deployments: { horizon: resolveAddressBook('@graphprotocol/horizon/addresses.json', 'localhost'), subgraphService: resolveAddressBook('@graphprotocol/subgraph-service/addresses.json', 'localhost'), diff --git a/packages/hardhat-graph-protocol/src/sdk/index.ts b/packages/hardhat-graph-protocol/src/sdk/index.ts index 4bdc82681..8faedb77a 100644 --- a/packages/hardhat-graph-protocol/src/sdk/index.ts +++ b/packages/hardhat-graph-protocol/src/sdk/index.ts @@ -1,5 +1,6 @@ import { loadConfig, patchConfig, saveToAddressBook } from './ignition/ignition' import { hardhatBaseConfig } from './hardhat.base.config' +import { mergeABIs } from './utils/abi' const IgnitionHelper = { saveToAddressBook, loadConfig, patchConfig } -export { hardhatBaseConfig, IgnitionHelper } +export { hardhatBaseConfig, IgnitionHelper, mergeABIs } diff --git a/packages/horizon/ignition/configs/migrate.e2e-test.json5 b/packages/horizon/ignition/configs/migrate.e2e-test.json5 new file mode 100644 index 000000000..6a3b6df23 --- /dev/null +++ b/packages/horizon/ignition/configs/migrate.e2e-test.json5 @@ -0,0 +1,50 @@ +{ + "$global": { + // Accounts + "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", + + // Addresses for contracts deployed in the original Graph Protocol + "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "horizonStakingAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "epochManagerAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "graphTokenAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "graphTokenGatewayAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", + "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + + // Must be set for step 3 and 4 of the migration + "subgraphServiceAddress": "", + + // Parameters + "maxThawingPeriod": 2419200 + }, + "GraphPayments": { + "protocolPaymentCut": 10000 + }, + "PaymentsEscrow": { + "withdrawEscrowThawingPeriod": 10000 + }, + "GraphTallyCollector": { + "eip712Name": "GraphTallyCollector", + "eip712Version": "1", + "revokeSignerThawingPeriod": 10000 + }, + "HorizonProxiesGovernor": { + // Must be set for step 2 of the migration + "graphPaymentsAddress": "", + "paymentsEscrowAddress": "" + }, + "HorizonStakingGovernor": { + // Must be set for step 4 of the migration + "horizonStakingImplementationAddress": "" + }, + "L2CurationGovernor": { + // Must be set for step 4 of the migration + "curationImplementationAddress": "" + }, + "RewardsManagerGovernor": { + // Must be set for step 4 of the migration + "rewardsManagerImplementationAddress": "" + } +} diff --git a/packages/horizon/package.json b/packages/horizon/package.json index e59e40e02..33d291671 100644 --- a/packages/horizon/package.json +++ b/packages/horizon/package.json @@ -21,7 +21,8 @@ "build": "BUILD_RUN=true hardhat compile", "test": "forge test", "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test", - "test:integration": "hardhat test:integration --deploy-type deploy" + "test:integration": "hardhat test:integration --deploy-type deploy", + "test:e2e": "./scripts/e2e/e2e" }, "devDependencies": { "@defi-wonderland/natspec-smells": "^1.1.6", diff --git a/packages/horizon/scripts/e2e b/packages/horizon/scripts/e2e deleted file mode 100755 index de62653e9..000000000 --- a/packages/horizon/scripts/e2e +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -# Check required env variables -if [ -z "$ARBITRUM_SEPOLIA_RPC" ]; then - echo "ARBITRUM_SEPOLIA_RPC environment variable is required" - exit 1 -fi - -if [ -z "$DEPLOYER_PRIVATE_KEY" ]; then - echo "DEPLOYER_PRIVATE_KEY environment variable is required" - exit 1 -fi - -if [ -z "$GOVERNOR_PRIVATE_KEY" ]; then - echo "GOVERNOR_PRIVATE_KEY environment variable is required" - exit 1 -fi - -echo "Starting e2e tests..." - -# Check if port 8545 is in use -if lsof -i:8545 > /dev/null 2>&1; then - echo "Error: Port 8545 is already in use" - exit 1 -fi - -# Start local hardhat node forked from Arbitrum Sepolia -echo "Starting local hardhat node..." -npx hardhat node --fork $ARBITRUM_SEPOLIA_RPC > node.log 2>&1 & -NODE_PID=$! - -# Wait for node to start -sleep 10 - -# Run migration steps -echo "Running migration steps..." - -# Step 1 - Deployer -echo "Step 1 - Deployer" -npx hardhat deploy:migrate --network localhost --step 1 - -# Step 2 - Governor -echo "Step 2 - Governor" -npx hardhat deploy:migrate --network localhost --step 2 --patch-config - -# Step 3 - Deployer -echo "Step 3 - Deployer" -npx hardhat deploy:migrate --network localhost --step 3 --patch-config - -# Step 4 - Governor -echo "Step 4 - Governor" -npx hardhat deploy:migrate --network localhost --step 4 --patch-config - -# Run integration tests - During transition period -echo "Running during-transition-period tests..." -npx hardhat test:integration --phase during-transition --network localhost - -# Clear thawing period -echo "Clearing thawing period..." -npx hardhat transition:clear-thawing - -# Run integration tests - After transition period -echo "Running after-transition-period tests..." -npx hardhat test:integration --phase after-transition --network localhost - -# Enable delegation slashing -echo "Enabling delegation slashing..." -npx hardhat transition:enable-delegation-slashing - -# Run integration tests - After delegation slashing enabled -echo "Running after-delegation-slashing tests..." -npx hardhat test:integration --phase after-delegation-slashing --network localhost - -# Cleanup -kill $NODE_PID - -echo "E2E tests completed successfully!" diff --git a/packages/horizon/scripts/e2e/e2e b/packages/horizon/scripts/e2e/e2e new file mode 100755 index 000000000..2ebf663e9 --- /dev/null +++ b/packages/horizon/scripts/e2e/e2e @@ -0,0 +1,106 @@ +#!/bin/bash + +set -eo pipefail + +# Save original environment variable values +ORIGINAL_HARDHAT_FORK=${HARDHAT_FORK:-""} +ORIGINAL_SECURE_ACCOUNTS_DISABLE_PROVIDER=${SECURE_ACCOUNTS_DISABLE_PROVIDER:-""} + +# Set environment variables for this script +export HARDHAT_FORK=true +export SECURE_ACCOUNTS_DISABLE_PROVIDER=true + +# Function to cleanup resources +cleanup() { + # Remove ignition deployment files + echo "Removing ignition deployment files..." + rm -rf ignition/deployments/horizon-localhost + + # Kill hardhat node only if we started it + if [ ! -z "$NODE_PID" ] && [ "$STARTED_NODE" = true ]; then + echo "Cleaning up node process..." + kill $NODE_PID 2>/dev/null || true + fi + + # Restore original environment variables + echo "Restoring original environment variables..." + if [ -z "$ORIGINAL_HARDHAT_FORK" ]; then + unset HARDHAT_FORK + else + export HARDHAT_FORK="$ORIGINAL_HARDHAT_FORK" + fi + + if [ -z "$ORIGINAL_SECURE_ACCOUNTS_DISABLE_PROVIDER" ]; then + unset SECURE_ACCOUNTS_DISABLE_PROVIDER + else + export SECURE_ACCOUNTS_DISABLE_PROVIDER="$ORIGINAL_SECURE_ACCOUNTS_DISABLE_PROVIDER" + fi +} + +# Set trap to call cleanup function on script exit (normal or error) +trap cleanup EXIT + +# Check required env variables +if [ -z "$ARBITRUM_SEPOLIA_RPC" ]; then + echo "ARBITRUM_SEPOLIA_RPC environment variable is required" + exit 1 +fi + +echo "Starting e2e tests..." + +# Check if hardhat node is already running on port 8545 +STARTED_NODE=false +if lsof -i:8545 > /dev/null 2>&1; then + echo "Hardhat node already running on port 8545, using existing node" + # Get the PID of the process using port 8545 + NODE_PID=$(lsof -t -i:8545) +else + # Start local hardhat node forked from Arbitrum Sepolia + echo "Starting local hardhat node..." + npx hardhat node --fork $ARBITRUM_SEPOLIA_RPC > node.log 2>&1 & + NODE_PID=$! + STARTED_NODE=true + + # Wait for node to start + sleep 10 +fi + +# Setup pre horizon migration state needed for the e2e tests +npx hardhat run ./scripts/e2e/pre-upgrade.ts --network localhost + +# Transfer ownership of protocol to hardhat signer 1 +npx hardhat run ./scripts/e2e/transfer-ownership.ts --network localhost + +# Step 1 - Deployer +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 1 --signer-index 0 + +# Step 2 - Governor +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 2 --patch-config --signer-index 1 --hide-banner + +# Step 3 - Deployer +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 3 --patch-config --signer-index 0 --hide-banner + +# Step 4 - Governor +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 4 --patch-config --signer-index 1 --hide-banner + +# Unset subgraph service +npx hardhat transition:unset-subgraph-service --network localhost --governor-index 1 + +# Run integration tests - During transition period +npx hardhat test:integration --phase during-transition-period --network localhost + +# Clear thawing period +npx hardhat transition:clear-thawing --network localhost --governor-index 1 + +# Run integration tests - After transition period +npx hardhat test:integration --phase after-transition-period --network localhost + +# Enable delegation slashing +npx hardhat transition:enable-delegation-slashing --network localhost --governor-index 1 + +# Run integration tests - After delegation slashing enabled +npx hardhat test:integration --phase after-delegation-slashing-enabled --network localhost + +echo "" +echo "πŸŽ‰ ✨ πŸš€ βœ… E2E tests completed successfully! πŸŽ‰ ✨ πŸš€ βœ…" +echo "" \ No newline at end of file diff --git a/packages/horizon/scripts/e2e/fixtures/delegators.ts b/packages/horizon/scripts/e2e/fixtures/delegators.ts new file mode 100644 index 000000000..6dfe7f882 --- /dev/null +++ b/packages/horizon/scripts/e2e/fixtures/delegators.ts @@ -0,0 +1,58 @@ +import { parseEther } from 'ethers' +import { indexers } from './indexers' + +export interface Delegator { + address: string + delegations: { + indexerAddress: string + tokens: bigint + }[] + undelegate: boolean // Whether this delegator should undelegate at the end +} + +export const delegators: Delegator[] = [ + { + address: '0x610Bb1573d1046FCb8A70Bbbd395754cD57C2b60', // Hardhat account #10 + delegations: [ + { + indexerAddress: indexers[0].address, + tokens: parseEther('50000'), + }, + { + indexerAddress: indexers[1].address, + tokens: parseEther('25000'), + } + ], + undelegate: false, + }, + { + address: '0x855FA758c77D68a04990E992aA4dcdeF899F654A', // Hardhat account #11 + delegations: [ + { + indexerAddress: indexers[1].address, + tokens: parseEther('75000'), + } + ], + undelegate: false, + }, + { + address: '0xfA2435Eacf10Ca62ae6787ba2fB044f8733Ee843', // Hardhat account #12 + delegations: [ + { + indexerAddress: indexers[0].address, + tokens: parseEther('100000'), + } + ], + undelegate: true, // This delegator will undelegate + }, + { + address: '0x64E078A8Aa15A41B85890265648e965De686bAE6', // Hardhat account #13 + delegations: [], + undelegate: false, + }, + { + address: '0x2F560290FEF1B3Ada194b6aA9c40aa71f8e95598', // Hardhat account #14 + delegations: [], + undelegate: false, + } +] \ No newline at end of file diff --git a/packages/horizon/scripts/e2e/fixtures/indexers.ts b/packages/horizon/scripts/e2e/fixtures/indexers.ts new file mode 100644 index 000000000..6d10b17d8 --- /dev/null +++ b/packages/horizon/scripts/e2e/fixtures/indexers.ts @@ -0,0 +1,93 @@ +import { parseEther } from 'ethers' + +// Indexer interface +export interface Indexer { + address: string + stake: bigint + tokensToUnstake?: bigint + indexingRewardCut: number + queryFeeCut: number + rewardsDestination?: string + allocations: Allocation[] +} + +// Allocation interface +export interface Allocation { + allocationID: string + allocationPrivateKey: string + subgraphDeploymentID: string + tokens: bigint +} + +// Indexer one data +const INDEXER_ONE_ADDRESS = '0x95cED938F7991cd0dFcb48F0a06a40FA1aF46EBC' // Hardhat account #5 +const INDEXER_ONE_FIRST_ALLOCATION_ID = '0x70043e424171076D74a1f6a6a56087Bb4c7A61AA' +const INDEXER_ONE_FIRST_ALLOCATION_PRIVATE_KEY = '0x9c41bca4eb319bdf4cac23ae3366eed5f9fa12eb05c0ef29319afcfaa3fc2d79' +const INDEXER_ONE_SECOND_ALLOCATION_ID = '0xd67CE7F6A2eCa6fD78A7E2A5C5e56Fb821BEdE0c' +const INDEXER_ONE_SECOND_ALLOCATION_PRIVATE_KEY = '0x827a0b66fbeb3fefb4a99b6ba0b4bea3b8dd590b97fa7a1bbe74e5b33c935f16' +const INDEXER_ONE_THIRD_ALLOCATION_ID = '0x212e51125e4Ed4C2041614b139eC6cb8FA6d561C' +const INDEXER_ONE_THIRD_ALLOCATION_PRIVATE_KEY = '0x434f1d4435e978299ec64841153c25af2f611a145da3e8539c65b9bd5d9c08b5' + +// Indexer two data +const INDEXER_TWO_ADDRESS = '0x3E5e9111Ae8eB78Fe1CC3bb8915d5D461F3Ef9A9' // Hardhat account #6 +const INDEXER_TWO_REWARDS_DESTINATION = '0x227A35f9912693240E842FaAB6cf5e4E6371ff63' +const INDEXER_TWO_FIRST_ALLOCATION_ID = '0xD0EAc83b0bf328bbf68F4f1a1480e17A38BFb192' +const INDEXER_TWO_FIRST_ALLOCATION_PRIVATE_KEY = '0x80ff89a67cf4b41ea3ece2574b7212b5fee43c0fa370bf3e188a645b561ac810' +const INDEXER_TWO_SECOND_ALLOCATION_ID = '0x63280ec9EA63859b7e2041f07a549F311C86B3bd' +const INDEXER_TWO_SECOND_ALLOCATION_PRIVATE_KEY = '0xab6cb9dbb3646a856e6cac2c0e2a59615634e93cde11385eb6c6ba58e2873a46' + +// Subgraph deployment IDs +const SUBGRAPH_DEPLOYMENT_ID_ONE = '0x02cd85012c1f075fd58fad178fd23ab841d3b5ddcf5cd3377c30118da97cb2a4' +const SUBGRAPH_DEPLOYMENT_ID_TWO = '0x03ca89485a59894f1acfa34660c69024b6b90ce45171dece7662b0886bc375c7' +const SUBGRAPH_DEPLOYMENT_ID_THREE = '0x0472e8c46f728adb65a22187c6740532f82c2ebadaeabbbe59a2bb4a1bdde197' + +export const indexers: Indexer[] = [ + { + address: INDEXER_ONE_ADDRESS, + stake: parseEther('1000000'), + tokensToUnstake: parseEther('10000'), + indexingRewardCut: 900000, // 90% + queryFeeCut: 900000, // 90% + allocations: [ + { + allocationID: INDEXER_ONE_FIRST_ALLOCATION_ID, + allocationPrivateKey: INDEXER_ONE_FIRST_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_ONE, + tokens: parseEther('400000'), + }, + { + allocationID: INDEXER_ONE_SECOND_ALLOCATION_ID, + allocationPrivateKey: INDEXER_ONE_SECOND_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_TWO, + tokens: parseEther('300000'), + }, + { + allocationID: INDEXER_ONE_THIRD_ALLOCATION_ID, + allocationPrivateKey: INDEXER_ONE_THIRD_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_THREE, + tokens: parseEther('250000'), + }, + ], + }, + { + address: INDEXER_TWO_ADDRESS, + stake: parseEther('1000000'), + indexingRewardCut: 850000, // 85% + queryFeeCut: 850000, // 85% + rewardsDestination: INDEXER_TWO_REWARDS_DESTINATION, + allocations: [ + { + allocationID: INDEXER_TWO_FIRST_ALLOCATION_ID, + allocationPrivateKey: INDEXER_TWO_FIRST_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_ONE, + tokens: parseEther('400000'), + }, + { + allocationID: INDEXER_TWO_SECOND_ALLOCATION_ID, + allocationPrivateKey: INDEXER_TWO_SECOND_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_TWO, + tokens: parseEther('200000'), + }, + ], + }, +] diff --git a/packages/horizon/scripts/e2e/pre-upgrade.ts b/packages/horizon/scripts/e2e/pre-upgrade.ts new file mode 100644 index 000000000..bed544f86 --- /dev/null +++ b/packages/horizon/scripts/e2e/pre-upgrade.ts @@ -0,0 +1,203 @@ +import hre, { ethers } from 'hardhat' +import { Contract } from 'ethers' +import { mergeABIs } from 'hardhat-graph-protocol/sdk' +import { indexers } from './fixtures/indexers' +import { delegators } from './fixtures/delegators' + +import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' + +import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' +import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' +import L2GraphTokenABI from '@graphprotocol/contracts/build/abis/L2GraphToken.json' + +import { IGraphToken, IStaking } from '@graphprotocol/contracts' + +// The account on Arbitrum Sepolia that has GRT tokens +const GRT_HOLDER_ADDRESS = process.env.GRT_HOLDER_ADDRESS || '0xadE6B8EB69a49B56929C1d4F4b428d791861dB6f' + +// Load ABIs +const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) +const graphTokenABI = L2GraphTokenABI + +// Generate allocation proof with the indexer's address and the allocation id, signed by the allocation private key +function generateAllocationProof(indexerAddress: string, allocationPrivateKey: string) { + const wallet = new ethers.Wallet(allocationPrivateKey) + const messageHash = ethers.solidityPackedKeccak256( + ['address', 'address'], + [indexerAddress, wallet.address], + ) + const messageHashBytes = ethers.getBytes(messageHash) + return wallet.signMessage(messageHashBytes) +} + +const randomHexBytes = (n = 32): string => ethers.hexlify(ethers.randomBytes(n)) + +async function main() { + console.log(getBanner()) + + console.log('\n--- STEP 0: Setup ---') + + // Verify that hardhat network accounts are set to remote, otherwise we won't be able to impersonate them + if (hre.network.config.accounts !== 'remote') { + throw new Error('Hardhat network accounts must be set to remote') + } + + // Load contract addresses from addresses.json + const addressesJson = require('@graphprotocol/contracts/addresses.json') + const arbSepoliaAddresses = addressesJson['421614'] + + // Get contract addresses + const stakingAddress = arbSepoliaAddresses.L2Staking.address + const graphTokenAddress = arbSepoliaAddresses.L2GraphToken.address + + console.log(`Using Staking contract at: ${stakingAddress}`) + console.log(`Using GraphToken contract at: ${graphTokenAddress}`) + + // Create contract instances + const provider = new HardhatEthersProvider(hre.network.provider, hre.network.name) + const GraphToken = new Contract(graphTokenAddress, graphTokenABI, provider) as unknown as IGraphToken + const Staking = new Contract(stakingAddress, combinedStakingABI, provider) as unknown as IStaking + + // The account on Arbitrum Sepolia that has GRT tokens + const assetHolderBalance = await GraphToken.balanceOf(GRT_HOLDER_ADDRESS) + console.log(`Asset holder balance: ${assetHolderBalance}`) + + // Convert BigNumber to bigint for comparison + if (BigInt(assetHolderBalance.toString()) < ethers.parseEther('20000000')) { + throw new Error('Asset holder balance is less than 20M tokens') + } + + // Impersonate the account + await ethers.provider.send('hardhat_impersonateAccount', [GRT_HOLDER_ADDRESS]) + const grtHolder = await ethers.getSigner(GRT_HOLDER_ADDRESS) as any + + // Fund with GRT signers from 0 to 19 with 1M tokens + console.log('Funding signers from 0 to 19 with 1M tokens...') + const signers = await ethers.getSigners() + for (let i = 0; i < 20; i++) { + const signer = signers[i] + const transferTx = await GraphToken.connect(grtHolder).transfer(signer.address, ethers.parseEther('1000000')) + await transferTx.wait() + } + + // STEP 1: Fund and stake for indexers + console.log('\n--- STEP 1: Indexers Setup ---') + for (const indexer of indexers) { + // Impersonate the indexer + const indexerSigner = await ethers.getSigner(indexer.address) as any + + // Approve and stake + console.log(`Staking ${indexer.stake} tokens for indexer ${indexer.address}...`) + const approveTx = await GraphToken.connect(indexerSigner).approve(stakingAddress, indexer.stake) + await approveTx.wait() + const stakeTx = await Staking.connect(indexerSigner).stake(indexer.stake) + await stakeTx.wait() + + // Set delegation parameters + console.log(`Setting delegation parameters for indexer ${indexer.address}...`) + const setDelegationParametersTx = await Staking.connect(indexerSigner).setDelegationParameters(indexer.indexingRewardCut, indexer.queryFeeCut, 0) + await setDelegationParametersTx.wait() + + // Set rewards destination if it exists + if (indexer.rewardsDestination) { + console.log(`Setting rewards destination for indexer ${indexer.address} to ${indexer.rewardsDestination}...`) + const setRewardsDestinationTx = await Staking.connect(indexerSigner).setRewardsDestination(indexer.rewardsDestination) + await setRewardsDestinationTx.wait() + } + } + + // STEP 2: Fund and delegate for delegators + console.log('\n--- STEP 2: Delegators Delegating ---') + for (const delegator of delegators) { + // Impersonate the delegator + const delegatorSigner = await ethers.getSigner(delegator.address) as any + + // Delegate to each indexer + for (const delegation of delegator.delegations) { + console.log(`Delegating ${delegation.tokens} tokens from ${delegator.address} to indexer ${delegation.indexerAddress}...`) + const delegationApproveTx = await GraphToken.connect(delegatorSigner).approve(stakingAddress, delegation.tokens) + await delegationApproveTx.wait() + const delegateTx = await Staking.connect(delegatorSigner).delegate(delegation.indexerAddress, delegation.tokens) + await delegateTx.wait() + } + } + + // STEP 3: Create allocations + console.log('\n--- STEP 3: Creating Allocations ---') + for (const indexer of indexers) { + // Impersonate the indexer + const indexerSigner = await ethers.getSigner(indexer.address) as any + + for (const allocation of indexer.allocations) { + console.log(`Creating allocation of ${allocation.tokens} tokens from indexer ${indexer.address} on subgraph ${allocation.subgraphDeploymentID}...`) + + const allocateTx = await Staking.connect(indexerSigner).allocate( + allocation.subgraphDeploymentID, + allocation.tokens, + allocation.allocationID, + randomHexBytes(), // metadata + await generateAllocationProof(indexer.address, allocation.allocationPrivateKey) + ) + await allocateTx.wait() + } + } + + // STEP 4: Indexer unstakes + console.log('\n--- STEP 4: Indexer unstakes ---') + for (const indexer of indexers) { + if (indexer.tokensToUnstake) { + console.log(`Indexer ${indexer.address} is unstaking...`) + const indexerSigner = await ethers.getSigner(indexer.address) as any + const unstakeTx = await Staking.connect(indexerSigner).unstake(indexer.tokensToUnstake) + await unstakeTx.wait() + } + } + + // STEP 5: Undelegate + console.log('\n--- STEP 5: Undelegating ---') + for (const delegator of delegators) { + if (delegator.undelegate) { + console.log(`Delegator ${delegator.address} is undelegating...`) + + // Impersonate the delegator + const delegatorSigner = await ethers.getSigner(delegator.address) as any + + for (const delegation of delegator.delegations) { + // Get the delegation information + const delegationInfo = await Staking.getDelegation(delegation.indexerAddress, delegator.address) + const shares = delegationInfo.shares + + console.log(`Undelegating ${shares} shares from indexer ${delegation.indexerAddress}...`) + + // Undelegate the shares + const undelegateTx = await Staking.connect(delegatorSigner).undelegate(delegation.indexerAddress, shares) + await undelegateTx.wait() + } + } + } + + // Stop impersonating the account + await hre.network.provider.request({ + method: "hardhat_stopImpersonatingAccount", + params: [GRT_HOLDER_ADDRESS], + }); + + console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Pre-upgrade state setup complete! πŸŽ‰ ✨ πŸš€ βœ…\n') +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exitCode = 1 + }) + +function getBanner() { + return ` ++-----------------------------------------------+ +| | +| PRE-HORIZON UPGRADE SETUP | +| | ++-----------------------------------------------+ + ` +} diff --git a/packages/horizon/scripts/e2e/transfer-ownership.ts b/packages/horizon/scripts/e2e/transfer-ownership.ts new file mode 100644 index 000000000..665c07ccd --- /dev/null +++ b/packages/horizon/scripts/e2e/transfer-ownership.ts @@ -0,0 +1,92 @@ +import { ethers } from 'hardhat' +import hre from 'hardhat' + +async function main() { + console.log(getBanner()) + + // Check that we're on a local network + if (hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { + throw new Error('This script can only be run on localhost or hardhat network') + } + + console.log('\n--- STEP 0: Setup ---') + + // Get signers + const signers = await ethers.getSigners() + const newGovernor = signers[1] + + console.log(`New governor will be: ${newGovernor.address}`) + + // Get contracts + const controller = hre.graph().horizon!.contracts.Controller + const graphProxyAdmin = hre.graph().horizon!.contracts.GraphProxyAdmin + + // Get current owners + const controllerGovernor = await controller.governor() + const proxyAdminGovernor = await graphProxyAdmin.governor() + + console.log(`Current Controller governor: ${controllerGovernor}`) + console.log(`Current GraphProxyAdmin governor: ${proxyAdminGovernor}`) + + // Impersonate accounts + await ethers.provider.send('hardhat_impersonateAccount', [controllerGovernor]) + await ethers.provider.send('hardhat_impersonateAccount', [proxyAdminGovernor]) + + try { + const controllerSigner = await ethers.getSigner(controllerGovernor) + const proxyAdminSigner = await ethers.getSigner(proxyAdminGovernor) + + console.log('\n--- STEP 1: Transfer ownership of Controller ---') + + // Transfer Controller ownership + console.log('Transferring Controller ownership...') + // TODO: Can we fix this? + // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime + const controllerTx = await controller.connect(controllerSigner).transferOwnership(newGovernor.address) + await controllerTx.wait() + console.log('Accepting Controller ownership...') + // TODO: Can we fix this? + // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime + const acceptControllerTx = await controller.connect(newGovernor).acceptOwnership() + await acceptControllerTx.wait() + console.log(`New Controller governor: ${await controller.governor()}`) + + console.log('\n--- STEP 2: Transfer ownership of GraphProxyAdmin ---') + + // Transfer GraphProxyAdmin ownership + console.log('Transferring GraphProxyAdmin ownership...') + // TODO: Can we fix this? + // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime + const proxyAdminTx = await graphProxyAdmin.connect(proxyAdminSigner).transferOwnership(newGovernor.address) + await proxyAdminTx.wait() + console.log('Accepting GraphProxyAdmin ownership...') + // TODO: Can we fix this? + // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime + const acceptProxyAdminTx = await graphProxyAdmin.connect(newGovernor).acceptOwnership() + await acceptProxyAdminTx.wait() + console.log(`New GraphProxyAdmin governor: ${await graphProxyAdmin.governor()}`) + } finally { + // Stop impersonating accounts + await ethers.provider.send('hardhat_stopImpersonatingAccount', [controllerGovernor]) + await ethers.provider.send('hardhat_stopImpersonatingAccount', [proxyAdminGovernor]) + } + + console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Transfer ownership complete! πŸŽ‰ ✨ πŸš€ βœ…\n') +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) + +function getBanner() { + return ` + +-----------------------------------------------+ + | | + | TRANSFER OWNERSHIP SCRIPT | + | | + +-----------------------------------------------+ + ` +} \ No newline at end of file diff --git a/packages/horizon/tasks/deploy.ts b/packages/horizon/tasks/deploy.ts index 7bde23b3e..eeb7ee155 100644 --- a/packages/horizon/tasks/deploy.ts +++ b/packages/horizon/tasks/deploy.ts @@ -9,6 +9,7 @@ import DeployModule from '../ignition/modules/deploy' task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon contracts - no data services deployed') .addOptionalParam('horizonConfig', 'Name of the Horizon configuration file to use. Format is "protocol..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', undefined, types.string) + .addOptionalParam('signerIndex', 'Index of the signer account in getSigners array', 0, types.int) .setAction(async (args, hre: HardhatRuntimeEnvironment) => { const graph = hre.graph() @@ -20,7 +21,7 @@ task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon cont // Display the deployer -- this also triggers the secure accounts prompt if being used console.log('\n========== πŸ”‘ Deployer account ==========') const signers = await hre.ethers.getSigners() - const deployer = signers[0] + const deployer = signers[args.signerIndex] console.log('Using deployer account:', deployer.address) const balance = await hre.ethers.provider.getBalance(deployer.address) console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') @@ -32,8 +33,9 @@ task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon cont // Deploy the contracts console.log(`\n========== 🚧 Deploy protocol ==========`) const deployment = await hre.ignition.deploy(DeployModule, { - displayUi: args.displayUi ?? true, + displayUi: true, parameters: HorizonConfig, + defaultSender: deployer.address, }) // Save the addresses to the address book @@ -47,14 +49,18 @@ task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon cont task('deploy:migrate', 'Upgrade an existing version of the Graph Protocol v1 to Horizon - no data services deployed') .addOptionalParam('horizonConfig', 'Name of the Horizon configuration file to use. Format is "migrate..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', undefined, types.string) .addOptionalParam('step', 'Migration step to run (1, 2, 3 or 4)', undefined, types.int) + .addOptionalParam('signerIndex', 'Index of the signer account in getSigners array', 0, types.int) .addFlag('patchConfig', 'Patch configuration file using address book values - does not save changes') + .addFlag('hideBanner', 'Hide the banner display') .setAction(async (args, hre: HardhatRuntimeEnvironment) => { // Task parameters const step: number = args.step ?? 0 const patchConfig: boolean = args.patchConfig ?? false const graph = hre.graph() - console.log(getHorizonBanner()) + if (!args.hideBanner) { + console.log(getHorizonBanner()) + } // Migration step to run console.log('\n========== πŸ—οΈ Migration steps ==========') @@ -74,7 +80,7 @@ task('deploy:migrate', 'Upgrade an existing version of the Graph Protocol v1 to // Display the deployer -- this also triggers the secure accounts prompt if being used console.log('\n========== πŸ”‘ Deployer account ==========') const signers = await hre.ethers.getSigners() - const deployer = signers[0] + const deployer = signers[args.signerIndex] console.log('Using deployer account:', deployer.address) const balance = await hre.ethers.provider.getBalance(deployer.address) console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') @@ -92,14 +98,16 @@ task('deploy:migrate', 'Upgrade an existing version of the Graph Protocol v1 to displayUi: true, parameters: patchConfig ? _patchStepConfig(step, HorizonMigrateConfig, graph.horizon!.addressBook, graph.subgraphService!.addressBook) : HorizonMigrateConfig, deploymentId: `horizon-${hre.network.name}`, - }) + defaultSender: deployer.address, + }, + ) // Update address book console.log('\n========== πŸ“– Updating address book ==========') IgnitionHelper.saveToAddressBook(deployment, graph.horizon!.addressBook) console.log(`Address book at ${graph.horizon!.addressBook.file} updated!`) - console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Migration complete! πŸŽ‰ ✨ πŸš€ βœ…') + console.log(`\n\nπŸŽ‰ ✨ πŸš€ βœ… Migration step ${step} complete! πŸŽ‰ ✨ πŸš€ βœ…\n`) }) // This function patches the Ignition configuration object using an address book to fill in the gaps diff --git a/packages/horizon/tasks/e2e.ts b/packages/horizon/tasks/e2e.ts index 4c867240c..dd7eb3366 100644 --- a/packages/horizon/tasks/e2e.ts +++ b/packages/horizon/tasks/e2e.ts @@ -5,7 +5,7 @@ import { glob } from 'glob' task('test:integration', 'Runs all integration tests') .addParam( 'phase', - 'Test phase to run: "during-transition", "after-transition", "after-delegation-slashing"', + 'Test phase to run: "during-transition-period", "after-transition-period", "after-delegation-slashing-enabled"', ) .setAction(async (taskArgs, hre) => { // Get test files for each phase @@ -13,19 +13,55 @@ task('test:integration', 'Runs all integration tests') const afterTransitionPeriodFiles = await glob('test/integration/after-transition-period/**/*.{js,ts}') const afterDelegationSlashingEnabledFiles = await glob('test/integration/after-delegation-slashing-enabled/**/*.{js,ts}') + // Display banner for the current test phase + console.log(getTestPhaseBanner(taskArgs.phase)) + switch (taskArgs.phase) { - case 'during-transition': + case 'during-transition-period': await hre.run(TASK_TEST, { testFiles: duringTransitionPeriodFiles }) break - case 'after-transition': + case 'after-transition-period': await hre.run(TASK_TEST, { testFiles: afterTransitionPeriodFiles }) break - case 'after-delegation-slashing': + case 'after-delegation-slashing-enabled': await hre.run(TASK_TEST, { testFiles: afterDelegationSlashingEnabledFiles }) break default: throw new Error( - 'Invalid phase. Must be "during-transition", "after-transition", "after-delegation-slashing", or "all"', + 'Invalid phase. Must be "during-transition-period", "after-transition-period", "after-delegation-slashing-enabled", or "all"', ) } }) + +function getTestPhaseBanner(phase: string): string { + const title = phase + .split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' ') + + const baseText = 'INTEGRATION TESTS: ' + const fullText = baseText + title + + // Calculate minimum banner width needed for the text + const contentWidth = fullText.length + const bannerWidth = Math.max(47, contentWidth + 10) // Add padding + + // Create the centered text line + const paddingLeft = Math.floor((bannerWidth - contentWidth) / 2) + const paddingRight = bannerWidth - contentWidth - paddingLeft + const centeredLine = '|' + ' '.repeat(paddingLeft) + fullText + ' '.repeat(paddingRight) + '|' + + // Create empty line with correct width + const emptyLine = '|' + ' '.repeat(bannerWidth) + '|' + + // Create border with correct width + const border = '+' + '-'.repeat(bannerWidth) + '+' + + return ` +${border} +${emptyLine} +${centeredLine} +${emptyLine} +${border} +` +} \ No newline at end of file diff --git a/packages/horizon/tasks/transitions.ts b/packages/horizon/tasks/transitions.ts index 103db0ee1..560ec9a34 100644 --- a/packages/horizon/tasks/transitions.ts +++ b/packages/horizon/tasks/transitions.ts @@ -1,8 +1,28 @@ -import { task } from 'hardhat/config' +import { task, types } from 'hardhat/config' +import { ethers } from 'ethers' + +task('transition:unset-subgraph-service', 'Unsets the subgraph service in HorizonStaking') + .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) + .setAction(async (taskArgs, hre) => { + console.log(getTransitionBanner('UNSETTING SUBGRAPH SERVICE')) + + const signers = await hre.ethers.getSigners() + const governor = signers[taskArgs.governorIndex] + const rewardsManager = hre.graph().horizon!.contracts.RewardsManager + + console.log('Unsetting subgraph service...') + const tx = await rewardsManager.connect(governor).setSubgraphService(ethers.ZeroAddress) + await tx.wait() + console.log('Subgraph service unset') + }) task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') - .setAction(async (_, hre) => { - const [governor] = await hre.ethers.getSigners() + .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) + .setAction(async (taskArgs, hre) => { + console.log(getTransitionBanner('CLEARING THAWING PERIOD')) + + const signers = await hre.ethers.getSigners() + const governor = signers[taskArgs.governorIndex] const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking console.log('Clearing thawing period...') @@ -12,12 +32,39 @@ task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') }) task('transition:enable-delegation-slashing', 'Enables delegation slashing in HorizonStaking') - .setAction(async (_, hre) => { - const [governor] = await hre.ethers.getSigners() + .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) + .setAction(async (taskArgs, hre) => { + console.log(getTransitionBanner('ENABLING DELEGATION SLASHING')) + + const signers = await hre.ethers.getSigners() + const governor = signers[taskArgs.governorIndex] const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking console.log('Enabling delegation slashing...') const tx = await horizonStaking.connect(governor).setDelegationSlashingEnabled() await tx.wait() - console.log('Delegation slashing enabled') + + // Log if the delegation slashing is enabled + const delegationSlashingEnabled = await horizonStaking.isDelegationSlashingEnabled() + console.log('Delegation slashing enabled:', delegationSlashingEnabled) }) + +function getTransitionBanner(title: string): string { + const bannerWidth = 47 // Total width inside the box + const fullText = title + + // Calculate padding needed to center the text + const totalPadding = bannerWidth - fullText.length + const leftPadding = Math.floor(totalPadding / 2) + const rightPadding = totalPadding - leftPadding + + const centeredText = ' '.repeat(leftPadding) + fullText + ' '.repeat(rightPadding) + + return ` ++-----------------------------------------------+ +| | +|${centeredText}| +| | ++-----------------------------------------------+ +` +} \ No newline at end of file diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts index 208508adc..968b4b3b8 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts @@ -1,7 +1,7 @@ import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { @@ -13,7 +13,7 @@ import { } from '../shared/staking' describe('Add to delegation pool', () => { - let horizonStaking: HorizonStaking + let horizonStaking: IHorizonStaking let graphToken: IGraphToken let serviceProvider: SignerWithAddress let delegator: SignerWithAddress @@ -28,10 +28,13 @@ describe('Add to delegation pool', () => { before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon!.contracts.HorizonStaking + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken - [serviceProvider, delegator, signer] = await ethers.getSigners() + const signers = await ethers.getSigners() + serviceProvider = signers[7] + delegator = signers[13] + signer = signers[19] verifier = await ethers.Wallet.createRandom().getAddress() // Service provider stake @@ -53,10 +56,6 @@ describe('Add to delegation pool', () => { thawingPeriod, }) - // Send funds to delegator and signer - await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) - await graphToken.connect(serviceProvider).transfer(signer.address, tokens) - // Initialize delegation pool await delegate({ horizonStaking, diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts index ca3863146..5863739ea 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts @@ -2,7 +2,7 @@ import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' import { HDNodeWallet } from 'ethers' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { @@ -15,7 +15,7 @@ import { } from '../shared/staking' describe('Slashing', () => { - let horizonStaking: HorizonStaking + let horizonStaking: IHorizonStaking let graphToken: IGraphToken let serviceProvider: SignerWithAddress let delegator: SignerWithAddress @@ -30,11 +30,15 @@ describe('Slashing', () => { before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon!.contracts.HorizonStaking + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken [serviceProvider, delegator] = await ethers.getSigners() + // Check that delegation slashing is enabled + const delegationSlashingEnabled = await horizonStaking.isDelegationSlashingEnabled() + expect(delegationSlashingEnabled).to.be.equal(true, 'Delegation slashing should be enabled') + // Send funds to delegator await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens * 3n) }) diff --git a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts index ef389abbc..7f30902db 100644 --- a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts @@ -1,7 +1,7 @@ import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { @@ -12,7 +12,7 @@ import { } from '../shared/staking' describe('Add to delegation pool', () => { - let horizonStaking: HorizonStaking + let horizonStaking: IHorizonStaking let graphToken: IGraphToken let serviceProvider: SignerWithAddress let delegator: SignerWithAddress @@ -27,7 +27,7 @@ describe('Add to delegation pool', () => { before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon!.contracts.HorizonStaking + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken [serviceProvider, delegator, signer] = await ethers.getSigners() diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts index 06825f3d9..6a06a56bf 100644 --- a/packages/horizon/test/integration/after-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -1,7 +1,7 @@ import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { @@ -14,7 +14,7 @@ import { } from '../shared/staking' describe('Delegator', () => { - let horizonStaking: HorizonStaking + let horizonStaking: IHorizonStaking let graphToken: IGraphToken let delegator: SignerWithAddress let serviceProvider: SignerWithAddress @@ -29,7 +29,7 @@ describe('Delegator', () => { before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon!.contracts.HorizonStaking + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken [serviceProvider, delegator, newServiceProvider] = await ethers.getSigners() @@ -50,7 +50,17 @@ describe('Delegator', () => { thawingPeriod, }) - // Send funds to delegator and new service provider + // Send eth to delegator and new service provider to cover gas fees + await serviceProvider.sendTransaction({ + to: delegator.address, + value: ethers.parseEther('0.04'), + }) + await serviceProvider.sendTransaction({ + to: newServiceProvider.address, + value: ethers.parseEther('0.04'), + }) + + // Send GRT to delegator and new service provider to use for delegation and staking await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) await graphToken.connect(serviceProvider).transfer(newServiceProvider.address, tokens) }) diff --git a/packages/horizon/test/integration/after-transition-period/operator.test.ts b/packages/horizon/test/integration/after-transition-period/operator.test.ts index 6754905ee..7bd321a54 100644 --- a/packages/horizon/test/integration/after-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/operator.test.ts @@ -1,14 +1,14 @@ import hre from 'hardhat' import { expect } from 'chai' import { ethers } from 'hardhat' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { createProvision, deprovision, reprovision, stakeTo, thaw, unstake } from '../shared/staking' import { PaymentTypes } from '../utils/types' describe('Operator', () => { - let horizonStaking: HorizonStaking + let horizonStaking: IHorizonStaking let graphToken: IGraphToken let serviceProvider: SignerWithAddress let verifier: string @@ -21,7 +21,7 @@ describe('Operator', () => { before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon!.contracts.HorizonStaking + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken // Get signers diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index aabd5e435..0ed1e928e 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -1,7 +1,7 @@ import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { @@ -17,7 +17,7 @@ import { import { PaymentTypes } from '../utils/types' describe('Service provider', () => { - let horizonStaking: HorizonStaking + let horizonStaking: IHorizonStaking let graphToken: IGraphToken let verifier: string let serviceProvider: SignerWithAddress @@ -26,7 +26,7 @@ describe('Service provider', () => { before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon!.contracts.HorizonStaking + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken verifier = await ethers.Wallet.createRandom().getAddress(); diff --git a/packages/horizon/test/integration/after-transition-period/slashing.test.ts b/packages/horizon/test/integration/after-transition-period/slashing.test.ts index 1363b74e8..8a7df69ed 100644 --- a/packages/horizon/test/integration/after-transition-period/slashing.test.ts +++ b/packages/horizon/test/integration/after-transition-period/slashing.test.ts @@ -2,7 +2,7 @@ import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' import { HDNodeWallet } from 'ethers' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { @@ -14,7 +14,7 @@ import { } from '../shared/staking' describe('Slashing', () => { - let horizonStaking: HorizonStaking + let horizonStaking: IHorizonStaking let graphToken: IGraphToken let serviceProvider: SignerWithAddress let delegator: SignerWithAddress @@ -29,7 +29,7 @@ describe('Slashing', () => { before(async () => { const graph = hre.graph() - horizonStaking = graph.horizon!.contracts.HorizonStaking + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken [serviceProvider, delegator] = await ethers.getSigners() @@ -126,4 +126,60 @@ describe('Slashing', () => { const verifierDestinationBalanceAfter = await graphToken.balanceOf(verifierDestination) expect(verifierDestinationBalanceAfter).to.equal(verifierDestinationBalanceBefore + tokensVerifier, 'Verifier destination should receive the tokens') }) + + it('should only slash service provider when delegation slashing is disabled', async () => { + const slashingVerifier = ethers.Wallet.createRandom().connect(ethers.provider) + const slashTokens = provisionTokens + delegationTokens + const tokensVerifier = slashTokens / 2n + + // Send eth to slashing verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: slashingVerifier.address, + value: ethers.parseEther('0.5'), + }) + + // Create provision for slashing verifier + await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) + await createProvision({ + horizonStaking, + serviceProvider, + verifier: slashingVerifier.address, + tokens: provisionTokens, + maxVerifierCut, + thawingPeriod, + }) + + // Initialize delegation pool for slashing verifier + await delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: slashingVerifier.address, + tokens: delegationTokens, + minSharesOut: 0n, + }) + + // Get delegation pool state before slashing + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) + + // Slash the provision for all service provider and delegation pool tokens + await slash({ + horizonStaking, + verifier: slashingVerifier, + serviceProvider, + tokens: slashTokens, + tokensVerifier, + verifierDestination, + }) + + // Verify provision tokens were completely slashed + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, slashingVerifier.address) + expect(provisionAfter.tokens).to.be.equal(0, 'Provision tokens should be slashed completely') + + // Verify delegation pool tokens are not reduced + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) + expect(poolAfter.tokens).to.equal(poolBefore.tokens, 'Delegation pool tokens should not be reduced') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Delegation pool shares should remain the same') + }) }) diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts new file mode 100644 index 000000000..d9202e8cf --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -0,0 +1,318 @@ +import hre from 'hardhat' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import { keccak256, toUtf8Bytes } from 'ethers' + +import { IHorizonStaking, IGraphToken, IRewardsManager } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { stake, unstake, withdraw } from '../shared/staking' +import { collect } from '../shared/stakingExtension' +import { indexers } from '../../../scripts/e2e/fixtures/indexers' + +describe('Service Provider', () => { + let horizonStaking: IHorizonStaking + let rewardsManager: IRewardsManager + let graphToken: IGraphToken + let snapshotId: string + + const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking + rewardsManager = graph.horizon!.contracts.RewardsManager as unknown as IRewardsManager + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe(('New Protocol Users'), () => { + let serviceProvider: SignerWithAddress + + const tokensToStake = ethers.parseEther('1000') + + before(async () => { + const signers = await ethers.getSigners() + serviceProvider = signers[7] + + // Stake tokens to service provider + await stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) + }) + + it('should allow service provider to unstake and withdraw after thawing period', async () => { + const tokensToUnstake = ethers.parseEther('100') + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // First unstake request + await unstake({ horizonStaking, serviceProvider, tokens: tokensToUnstake }) + + // During transition period, tokens are locked by thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine remaining blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Now we can withdraw + await withdraw({ horizonStaking, serviceProvider }) + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + + expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') + }) + + it('should handle multiple unstake requests correctly', async () => { + // Make multiple unstake requests + const request1 = ethers.parseEther('50') + const request2 = ethers.parseEther('75') + + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // First unstake request + await unstake({ horizonStaking, serviceProvider, tokens: request1 }) + + // Mine half of thawing period blocks + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Second unstake request + await unstake({ horizonStaking, serviceProvider, tokens: request2 }) + + // Mine remaining blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Withdraw all thawed tokens + await withdraw({ horizonStaking, serviceProvider }) + + // Verify all tokens are withdrawn and transferred back to service provider + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(balanceAfter).to.equal(balanceBefore + request1 + request2, 'Tokens were not transferred back to service provider') + }) + }) + + describe('Existing Protocol Users', () => { + let indexer: SignerWithAddress + let tokensUnstaked: bigint + + before(async () => { + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + tokensUnstaked = indexerFixture.tokensToUnstake || 0n + }) + + it('should allow service provider to withdraw their locked tokens after thawing period passes', async () => { + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Get thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Withdraw tokens + await withdraw({ horizonStaking, serviceProvider: indexer }) + + // Verify tokens are transferred back to service provider + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal(balanceBefore + tokensUnstaked, 'Tokens were not transferred back to service provider') + }) + + describe('Legacy allocations', () => { + describe('Restaking', () => { + let delegationIndexingCut: number + let delegationQueryFeeCut: number + let allocationID: string + let allocationTokens: bigint + let gateway: SignerWithAddress + + beforeEach(async () => { + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + delegationIndexingCut = indexerFixture.indexingRewardCut + delegationQueryFeeCut = indexerFixture.queryFeeCut + allocationID = indexerFixture.allocations[0].allocationID + allocationTokens = indexerFixture.allocations[0].tokens + gateway = (await ethers.getSigners())[18] + }) + + it('should be able to close an open legacy allocation and collect rewards', async () => { + // Use a non-zero POI + const poi = ethers.getBytes(keccak256(toUtf8Bytes("poi"))) + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Get delegation pool before closing allocation + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get idle stake before closing allocation + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Close allocation + await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) + + // Get rewards + const rewards = await rewardsManager.getRewards(horizonStaking.target, allocationID) + // Verify rewards are not zero + expect(rewards).to.not.equal(0, 'Rewards were not transferred to service provider') + + // Verify rewards minus delegation cut are restaked + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + const idleStakeRewardsTokens = rewards * BigInt(delegationIndexingCut) / 1000000n + expect(idleStakeAfter).to.equal(idleStakeBefore + allocationTokens + idleStakeRewardsTokens, 'Rewards were not restaked') + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationRewardsTokens = rewards - idleStakeRewardsTokens + expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationRewardsTokens, 'Delegators cut was not added to delegation pool') + }) + + it('should be able to collect indexing fees', async () => { + const tokensToCollect = ethers.parseEther('1000') + + // Get idle stake before collecting + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Get delegation pool before collecting + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Collect indexing fees + await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) + + // Get idle stake after collecting + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) + const protocolTax = tokensToCollect * 1n / 100n + const curationFees = tokensToCollect * 99n / 1000n + const remainingTokens = tokensToCollect - protocolTax - curationFees + + // Verify tokens minus delegators cut are restaked + const indexerCutTokens = remainingTokens * BigInt(delegationQueryFeeCut) / 1000000n + expect(idleStakeAfter).to.equal(idleStakeBefore + indexerCutTokens, 'Indexer cut was not restaked') + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationCutTokens = remainingTokens - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationCutTokens, 'Delegators cut was not added to delegation pool') + }) + }) + + describe('With beneficiary', () => { + let delegationIndexingCut: number + let delegationQueryFeeCut: number + let rewardsDestination: string + let allocationID: string + let gateway: SignerWithAddress + + beforeEach(async () => { + const indexerFixture = indexers[1] + indexer = await ethers.getSigner(indexerFixture.address) + delegationIndexingCut = indexerFixture.indexingRewardCut + delegationQueryFeeCut = indexerFixture.queryFeeCut + rewardsDestination = indexerFixture.rewardsDestination! + allocationID = indexerFixture.allocations[0].allocationID + gateway = (await ethers.getSigners())[18] + }) + + it('should be able to close an open allocation and collect rewards', async () => { + // Use a non-zero POI + const poi = ethers.getBytes(keccak256(toUtf8Bytes("poi"))) + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Get delegation tokens before + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get rewards destination balance before closing allocation + const balanceBefore = await graphToken.balanceOf(rewardsDestination) + + // Close allocation + await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) + + // Get rewards + const rewards = await rewardsManager.getRewards(horizonStaking.target, allocationID) + // Verify rewards are not zero + expect(rewards).to.not.equal(0, 'Rewards were not transferred to rewards destination') + + // Verify indexer rewards cut is transferred to rewards destination + const balanceAfter = await graphToken.balanceOf(rewardsDestination) + const indexerCutTokens = rewards * BigInt(delegationIndexingCut) / 1000000n + expect(balanceAfter).to.equal(balanceBefore + indexerCutTokens, 'Indexer cut was not transferred to rewards destination') + + // Verify delegators cut is added to delegation pool + const delegationPoolAfter = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPoolAfter.tokens + const delegationCutTokens = rewards - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationCutTokens, 'Delegators cut was not added to delegation pool') + }) + + it('should be able to collect indexing fees', async () => { + const tokensToCollect = ethers.parseEther('1000') + + // Get rewards destination balance before collecting + const balanceBefore = await graphToken.balanceOf(rewardsDestination) + + // Get delegation tokens before + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Collect indexing fees + await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) + + // Get rewards destination balance after collecting + const balanceAfter = await graphToken.balanceOf(rewardsDestination) + + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) + const protocolTax = tokensToCollect * 1n / 100n + const curationFees = tokensToCollect * 99n / 1000n + const remainingTokens = tokensToCollect - protocolTax - curationFees + + // Verify indexer cut is transferred to rewards destination + const indexerCutTokens = remainingTokens * BigInt(delegationQueryFeeCut) / 1000000n + expect(balanceAfter).to.equal(balanceBefore + indexerCutTokens, 'Indexer cut was not transferred to rewards destination') + + // Verify delegators cut is added to delegation pool + const delegationPoolAfter = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPoolAfter.tokens + const delegationCutTokens = remainingTokens - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationCutTokens, 'Delegators cut was not added to delegation pool') + }) + }) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/slashing.test.ts b/packages/horizon/test/integration/during-transition-period/slashing.test.ts deleted file mode 100644 index 117aa5c77..000000000 --- a/packages/horizon/test/integration/during-transition-period/slashing.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import hre from 'hardhat' -import { ethers } from 'hardhat' -import { expect } from 'chai' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' -import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' - -import { - createProvision, - delegate, - slash, - stake, -} from '../shared/staking' - -describe('Slashing', () => { - let horizonStaking: HorizonStaking - let graphToken: IGraphToken - let serviceProvider: SignerWithAddress - let delegator: SignerWithAddress - let verifier: SignerWithAddress - let verifierDestination: string - - const maxVerifierCut = 1000000 // 100% - const thawingPeriod = 2419200 // 28 days - const provisionTokens = ethers.parseEther('10000') - const delegationTokens = ethers.parseEther('1000') - - before(async () => { - const graph = hre.graph() - - horizonStaking = graph.horizon!.contracts.HorizonStaking - graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken - - // Verify delegation slashing is disabled - expect(await horizonStaking.isDelegationSlashingEnabled()).to.be.equal(false, 'Delegation slashing should be disabled') - - ;[serviceProvider, delegator, verifier] = await ethers.getSigners() - verifierDestination = await ethers.Wallet.createRandom().getAddress() - - // Service provider stake and create provision - await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) - await createProvision({ - horizonStaking, - serviceProvider, - verifier: verifier.address, - tokens: provisionTokens, - maxVerifierCut, - thawingPeriod, - }) - - // Send funds to delegator - await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens) - - // Initialize delegation pool - await delegate({ - horizonStaking, - graphToken, - delegator, - serviceProvider, - verifier: verifier.address, - tokens: delegationTokens, - minSharesOut: 0n, - }) - }) - - it('should only slash service provider when delegation slashing is disabled', async () => { - const slashTokens = provisionTokens + delegationTokens - const tokensVerifier = slashTokens / 2n - const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) - - // Slash the provision for all service provider and delegation pool tokens - await slash({ - horizonStaking, - verifier, - serviceProvider, - tokens: slashTokens, - tokensVerifier, - verifierDestination, - }) - - // Verify provision tokens were completely slashed - const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier.address) - expect(provisionAfter.tokens).to.be.equal(0, 'Provision tokens should be slashed completely') - - // Verify delegation pool tokens are not reduced - const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) - expect(poolAfter.tokens).to.equal(poolBefore.tokens, 'Delegation pool tokens should not be reduced') - expect(poolAfter.shares).to.equal(poolBefore.shares, 'Delegation pool shares should remain the same') - }) -}) diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts index 86a9b757d..9daf94cac 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/horizon/test/integration/shared/staking.ts @@ -1,5 +1,5 @@ import { expect } from 'chai' -import { HorizonStaking, IGraphToken } from '../../../typechain-types' +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { ThawRequestType } from '../utils/types' import { HDNodeWallet } from 'ethers' @@ -9,7 +9,7 @@ import { HDNodeWallet } from 'ethers' ////////////////////////////////////////////////////////////// */ interface StakeParams { - horizonStaking: HorizonStaking + horizonStaking: IHorizonStaking graphToken: IGraphToken serviceProvider: SignerWithAddress tokens: bigint @@ -54,6 +54,16 @@ export async function unstake({ await unstakeTx.wait() } +interface WithdrawParams extends Omit {} + +export async function withdraw({ + horizonStaking, + serviceProvider, +}: WithdrawParams): Promise { + const withdrawTx = await horizonStaking.connect(serviceProvider).withdraw() + await withdrawTx.wait() +} + interface StakeToProvisionParams extends StakeParams { verifier: string } @@ -109,7 +119,7 @@ export async function slash({ ////////////////////////////////////////////////////////////// */ interface ProvisionParams { - horizonStaking: HorizonStaking + horizonStaking: IHorizonStaking serviceProvider: SignerWithAddress verifier: string tokens: bigint @@ -258,7 +268,7 @@ export async function reprovision({ ////////////////////////////////////////////////////////////// */ interface DelegationParams { - horizonStaking: HorizonStaking + horizonStaking: IHorizonStaking delegator: SignerWithAddress serviceProvider: SignerWithAddress verifier: string diff --git a/packages/horizon/test/integration/shared/stakingExtension.ts b/packages/horizon/test/integration/shared/stakingExtension.ts new file mode 100644 index 000000000..c3c3a5746 --- /dev/null +++ b/packages/horizon/test/integration/shared/stakingExtension.ts @@ -0,0 +1,43 @@ +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +/* //////////////////////////////////////////////////////////// + STAKING EXTENSION +////////////////////////////////////////////////////////////// */ + +interface CollectParams { + horizonStaking: IHorizonStaking + graphToken: IGraphToken + gateway: SignerWithAddress + allocationID: string + tokens: bigint +} + +export async function collect({ + horizonStaking, + graphToken, + gateway, + allocationID, + tokens, +}: CollectParams): Promise { + // Approve horizon staking contract to pull tokens from gateway + await approve(graphToken, gateway, await horizonStaking.getAddress(), tokens) + + // Collect query fees + const collectTx = await horizonStaking.connect(gateway).collect(tokens, allocationID) + await collectTx.wait() +} + +/* //////////////////////////////////////////////////////////// + HELPER FUNCTIONS +////////////////////////////////////////////////////////////// */ + +async function approve( + graphToken: IGraphToken, + signer: SignerWithAddress, + spender: string, + tokens: bigint, +): Promise { + const approveTx = await graphToken.connect(signer).approve(spender, tokens) + await approveTx.wait() +} diff --git a/packages/horizon/test/unit/staking/allocation/collect.t.sol b/packages/horizon/test/unit/staking/allocation/collect.t.sol index bdf488c8b..31a5138b2 100644 --- a/packages/horizon/test/unit/staking/allocation/collect.t.sol +++ b/packages/horizon/test/unit/staking/allocation/collect.t.sol @@ -26,7 +26,7 @@ contract HorizonStakingCollectAllocationTest is HorizonStakingTest { staking.collect(tokens, _allocationId); } - function testCollect_Tokenss( + function testCollect_Tokens( uint256 allocationTokens, uint256 collectTokens, uint256 curationTokens, diff --git a/packages/sdk/src/utils/index.ts b/packages/sdk/src/utils/index.ts index d8e5a95bb..6e55378d2 100644 --- a/packages/sdk/src/utils/index.ts +++ b/packages/sdk/src/utils/index.ts @@ -7,3 +7,4 @@ export * from './allocation' export * from './units' export * from './eip712' export * from './prompt' +export * from './abi' From b14100abbcb9b0a95c115d1ee216ac47237625c0 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Tue, 18 Mar 2025 16:46:19 -0300 Subject: [PATCH 09/23] chore: added operator, permissionless and slasher integration tests --- .../horizon/scripts/e2e/fixtures/indexers.ts | 1 + packages/horizon/scripts/e2e/pre-upgrade.ts | 9 +- .../horizon/scripts/e2e/transfer-ownership.ts | 98 +++++++++-------- .../add-to-delegation-pool.test.ts | 2 +- .../{slashing.test.ts => slasher.test.ts} | 6 +- .../{slashing.test.ts => slasher.test.ts} | 8 +- .../delegator.test.ts | 96 ++++++++++++++++ .../during-transition-period/operator.test.ts | 101 +++++++++++++++++ .../permissionless.test.ts | 78 +++++++++++++ .../service-provider.test.ts | 1 + .../during-transition-period/slasher.test.ts | 104 ++++++++++++++++++ .../test/integration/shared/staking.ts | 29 +++-- 12 files changed, 467 insertions(+), 66 deletions(-) rename packages/horizon/test/integration/after-delegation-slashing-enabled/{slashing.test.ts => slasher.test.ts} (97%) rename packages/horizon/test/integration/after-transition-period/{slashing.test.ts => slasher.test.ts} (97%) create mode 100644 packages/horizon/test/integration/during-transition-period/operator.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/permissionless.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/slasher.test.ts diff --git a/packages/horizon/scripts/e2e/fixtures/indexers.ts b/packages/horizon/scripts/e2e/fixtures/indexers.ts index 6d10b17d8..7fad581e4 100644 --- a/packages/horizon/scripts/e2e/fixtures/indexers.ts +++ b/packages/horizon/scripts/e2e/fixtures/indexers.ts @@ -72,6 +72,7 @@ export const indexers: Indexer[] = [ { address: INDEXER_TWO_ADDRESS, stake: parseEther('1000000'), + tokensToUnstake: parseEther('1000000'), indexingRewardCut: 850000, // 85% queryFeeCut: 850000, // 85% rewardsDestination: INDEXER_TWO_REWARDS_DESTINATION, diff --git a/packages/horizon/scripts/e2e/pre-upgrade.ts b/packages/horizon/scripts/e2e/pre-upgrade.ts index bed544f86..3cf5ca90d 100644 --- a/packages/horizon/scripts/e2e/pre-upgrade.ts +++ b/packages/horizon/scripts/e2e/pre-upgrade.ts @@ -68,8 +68,7 @@ async function main() { } // Impersonate the account - await ethers.provider.send('hardhat_impersonateAccount', [GRT_HOLDER_ADDRESS]) - const grtHolder = await ethers.getSigner(GRT_HOLDER_ADDRESS) as any + const grtHolder = await ethers.getImpersonatedSigner(GRT_HOLDER_ADDRESS) as any // Fund with GRT signers from 0 to 19 with 1M tokens console.log('Funding signers from 0 to 19 with 1M tokens...') @@ -175,12 +174,6 @@ async function main() { } } } - - // Stop impersonating the account - await hre.network.provider.request({ - method: "hardhat_stopImpersonatingAccount", - params: [GRT_HOLDER_ADDRESS], - }); console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Pre-upgrade state setup complete! πŸŽ‰ ✨ πŸš€ βœ…\n') } diff --git a/packages/horizon/scripts/e2e/transfer-ownership.ts b/packages/horizon/scripts/e2e/transfer-ownership.ts index 665c07ccd..690cf5cc5 100644 --- a/packages/horizon/scripts/e2e/transfer-ownership.ts +++ b/packages/horizon/scripts/e2e/transfer-ownership.ts @@ -1,5 +1,12 @@ -import { ethers } from 'hardhat' import hre from 'hardhat' +import { ethers } from 'hardhat' +import { Contract } from 'ethers' + +import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' +import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' + +import { mergeABIs } from 'hardhat-graph-protocol/sdk' +import { IStaking } from '@graphprotocol/contracts/build/types/IStaking' async function main() { console.log(getBanner()) @@ -13,11 +20,21 @@ async function main() { // Get signers const signers = await ethers.getSigners() - const newGovernor = signers[1] + const newGovernor = signers[1] as any + const newSlasher = signers[2] console.log(`New governor will be: ${newGovernor.address}`) + // Get contract addresses + const addressesJson = require('@graphprotocol/contracts/addresses.json') + const arbSepoliaAddresses = addressesJson['421614'] + const stakingAddress = arbSepoliaAddresses.L2Staking.address + + // Get ABIs + const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) + // Get contracts + const staking = new Contract(stakingAddress, combinedStakingABI, ethers.provider) as unknown as IStaking const controller = hre.graph().horizon!.contracts.Controller const graphProxyAdmin = hre.graph().horizon!.contracts.GraphProxyAdmin @@ -28,48 +45,43 @@ async function main() { console.log(`Current Controller governor: ${controllerGovernor}`) console.log(`Current GraphProxyAdmin governor: ${proxyAdminGovernor}`) - // Impersonate accounts - await ethers.provider.send('hardhat_impersonateAccount', [controllerGovernor]) - await ethers.provider.send('hardhat_impersonateAccount', [proxyAdminGovernor]) + // Get impersonated signers + const controllerSigner = await ethers.getImpersonatedSigner(controllerGovernor) as any + const proxyAdminSigner = await ethers.getImpersonatedSigner(proxyAdminGovernor) as any + + console.log('\n--- STEP 1: Transfer ownership of Controller ---') - try { - const controllerSigner = await ethers.getSigner(controllerGovernor) - const proxyAdminSigner = await ethers.getSigner(proxyAdminGovernor) - - console.log('\n--- STEP 1: Transfer ownership of Controller ---') - - // Transfer Controller ownership - console.log('Transferring Controller ownership...') - // TODO: Can we fix this? - // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime - const controllerTx = await controller.connect(controllerSigner).transferOwnership(newGovernor.address) - await controllerTx.wait() - console.log('Accepting Controller ownership...') - // TODO: Can we fix this? - // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime - const acceptControllerTx = await controller.connect(newGovernor).acceptOwnership() - await acceptControllerTx.wait() - console.log(`New Controller governor: ${await controller.governor()}`) - - console.log('\n--- STEP 2: Transfer ownership of GraphProxyAdmin ---') - - // Transfer GraphProxyAdmin ownership - console.log('Transferring GraphProxyAdmin ownership...') - // TODO: Can we fix this? - // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime - const proxyAdminTx = await graphProxyAdmin.connect(proxyAdminSigner).transferOwnership(newGovernor.address) - await proxyAdminTx.wait() - console.log('Accepting GraphProxyAdmin ownership...') - // TODO: Can we fix this? - // @ts-ignore - TypeScript doesn't understand the compatibility here, but it works at runtime - const acceptProxyAdminTx = await graphProxyAdmin.connect(newGovernor).acceptOwnership() - await acceptProxyAdminTx.wait() - console.log(`New GraphProxyAdmin governor: ${await graphProxyAdmin.governor()}`) - } finally { - // Stop impersonating accounts - await ethers.provider.send('hardhat_stopImpersonatingAccount', [controllerGovernor]) - await ethers.provider.send('hardhat_stopImpersonatingAccount', [proxyAdminGovernor]) - } + // Transfer Controller ownership + console.log('Transferring Controller ownership...') + const controllerTx = await controller.connect(controllerSigner).transferOwnership(newGovernor.address) + await controllerTx.wait() + console.log('Accepting Controller ownership...') + + // Accept ownership of Controller + const acceptControllerTx = await controller.connect(newGovernor).acceptOwnership() + await acceptControllerTx.wait() + console.log(`New Controller governor: ${await controller.governor()}`) + + console.log('\n--- STEP 2: Transfer ownership of GraphProxyAdmin ---') + + // Transfer GraphProxyAdmin ownership + console.log('Transferring GraphProxyAdmin ownership...') + const proxyAdminTx = await graphProxyAdmin.connect(proxyAdminSigner).transferOwnership(newGovernor.address) + await proxyAdminTx.wait() + console.log('Accepting GraphProxyAdmin ownership...') + + // Accept ownership of GraphProxyAdmin + const acceptProxyAdminTx = await graphProxyAdmin.connect(newGovernor).acceptOwnership() + await acceptProxyAdminTx.wait() + console.log(`New GraphProxyAdmin governor: ${await graphProxyAdmin.governor()}`) + + console.log('\n--- STEP 3: Assign new slasher ---') + + // Assign new slasher + console.log('Assigning new slasher...') + const slasherTx = await staking.connect(newGovernor).setSlasher(newSlasher.address, true) + await slasherTx.wait() + console.log(`New slasher: ${newSlasher.address}, allowed: ${await staking.slashers(newSlasher.address)}`) console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Transfer ownership complete! πŸŽ‰ ✨ πŸš€ βœ…\n') } diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts index 968b4b3b8..63a426811 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts @@ -108,7 +108,7 @@ describe('Add to delegation pool', () => { await slash({ horizonStaking, verifier: newVerifier, - serviceProvider, + serviceProvider: serviceProvider.address, tokens: slashTokens, tokensVerifier, verifierDestination: newVerifier.address, diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts similarity index 97% rename from packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts rename to packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts index 5863739ea..0232adefc 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/slashing.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts @@ -14,7 +14,7 @@ import { withdrawDelegated, } from '../shared/staking' -describe('Slashing', () => { +describe('Slasher', () => { let horizonStaking: IHorizonStaking let graphToken: IGraphToken let serviceProvider: SignerWithAddress @@ -86,7 +86,7 @@ describe('Slashing', () => { await slash({ horizonStaking, verifier, - serviceProvider, + serviceProvider: serviceProvider.address, tokens: slashTokens, tokensVerifier, verifierDestination, @@ -112,7 +112,7 @@ describe('Slashing', () => { await slash({ horizonStaking, verifier, - serviceProvider, + serviceProvider: serviceProvider.address, tokens: slashTokens, tokensVerifier, verifierDestination, diff --git a/packages/horizon/test/integration/after-transition-period/slashing.test.ts b/packages/horizon/test/integration/after-transition-period/slasher.test.ts similarity index 97% rename from packages/horizon/test/integration/after-transition-period/slashing.test.ts rename to packages/horizon/test/integration/after-transition-period/slasher.test.ts index 8a7df69ed..726fd3e44 100644 --- a/packages/horizon/test/integration/after-transition-period/slashing.test.ts +++ b/packages/horizon/test/integration/after-transition-period/slasher.test.ts @@ -13,7 +13,7 @@ import { thaw, } from '../shared/staking' -describe('Slashing', () => { +describe('Slasher', () => { let horizonStaking: IHorizonStaking let graphToken: IGraphToken let serviceProvider: SignerWithAddress @@ -78,7 +78,7 @@ describe('Slashing', () => { await slash({ horizonStaking, verifier, - serviceProvider, + serviceProvider: serviceProvider.address, tokens: slashTokens, tokensVerifier, verifierDestination, @@ -112,7 +112,7 @@ describe('Slashing', () => { await slash({ horizonStaking, verifier, - serviceProvider, + serviceProvider: serviceProvider.address, tokens: slashTokens, tokensVerifier, verifierDestination, @@ -167,7 +167,7 @@ describe('Slashing', () => { await slash({ horizonStaking, verifier: slashingVerifier, - serviceProvider, + serviceProvider: serviceProvider.address, tokens: slashTokens, tokensVerifier, verifierDestination, diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts index e69de29bb..a973ce04c 100644 --- a/packages/horizon/test/integration/during-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/delegator.test.ts @@ -0,0 +1,96 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' + +import { + withdrawDelegatedLegacy, +} from '../shared/staking' +import { delegators } from '../../../scripts/e2e/fixtures/delegators' + +describe('Delegator', () => { + let horizonStaking: IHorizonStaking + let graphToken: IGraphToken + let snapshotId: string + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Existing Protocol Users', () => { + + describe('User undelegated before horizon was deployed', () => { + let indexer: SignerWithAddress + let delegator: SignerWithAddress + let tokens: bigint + + before(async () => { + const delegatorFixture = delegators[2] + const delegationFixture = delegatorFixture.delegations[0] + + // Verify delegator is undelegated + expect(delegatorFixture.undelegate).to.be.true + + // Get signers + indexer = await ethers.getSigner(delegationFixture.indexerAddress) + delegator = await ethers.getSigner(delegatorFixture.address) + + // Get tokens + tokens = delegationFixture.tokens + }) + + it('should be able to withdraw their tokens after the thawing period', async () => { + // Get the thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine remaining blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(delegator.address) + + // Withdraw tokens + await withdrawDelegatedLegacy({ + horizonStaking, + delegator, + serviceProvider: indexer, + }) + + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(delegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + const expectedBalanceAfter = balanceBefore + tokens - (tokens * 5000n / 1000000n) + + // Verify tokens are withdrawn + expect(balanceAfter).to.equal(expectedBalanceAfter) + }) + + it('should revert if the thawing period has not passed', async () => { + // Withdraw tokens + await expect(withdrawDelegatedLegacy({ + horizonStaking, + delegator, + serviceProvider: indexer, + })).to.be.revertedWith('!tokens') + }) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/operator.test.ts b/packages/horizon/test/integration/during-transition-period/operator.test.ts new file mode 100644 index 000000000..489e5f7ab --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/operator.test.ts @@ -0,0 +1,101 @@ +import hre from 'hardhat' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import { IHorizonStaking, IGraphToken, IRewardsManager } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { indexers } from '../../../scripts/e2e/fixtures/indexers' +import { keccak256 } from 'ethers' +import { toUtf8Bytes } from 'ethers' + +describe('Operator', () => { + let horizonStaking: IHorizonStaking + let rewardsManager: IRewardsManager + let graphToken: IGraphToken + let snapshotId: string + + // TODO: FIX THIS + const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + + before(async () => { + const graph = hre.graph() + + // Get contracts + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking + rewardsManager = graph.horizon!.contracts.RewardsManager as unknown as IRewardsManager + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Existing Protocol Users', () => { + let indexer: SignerWithAddress + let operator: SignerWithAddress + let allocationID: string + let allocationTokens: bigint + let delegationIndexingCut: number + + before(async () => { + const indexerFixture = indexers[0] + const allocationFixture = indexerFixture.allocations[0] + + // Get signers + indexer = await ethers.getSigner(indexerFixture.address) + operator = (await ethers.getSigners())[0] + + // Get allocation details + allocationID = allocationFixture.allocationID + allocationTokens = allocationFixture.tokens + delegationIndexingCut = indexerFixture.indexingRewardCut + + // Set the operator + await horizonStaking.connect(indexer).setOperator(subgraphServiceAddress, operator.address, true) + }) + + it('should allow the operator to close an open legacy allocation and collect rewards', async () => { + // Use a non-zero POI + const poi = ethers.getBytes(keccak256(toUtf8Bytes("poi"))) + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Get delegation pool before closing allocation + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get idle stake before closing allocation + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Close allocation + await horizonStaking.connect(operator).closeAllocation(allocationID, poi) + + // Get rewards + const rewards = await rewardsManager.getRewards(horizonStaking.target, allocationID) + // Verify rewards are not zero + expect(rewards).to.not.equal(0, 'Rewards were not transferred to service provider') + + // Verify rewards minus delegation cut are restaked + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + const idleStakeRewardsTokens = rewards * BigInt(delegationIndexingCut) / 1000000n + expect(idleStakeAfter).to.equal(idleStakeBefore + allocationTokens + idleStakeRewardsTokens, 'Rewards were not restaked') + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationRewardsTokens = rewards - idleStakeRewardsTokens + expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationRewardsTokens, 'Delegators cut was not added to delegation pool') + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts new file mode 100644 index 000000000..eceac9051 --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts @@ -0,0 +1,78 @@ +import hre from 'hardhat' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import { IHorizonStaking, IGraphToken, IRewardsManager, IEpochManager } from '../../../typechain-types' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { indexers } from '../../../scripts/e2e/fixtures/indexers' +import { keccak256 } from 'ethers' +import { toUtf8Bytes } from 'ethers' +import EpochManager from '../../../ignition/modules/periphery/EpochManager' + +describe('Permissionless', () => { + let horizonStaking: IHorizonStaking + let rewardsManager: IRewardsManager + let epochManager: IEpochManager + let graphToken: IGraphToken + let snapshotId: string + + // TODO: FIX THIS + const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + + before(async () => { + const graph = hre.graph() + + // Get contracts + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking + rewardsManager = graph.horizon!.contracts.RewardsManager as unknown as IRewardsManager + epochManager = graph.horizon!.contracts.EpochManager as unknown as IEpochManager + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('After max allocation epochs', () => { + let indexer: SignerWithAddress + let anySigner: SignerWithAddress + let allocationID: string + let allocationTokens: bigint + + before(async () => { + // Get signers + indexer = await ethers.getSigner(indexers[0].address) + anySigner = (await ethers.getSigners())[19] + + // Get allocation details + allocationID = indexers[0].allocations[0].allocationID + allocationTokens = indexers[0].allocations[0].tokens + }) + + it('should allow any user to close an allocation with zero POI', async () => { + // Get indexer's idle stake before closing allocation + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Mine blocks to simulate 28 epochs passing + const startingEpoch = await epochManager.currentEpoch() + while (await epochManager.currentEpoch() - startingEpoch < 28) { + await ethers.provider.send('evm_mine', []) + } + + // Close allocation + await horizonStaking.connect(anySigner).closeAllocation(allocationID, ethers.getBytes(keccak256(toUtf8Bytes("poi")))) + + // Get indexer's idle stake after closing allocation + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + + // Verify allocation tokens were added to indexer's idle stake but no rewards were collected + expect(idleStakeAfter).to.be.equal(idleStakeBefore + allocationTokens) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index d9202e8cf..6cf9bec5c 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -16,6 +16,7 @@ describe('Service Provider', () => { let graphToken: IGraphToken let snapshotId: string + // TODO: FIX THIS const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' before(async () => { diff --git a/packages/horizon/test/integration/during-transition-period/slasher.test.ts b/packages/horizon/test/integration/during-transition-period/slasher.test.ts new file mode 100644 index 000000000..1600cc863 --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/slasher.test.ts @@ -0,0 +1,104 @@ +import hre from 'hardhat' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import { indexers } from '../../../scripts/e2e/fixtures/indexers' +import { slash } from '../shared/staking' + +describe('Slasher', () => { + let horizonStaking: IHorizonStaking + let graphToken: IGraphToken + let snapshotId: string + + let indexer: string + let slasher: SignerWithAddress + let tokensToSlash: bigint + + before(async () => { + const graph = hre.graph() + + horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking + graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken + + slasher = (await ethers.getSigners())[2] + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Available tokens', () => { + + before(async () => { + const indexerFixture = indexers[0] + indexer = indexerFixture.address + tokensToSlash = ethers.parseEther('10000') + }) + + it('should be able to slash indexer stake', async () => { + // Before slash state + const idleStakeBeforeSlash = await horizonStaking.getIdleStake(indexer) + const tokensVerifier = tokensToSlash / 2n + const slasherBeforeBalance = await graphToken.balanceOf(slasher.address) + + // Slash tokens + await slash({ + horizonStaking, + verifier: slasher, + serviceProvider: indexer, + tokens: tokensToSlash, + tokensVerifier, + verifierDestination: slasher.address, + }) + + // Indexer's stake should have decreased + const idleStakeAfterSlash = await horizonStaking.getIdleStake(indexer) + expect(idleStakeAfterSlash).to.equal(idleStakeBeforeSlash - tokensToSlash, 'Indexer stake should have decreased') + + // Slasher should have received the tokens + const slasherAfterBalance = await graphToken.balanceOf(slasher.address) + expect(slasherAfterBalance).to.equal(slasherBeforeBalance + tokensVerifier, 'Slasher should have received the tokens') + }) + }) + + describe('Locked tokens', () => { + + before(async () => { + const indexerFixture = indexers[1] + indexer = indexerFixture.address + tokensToSlash = indexerFixture.stake + }) + + it('should be able to slash locked tokens', async () => { + // Before slash state + const tokensVerifier = tokensToSlash / 2n + const slasherBeforeBalance = await graphToken.balanceOf(slasher.address) + + // Slash tokens + await slash({ + horizonStaking, + verifier: slasher, + serviceProvider: indexer, + tokens: tokensToSlash, + tokensVerifier, + verifierDestination: slasher.address, + }) + + // Indexer's entire stake should have been slashed + const indexerStakeAfterSlash = await horizonStaking.getServiceProvider(indexer) + expect(indexerStakeAfterSlash.tokensStaked).to.equal(0n, 'Indexer stake should have been slashed') + + // Slasher should have received the tokens + const slasherAfterBalance = await graphToken.balanceOf(slasher.address) + expect(slasherAfterBalance).to.equal(slasherBeforeBalance + tokensVerifier, 'Slasher should have received the tokens') + }) + }) +}) diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts index 9daf94cac..660c07d5b 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/horizon/test/integration/shared/staking.ts @@ -2,7 +2,7 @@ import { expect } from 'chai' import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { ThawRequestType } from '../utils/types' -import { HDNodeWallet } from 'ethers' +import { ethers, HDNodeWallet } from 'ethers' /* ////////////////////////////////////////////////////////////// STAKE MANAGEMENT @@ -90,8 +90,9 @@ export async function stakeToProvision({ await stakeToProvisionTx.wait() } -interface SlashParams extends Omit { +interface SlashParams extends Omit { verifier: SignerWithAddress | HDNodeWallet + serviceProvider: string tokens: bigint tokensVerifier: bigint verifierDestination: string @@ -106,7 +107,7 @@ export async function slash({ verifierDestination, }: SlashParams): Promise { const slashTx = await horizonStaking.connect(verifier).slash( - serviceProvider.address, + serviceProvider, tokens, tokensVerifier, verifierDestination, @@ -320,10 +321,6 @@ export async function undelegate({ await undelegateTx.wait() } -interface WithdrawDelegatedParams extends DelegationParams { - nThawRequests: bigint -} - interface RedelegateParams extends DelegationParams { newServiceProvider: SignerWithAddress newVerifier: string @@ -352,6 +349,10 @@ export async function redelegate({ await redelegateTx.wait() } +interface WithdrawDelegatedParams extends DelegationParams { + nThawRequests: bigint +} + export async function withdrawDelegated({ horizonStaking, delegator, @@ -367,6 +368,20 @@ export async function withdrawDelegated({ await withdrawDelegatedTx.wait() } +interface WithdrawDelegatedLegacyParams extends Omit {} + +export async function withdrawDelegatedLegacy({ + horizonStaking, + delegator, + serviceProvider, +}: WithdrawDelegatedLegacyParams): Promise { + const withdrawDelegatedTx = await horizonStaking.connect(delegator)['withdrawDelegated(address,address)']( + serviceProvider.address, + ethers.ZeroAddress, + ) + await withdrawDelegatedTx.wait() +} + interface AddToDelegationPoolParams extends Omit { graphToken: IGraphToken signer: SignerWithAddress From 5ea9832d36e8fba913d94bb274d1711d915c64f9 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Tue, 18 Mar 2025 17:18:05 -0300 Subject: [PATCH 10/23] fix: ts-lint --- packages/horizon/hardhat.config.ts | 6 +- .../scripts/e2e/fixtures/delegators.ts | 12 +-- .../horizon/scripts/e2e/fixtures/indexers.ts | 2 +- packages/horizon/scripts/e2e/pre-upgrade.ts | 38 +++++--- .../horizon/scripts/e2e/transfer-ownership.ts | 20 ++-- packages/horizon/tasks/e2e.ts | 20 ++-- packages/horizon/tasks/transitions.ts | 14 +-- .../add-to-delegation-pool.test.ts | 6 +- .../slasher.test.ts | 6 +- .../add-to-delegation-pool.test.ts | 6 +- .../after-transition-period/delegator.test.ts | 6 +- .../after-transition-period/operator.test.ts | 8 +- .../service-provider.test.ts | 6 +- .../after-transition-period/slasher.test.ts | 6 +- .../delegator.test.ts | 12 +-- .../during-transition-period/operator.test.ts | 20 ++-- .../permissionless.test.ts | 24 ++--- .../service-provider.test.ts | 91 ++++++++++--------- .../during-transition-period/slasher.test.ts | 16 ++-- .../test/integration/shared/staking.ts | 7 +- .../integration/shared/stakingExtension.ts | 5 +- 21 files changed, 177 insertions(+), 154 deletions(-) diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts index d940aea11..0cc3af3cf 100644 --- a/packages/horizon/hardhat.config.ts +++ b/packages/horizon/hardhat.config.ts @@ -1,14 +1,14 @@ -import { hardhatBaseConfig } from 'hardhat-graph-protocol/sdk' import { existsSync, readdirSync } from 'fs' +import { hardhatBaseConfig } from 'hardhat-graph-protocol/sdk' +import { HardhatUserConfig } from 'hardhat/types' import { join } from 'path' -// Hardhat plugins +// Plugin imports (single imports) import '@nomicfoundation/hardhat-foundry' import '@nomicfoundation/hardhat-toolbox' import '@nomicfoundation/hardhat-ignition-ethers' import 'hardhat-contract-sizer' import 'hardhat-secure-accounts' -import { HardhatUserConfig } from 'hardhat/types' // Hardhat tasks function loadTasks() { diff --git a/packages/horizon/scripts/e2e/fixtures/delegators.ts b/packages/horizon/scripts/e2e/fixtures/delegators.ts index 6dfe7f882..274a040dd 100644 --- a/packages/horizon/scripts/e2e/fixtures/delegators.ts +++ b/packages/horizon/scripts/e2e/fixtures/delegators.ts @@ -1,5 +1,5 @@ -import { parseEther } from 'ethers' import { indexers } from './indexers' +import { parseEther } from 'ethers' export interface Delegator { address: string @@ -21,7 +21,7 @@ export const delegators: Delegator[] = [ { indexerAddress: indexers[1].address, tokens: parseEther('25000'), - } + }, ], undelegate: false, }, @@ -31,7 +31,7 @@ export const delegators: Delegator[] = [ { indexerAddress: indexers[1].address, tokens: parseEther('75000'), - } + }, ], undelegate: false, }, @@ -41,7 +41,7 @@ export const delegators: Delegator[] = [ { indexerAddress: indexers[0].address, tokens: parseEther('100000'), - } + }, ], undelegate: true, // This delegator will undelegate }, @@ -54,5 +54,5 @@ export const delegators: Delegator[] = [ address: '0x2F560290FEF1B3Ada194b6aA9c40aa71f8e95598', // Hardhat account #14 delegations: [], undelegate: false, - } -] \ No newline at end of file + }, +] diff --git a/packages/horizon/scripts/e2e/fixtures/indexers.ts b/packages/horizon/scripts/e2e/fixtures/indexers.ts index 7fad581e4..74068c0d5 100644 --- a/packages/horizon/scripts/e2e/fixtures/indexers.ts +++ b/packages/horizon/scripts/e2e/fixtures/indexers.ts @@ -43,7 +43,7 @@ const SUBGRAPH_DEPLOYMENT_ID_THREE = '0x0472e8c46f728adb65a22187c6740532f82c2eba export const indexers: Indexer[] = [ { - address: INDEXER_ONE_ADDRESS, + address: INDEXER_ONE_ADDRESS, stake: parseEther('1000000'), tokensToUnstake: parseEther('10000'), indexingRewardCut: 900000, // 90% diff --git a/packages/horizon/scripts/e2e/pre-upgrade.ts b/packages/horizon/scripts/e2e/pre-upgrade.ts index 3cf5ca90d..7706b9b9e 100644 --- a/packages/horizon/scripts/e2e/pre-upgrade.ts +++ b/packages/horizon/scripts/e2e/pre-upgrade.ts @@ -1,16 +1,16 @@ import hre, { ethers } from 'hardhat' import { Contract } from 'ethers' -import { mergeABIs } from 'hardhat-graph-protocol/sdk' -import { indexers } from './fixtures/indexers' -import { delegators } from './fixtures/delegators' import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import { IGraphToken, IStaking } from '@graphprotocol/contracts' +import L2GraphTokenABI from '@graphprotocol/contracts/build/abis/L2GraphToken.json' import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' +import { mergeABIs } from 'hardhat-graph-protocol/sdk' import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' -import L2GraphTokenABI from '@graphprotocol/contracts/build/abis/L2GraphToken.json' -import { IGraphToken, IStaking } from '@graphprotocol/contracts' +import { delegators } from './fixtures/delegators' +import { indexers } from './fixtures/indexers' // The account on Arbitrum Sepolia that has GRT tokens const GRT_HOLDER_ADDRESS = process.env.GRT_HOLDER_ADDRESS || '0xadE6B8EB69a49B56929C1d4F4b428d791861dB6f' @@ -59,15 +59,16 @@ async function main() { const Staking = new Contract(stakingAddress, combinedStakingABI, provider) as unknown as IStaking // The account on Arbitrum Sepolia that has GRT tokens - const assetHolderBalance = await GraphToken.balanceOf(GRT_HOLDER_ADDRESS) + const assetHolderBalance = BigInt((await GraphToken.balanceOf(GRT_HOLDER_ADDRESS)).toString()) console.log(`Asset holder balance: ${assetHolderBalance}`) // Convert BigNumber to bigint for comparison - if (BigInt(assetHolderBalance.toString()) < ethers.parseEther('20000000')) { + if (assetHolderBalance < ethers.parseEther('20000000')) { throw new Error('Asset holder balance is less than 20M tokens') } - + // Impersonate the account + // eslint-disable-next-line @typescript-eslint/no-explicit-any const grtHolder = await ethers.getImpersonatedSigner(GRT_HOLDER_ADDRESS) as any // Fund with GRT signers from 0 to 19 with 1M tokens @@ -83,6 +84,7 @@ async function main() { console.log('\n--- STEP 1: Indexers Setup ---') for (const indexer of indexers) { // Impersonate the indexer + // eslint-disable-next-line @typescript-eslint/no-explicit-any const indexerSigner = await ethers.getSigner(indexer.address) as any // Approve and stake @@ -109,6 +111,7 @@ async function main() { console.log('\n--- STEP 2: Delegators Delegating ---') for (const delegator of delegators) { // Impersonate the delegator + // eslint-disable-next-line @typescript-eslint/no-explicit-any const delegatorSigner = await ethers.getSigner(delegator.address) as any // Delegate to each indexer @@ -125,17 +128,18 @@ async function main() { console.log('\n--- STEP 3: Creating Allocations ---') for (const indexer of indexers) { // Impersonate the indexer + // eslint-disable-next-line @typescript-eslint/no-explicit-any const indexerSigner = await ethers.getSigner(indexer.address) as any for (const allocation of indexer.allocations) { console.log(`Creating allocation of ${allocation.tokens} tokens from indexer ${indexer.address} on subgraph ${allocation.subgraphDeploymentID}...`) - + const allocateTx = await Staking.connect(indexerSigner).allocate( allocation.subgraphDeploymentID, allocation.tokens, allocation.allocationID, randomHexBytes(), // metadata - await generateAllocationProof(indexer.address, allocation.allocationPrivateKey) + await generateAllocationProof(indexer.address, allocation.allocationPrivateKey), ) await allocateTx.wait() } @@ -146,7 +150,12 @@ async function main() { for (const indexer of indexers) { if (indexer.tokensToUnstake) { console.log(`Indexer ${indexer.address} is unstaking...`) + + // Impersonate the indexer + // eslint-disable-next-line @typescript-eslint/no-explicit-any const indexerSigner = await ethers.getSigner(indexer.address) as any + + // Unstake const unstakeTx = await Staking.connect(indexerSigner).unstake(indexer.tokensToUnstake) await unstakeTx.wait() } @@ -159,13 +168,14 @@ async function main() { console.log(`Delegator ${delegator.address} is undelegating...`) // Impersonate the delegator + // eslint-disable-next-line @typescript-eslint/no-explicit-any const delegatorSigner = await ethers.getSigner(delegator.address) as any - + for (const delegation of delegator.delegations) { // Get the delegation information const delegationInfo = await Staking.getDelegation(delegation.indexerAddress, delegator.address) - const shares = delegationInfo.shares - + const shares = BigInt(delegationInfo.shares.toString()) + console.log(`Undelegating ${shares} shares from indexer ${delegation.indexerAddress}...`) // Undelegate the shares @@ -174,7 +184,7 @@ async function main() { } } } - + console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Pre-upgrade state setup complete! πŸŽ‰ ✨ πŸš€ βœ…\n') } diff --git a/packages/horizon/scripts/e2e/transfer-ownership.ts b/packages/horizon/scripts/e2e/transfer-ownership.ts index 690cf5cc5..238bf5c83 100644 --- a/packages/horizon/scripts/e2e/transfer-ownership.ts +++ b/packages/horizon/scripts/e2e/transfer-ownership.ts @@ -1,12 +1,11 @@ -import hre from 'hardhat' -import { ethers } from 'hardhat' import { Contract } from 'ethers' +import { ethers } from 'hardhat' +import hre from 'hardhat' +import { IStaking } from '@graphprotocol/contracts' import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' -import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' - import { mergeABIs } from 'hardhat-graph-protocol/sdk' -import { IStaking } from '@graphprotocol/contracts/build/types/IStaking' +import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' async function main() { console.log(getBanner()) @@ -20,6 +19,7 @@ async function main() { // Get signers const signers = await ethers.getSigners() + // eslint-disable-next-line @typescript-eslint/no-explicit-any const newGovernor = signers[1] as any const newSlasher = signers[2] @@ -37,20 +37,22 @@ async function main() { const staking = new Contract(stakingAddress, combinedStakingABI, ethers.provider) as unknown as IStaking const controller = hre.graph().horizon!.contracts.Controller const graphProxyAdmin = hre.graph().horizon!.contracts.GraphProxyAdmin - + // Get current owners const controllerGovernor = await controller.governor() const proxyAdminGovernor = await graphProxyAdmin.governor() - + console.log(`Current Controller governor: ${controllerGovernor}`) console.log(`Current GraphProxyAdmin governor: ${proxyAdminGovernor}`) // Get impersonated signers + // eslint-disable-next-line @typescript-eslint/no-explicit-any const controllerSigner = await ethers.getImpersonatedSigner(controllerGovernor) as any + // eslint-disable-next-line @typescript-eslint/no-explicit-any const proxyAdminSigner = await ethers.getImpersonatedSigner(proxyAdminGovernor) as any console.log('\n--- STEP 1: Transfer ownership of Controller ---') - + // Transfer Controller ownership console.log('Transferring Controller ownership...') const controllerTx = await controller.connect(controllerSigner).transferOwnership(newGovernor.address) @@ -101,4 +103,4 @@ function getBanner() { | | +-----------------------------------------------+ ` -} \ No newline at end of file +} diff --git a/packages/horizon/tasks/e2e.ts b/packages/horizon/tasks/e2e.ts index dd7eb3366..1ec233bee 100644 --- a/packages/horizon/tasks/e2e.ts +++ b/packages/horizon/tasks/e2e.ts @@ -1,6 +1,6 @@ -import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' -import { task } from 'hardhat/config' import { glob } from 'glob' +import { task } from 'hardhat/config' +import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' task('test:integration', 'Runs all integration tests') .addParam( @@ -15,7 +15,7 @@ task('test:integration', 'Runs all integration tests') // Display banner for the current test phase console.log(getTestPhaseBanner(taskArgs.phase)) - + switch (taskArgs.phase) { case 'during-transition-period': await hre.run(TASK_TEST, { testFiles: duringTransitionPeriodFiles }) @@ -38,25 +38,25 @@ function getTestPhaseBanner(phase: string): string { .split('-') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' ') - + const baseText = 'INTEGRATION TESTS: ' const fullText = baseText + title - + // Calculate minimum banner width needed for the text const contentWidth = fullText.length const bannerWidth = Math.max(47, contentWidth + 10) // Add padding - + // Create the centered text line const paddingLeft = Math.floor((bannerWidth - contentWidth) / 2) const paddingRight = bannerWidth - contentWidth - paddingLeft const centeredLine = '|' + ' '.repeat(paddingLeft) + fullText + ' '.repeat(paddingRight) + '|' - + // Create empty line with correct width const emptyLine = '|' + ' '.repeat(bannerWidth) + '|' - + // Create border with correct width const border = '+' + '-'.repeat(bannerWidth) + '+' - + return ` ${border} ${emptyLine} @@ -64,4 +64,4 @@ ${centeredLine} ${emptyLine} ${border} ` -} \ No newline at end of file +} diff --git a/packages/horizon/tasks/transitions.ts b/packages/horizon/tasks/transitions.ts index 560ec9a34..280d43de8 100644 --- a/packages/horizon/tasks/transitions.ts +++ b/packages/horizon/tasks/transitions.ts @@ -5,7 +5,7 @@ task('transition:unset-subgraph-service', 'Unsets the subgraph service in Horizo .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { console.log(getTransitionBanner('UNSETTING SUBGRAPH SERVICE')) - + const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] const rewardsManager = hre.graph().horizon!.contracts.RewardsManager @@ -20,7 +20,7 @@ task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { console.log(getTransitionBanner('CLEARING THAWING PERIOD')) - + const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking @@ -35,7 +35,7 @@ task('transition:enable-delegation-slashing', 'Enables delegation slashing in Ho .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { console.log(getTransitionBanner('ENABLING DELEGATION SLASHING')) - + const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking @@ -52,14 +52,14 @@ task('transition:enable-delegation-slashing', 'Enables delegation slashing in Ho function getTransitionBanner(title: string): string { const bannerWidth = 47 // Total width inside the box const fullText = title - + // Calculate padding needed to center the text const totalPadding = bannerWidth - fullText.length const leftPadding = Math.floor(totalPadding / 2) const rightPadding = totalPadding - leftPadding - + const centeredText = ' '.repeat(leftPadding) + fullText + ' '.repeat(rightPadding) - + return ` +-----------------------------------------------+ | | @@ -67,4 +67,4 @@ function getTransitionBanner(title: string): string { | | +-----------------------------------------------+ ` -} \ No newline at end of file +} diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts index 63a426811..d48b01901 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts @@ -1,9 +1,11 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { addToDelegationPool, createProvision, diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts index 0232adefc..812f93141 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts @@ -1,10 +1,12 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' import { HDNodeWallet } from 'ethers' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { createProvision, delegate, diff --git a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts index 7f30902db..077cb9690 100644 --- a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts @@ -1,9 +1,11 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { addToDelegationPool, createProvision, diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts index 6a06a56bf..492f06afc 100644 --- a/packages/horizon/test/integration/after-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -1,9 +1,11 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { createProvision, delegate, diff --git a/packages/horizon/test/integration/after-transition-period/operator.test.ts b/packages/horizon/test/integration/after-transition-period/operator.test.ts index 7bd321a54..28990075e 100644 --- a/packages/horizon/test/integration/after-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/operator.test.ts @@ -1,9 +1,11 @@ -import hre from 'hardhat' -import { expect } from 'chai' import { ethers } from 'hardhat' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import { expect } from 'chai' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { createProvision, deprovision, reprovision, stakeTo, thaw, unstake } from '../shared/staking' import { PaymentTypes } from '../utils/types' diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index 0ed1e928e..ceef7a37b 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -1,9 +1,11 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { addToProvision, createProvision, diff --git a/packages/horizon/test/integration/after-transition-period/slasher.test.ts b/packages/horizon/test/integration/after-transition-period/slasher.test.ts index 726fd3e44..25625feeb 100644 --- a/packages/horizon/test/integration/after-transition-period/slasher.test.ts +++ b/packages/horizon/test/integration/after-transition-period/slasher.test.ts @@ -1,10 +1,12 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' import { HDNodeWallet } from 'ethers' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { createProvision, delegate, diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts index a973ce04c..d13fef533 100644 --- a/packages/horizon/test/integration/during-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/delegator.test.ts @@ -1,21 +1,20 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' -import { - withdrawDelegatedLegacy, -} from '../shared/staking' import { delegators } from '../../../scripts/e2e/fixtures/delegators' +import { withdrawDelegatedLegacy } from '../shared/staking' describe('Delegator', () => { let horizonStaking: IHorizonStaking let graphToken: IGraphToken let snapshotId: string - before(async () => { + before(() => { const graph = hre.graph() horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking @@ -33,7 +32,6 @@ describe('Delegator', () => { }) describe('Existing Protocol Users', () => { - describe('User undelegated before horizon was deployed', () => { let indexer: SignerWithAddress let delegator: SignerWithAddress diff --git a/packages/horizon/test/integration/during-transition-period/operator.test.ts b/packages/horizon/test/integration/during-transition-period/operator.test.ts index 489e5f7ab..2e11cdf59 100644 --- a/packages/horizon/test/integration/during-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/operator.test.ts @@ -1,29 +1,29 @@ -import hre from 'hardhat' -import { expect } from 'chai' import { ethers } from 'hardhat' -import { IHorizonStaking, IGraphToken, IRewardsManager } from '../../../typechain-types' +import { expect } from 'chai' +import hre from 'hardhat' +import { keccak256 } from 'ethers' +import { toUtf8Bytes } from 'ethers' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IHorizonStaking, IRewardsManager } from '../../../typechain-types' + import { indexers } from '../../../scripts/e2e/fixtures/indexers' -import { keccak256 } from 'ethers' -import { toUtf8Bytes } from 'ethers' describe('Operator', () => { let horizonStaking: IHorizonStaking let rewardsManager: IRewardsManager - let graphToken: IGraphToken let snapshotId: string // TODO: FIX THIS const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' - before(async () => { + before(() => { const graph = hre.graph() // Get contracts horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking rewardsManager = graph.horizon!.contracts.RewardsManager as unknown as IRewardsManager - graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken }) beforeEach(async () => { @@ -62,7 +62,7 @@ describe('Operator', () => { it('should allow the operator to close an open legacy allocation and collect rewards', async () => { // Use a non-zero POI - const poi = ethers.getBytes(keccak256(toUtf8Bytes("poi"))) + const poi = ethers.getBytes(keccak256(toUtf8Bytes('poi'))) const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() // Get delegation pool before closing allocation @@ -77,7 +77,7 @@ describe('Operator', () => { // Get idle stake before closing allocation const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) - + // Close allocation await horizonStaking.connect(operator).closeAllocation(allocationID, poi) diff --git a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts index eceac9051..ee4347a0f 100644 --- a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts +++ b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts @@ -1,32 +1,26 @@ -import hre from 'hardhat' -import { expect } from 'chai' import { ethers } from 'hardhat' -import { IHorizonStaking, IGraphToken, IRewardsManager, IEpochManager } from '../../../typechain-types' +import { expect } from 'chai' +import hre from 'hardhat' +import { keccak256 } from 'ethers' +import { toUtf8Bytes } from 'ethers' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IEpochManager, IHorizonStaking } from '../../../typechain-types' + import { indexers } from '../../../scripts/e2e/fixtures/indexers' -import { keccak256 } from 'ethers' -import { toUtf8Bytes } from 'ethers' -import EpochManager from '../../../ignition/modules/periphery/EpochManager' describe('Permissionless', () => { let horizonStaking: IHorizonStaking - let rewardsManager: IRewardsManager let epochManager: IEpochManager - let graphToken: IGraphToken let snapshotId: string - // TODO: FIX THIS - const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' - - before(async () => { + before(() => { const graph = hre.graph() // Get contracts horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking - rewardsManager = graph.horizon!.contracts.RewardsManager as unknown as IRewardsManager epochManager = graph.horizon!.contracts.EpochManager as unknown as IEpochManager - graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken }) beforeEach(async () => { @@ -66,7 +60,7 @@ describe('Permissionless', () => { } // Close allocation - await horizonStaking.connect(anySigner).closeAllocation(allocationID, ethers.getBytes(keccak256(toUtf8Bytes("poi")))) + await horizonStaking.connect(anySigner).closeAllocation(allocationID, ethers.getBytes(keccak256(toUtf8Bytes('poi')))) // Get indexer's idle stake after closing allocation const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index 6cf9bec5c..f0c3a23b6 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -1,11 +1,12 @@ -import hre from 'hardhat' -import { expect } from 'chai' -import { ethers } from 'hardhat' import { keccak256, toUtf8Bytes } from 'ethers' +import { ethers } from 'hardhat' +import { expect } from 'chai' +import hre from 'hardhat' -import { IHorizonStaking, IGraphToken, IRewardsManager } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking, IRewardsManager } from '../../../typechain-types' + import { stake, unstake, withdraw } from '../shared/staking' import { collect } from '../shared/stakingExtension' import { indexers } from '../../../scripts/e2e/fixtures/indexers' @@ -15,11 +16,11 @@ describe('Service Provider', () => { let rewardsManager: IRewardsManager let graphToken: IGraphToken let snapshotId: string - + // TODO: FIX THIS const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' - before(async () => { + before(() => { const graph = hre.graph() horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking @@ -39,36 +40,36 @@ describe('Service Provider', () => { describe(('New Protocol Users'), () => { let serviceProvider: SignerWithAddress - + const tokensToStake = ethers.parseEther('1000') - + before(async () => { const signers = await ethers.getSigners() serviceProvider = signers[7] - + // Stake tokens to service provider await stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) }) - + it('should allow service provider to unstake and withdraw after thawing period', async () => { const tokensToUnstake = ethers.parseEther('100') const balanceBefore = await graphToken.balanceOf(serviceProvider.address) - + // First unstake request await unstake({ horizonStaking, serviceProvider, tokens: tokensToUnstake }) - + // During transition period, tokens are locked by thawing period const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() - + // Mine remaining blocks to complete thawing period for (let i = 0; i < Number(thawingPeriod) + 1; i++) { await ethers.provider.send('evm_mine', []) } - + // Now we can withdraw await withdraw({ horizonStaking, serviceProvider }) const balanceAfter = await graphToken.balanceOf(serviceProvider.address) - + expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') }) @@ -121,18 +122,18 @@ describe('Service Provider', () => { it('should allow service provider to withdraw their locked tokens after thawing period passes', async () => { // Get balance before withdrawing const balanceBefore = await graphToken.balanceOf(indexer.address) - + // Get thawing period const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() - + // Mine blocks to complete thawing period for (let i = 0; i < Number(thawingPeriod) + 1; i++) { await ethers.provider.send('evm_mine', []) } - + // Withdraw tokens await withdraw({ horizonStaking, serviceProvider: indexer }) - + // Verify tokens are transferred back to service provider const balanceAfter = await graphToken.balanceOf(indexer.address) expect(balanceAfter).to.equal(balanceBefore + tokensUnstaked, 'Tokens were not transferred back to service provider') @@ -145,7 +146,7 @@ describe('Service Provider', () => { let allocationID: string let allocationTokens: bigint let gateway: SignerWithAddress - + beforeEach(async () => { const indexerFixture = indexers[0] indexer = await ethers.getSigner(indexerFixture.address) @@ -155,28 +156,28 @@ describe('Service Provider', () => { allocationTokens = indexerFixture.allocations[0].tokens gateway = (await ethers.getSigners())[18] }) - + it('should be able to close an open legacy allocation and collect rewards', async () => { // Use a non-zero POI - const poi = ethers.getBytes(keccak256(toUtf8Bytes("poi"))) + const poi = ethers.getBytes(keccak256(toUtf8Bytes('poi'))) const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() // Get delegation pool before closing allocation const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) const delegationPoolTokensBefore = delegationPoolBefore.tokens - + // Mine blocks to simulate time passing const halfThawingPeriod = Number(thawingPeriod) / 2 for (let i = 0; i < halfThawingPeriod; i++) { await ethers.provider.send('evm_mine', []) } - + // Get idle stake before closing allocation const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) - + // Close allocation await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) - + // Get rewards const rewards = await rewardsManager.getRewards(horizonStaking.target, allocationID) // Verify rewards are not zero @@ -193,23 +194,23 @@ describe('Service Provider', () => { const delegationRewardsTokens = rewards - idleStakeRewardsTokens expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationRewardsTokens, 'Delegators cut was not added to delegation pool') }) - + it('should be able to collect indexing fees', async () => { const tokensToCollect = ethers.parseEther('1000') - + // Get idle stake before collecting const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) // Get delegation pool before collecting const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) const delegationPoolTokensBefore = delegationPoolBefore.tokens - + // Collect indexing fees await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) - + // Get idle stake after collecting const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) - + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) const protocolTax = tokensToCollect * 1n / 100n const curationFees = tokensToCollect * 99n / 1000n @@ -226,14 +227,14 @@ describe('Service Provider', () => { expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationCutTokens, 'Delegators cut was not added to delegation pool') }) }) - + describe('With beneficiary', () => { let delegationIndexingCut: number let delegationQueryFeeCut: number let rewardsDestination: string let allocationID: string let gateway: SignerWithAddress - + beforeEach(async () => { const indexerFixture = indexers[1] indexer = await ethers.getSigner(indexerFixture.address) @@ -243,33 +244,33 @@ describe('Service Provider', () => { allocationID = indexerFixture.allocations[0].allocationID gateway = (await ethers.getSigners())[18] }) - + it('should be able to close an open allocation and collect rewards', async () => { // Use a non-zero POI - const poi = ethers.getBytes(keccak256(toUtf8Bytes("poi"))) + const poi = ethers.getBytes(keccak256(toUtf8Bytes('poi'))) const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() // Get delegation tokens before const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) const delegationPoolTokensBefore = delegationPoolBefore.tokens - + // Mine blocks to simulate time passing const halfThawingPeriod = Number(thawingPeriod) / 2 for (let i = 0; i < halfThawingPeriod; i++) { await ethers.provider.send('evm_mine', []) } - + // Get rewards destination balance before closing allocation const balanceBefore = await graphToken.balanceOf(rewardsDestination) - + // Close allocation await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) - + // Get rewards const rewards = await rewardsManager.getRewards(horizonStaking.target, allocationID) // Verify rewards are not zero expect(rewards).to.not.equal(0, 'Rewards were not transferred to rewards destination') - + // Verify indexer rewards cut is transferred to rewards destination const balanceAfter = await graphToken.balanceOf(rewardsDestination) const indexerCutTokens = rewards * BigInt(delegationIndexingCut) / 1000000n @@ -281,23 +282,23 @@ describe('Service Provider', () => { const delegationCutTokens = rewards - indexerCutTokens expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationCutTokens, 'Delegators cut was not added to delegation pool') }) - + it('should be able to collect indexing fees', async () => { const tokensToCollect = ethers.parseEther('1000') - + // Get rewards destination balance before collecting const balanceBefore = await graphToken.balanceOf(rewardsDestination) // Get delegation tokens before const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) const delegationPoolTokensBefore = delegationPoolBefore.tokens - + // Collect indexing fees await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) - + // Get rewards destination balance after collecting const balanceAfter = await graphToken.balanceOf(rewardsDestination) - + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) const protocolTax = tokensToCollect * 1n / 100n const curationFees = tokensToCollect * 99n / 1000n diff --git a/packages/horizon/test/integration/during-transition-period/slasher.test.ts b/packages/horizon/test/integration/during-transition-period/slasher.test.ts index 1600cc863..a3aa0b38d 100644 --- a/packages/horizon/test/integration/during-transition-period/slasher.test.ts +++ b/packages/horizon/test/integration/during-transition-period/slasher.test.ts @@ -1,9 +1,11 @@ -import hre from 'hardhat' import { ethers } from 'hardhat' import { expect } from 'chai' +import hre from 'hardhat' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { indexers } from '../../../scripts/e2e/fixtures/indexers' import { slash } from '../shared/staking' @@ -15,7 +17,7 @@ describe('Slasher', () => { let indexer: string let slasher: SignerWithAddress let tokensToSlash: bigint - + before(async () => { const graph = hre.graph() @@ -36,8 +38,7 @@ describe('Slasher', () => { }) describe('Available tokens', () => { - - before(async () => { + before(() => { const indexerFixture = indexers[0] indexer = indexerFixture.address tokensToSlash = ethers.parseEther('10000') @@ -70,8 +71,7 @@ describe('Slasher', () => { }) describe('Locked tokens', () => { - - before(async () => { + before(() => { const indexerFixture = indexers[1] indexer = indexerFixture.address tokensToSlash = indexerFixture.stake @@ -81,7 +81,7 @@ describe('Slasher', () => { // Before slash state const tokensVerifier = tokensToSlash / 2n const slasherBeforeBalance = await graphToken.balanceOf(slasher.address) - + // Slash tokens await slash({ horizonStaking, diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/horizon/test/integration/shared/staking.ts index 660c07d5b..cf4b936b8 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/horizon/test/integration/shared/staking.ts @@ -1,8 +1,11 @@ +import { ethers, HDNodeWallet } from 'ethers' import { expect } from 'chai' -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' + import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' + +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + import { ThawRequestType } from '../utils/types' -import { ethers, HDNodeWallet } from 'ethers' /* ////////////////////////////////////////////////////////////// STAKE MANAGEMENT diff --git a/packages/horizon/test/integration/shared/stakingExtension.ts b/packages/horizon/test/integration/shared/stakingExtension.ts index c3c3a5746..082ce0f4f 100644 --- a/packages/horizon/test/integration/shared/stakingExtension.ts +++ b/packages/horizon/test/integration/shared/stakingExtension.ts @@ -1,6 +1,7 @@ -import { IHorizonStaking, IGraphToken } from '../../../typechain-types' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { IGraphToken, IHorizonStaking } from '../../../typechain-types' + /* //////////////////////////////////////////////////////////// STAKING EXTENSION ////////////////////////////////////////////////////////////// */ @@ -22,7 +23,7 @@ export async function collect({ }: CollectParams): Promise { // Approve horizon staking contract to pull tokens from gateway await approve(graphToken, gateway, await horizonStaking.getAddress(), tokens) - + // Collect query fees const collectTx = await horizonStaking.connect(gateway).collect(tokens, allocationID) await collectTx.wait() From b08f5d44901e12365dbf25ec25e91f974ecac99a Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 19 Mar 2025 10:54:53 -0300 Subject: [PATCH 11/23] chore: cleanup --- packages/horizon/hardhat.config.ts | 2 +- packages/horizon/scripts/e2e/e2e | 17 ++++++-- packages/horizon/scripts/e2e/pre-upgrade.ts | 13 +----- .../horizon/scripts/e2e/transfer-ownership.ts | 14 ++----- packages/horizon/tasks/e2e.ts | 32 +-------------- packages/horizon/tasks/transitions.ts | 30 +++----------- packages/horizon/utils/banners.ts | 41 +++++++++++++++++++ 7 files changed, 68 insertions(+), 81 deletions(-) create mode 100644 packages/horizon/utils/banners.ts diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts index 0cc3af3cf..9f6242a58 100644 --- a/packages/horizon/hardhat.config.ts +++ b/packages/horizon/hardhat.config.ts @@ -3,7 +3,7 @@ import { hardhatBaseConfig } from 'hardhat-graph-protocol/sdk' import { HardhatUserConfig } from 'hardhat/types' import { join } from 'path' -// Plugin imports (single imports) +// Hardhat plugins import '@nomicfoundation/hardhat-foundry' import '@nomicfoundation/hardhat-toolbox' import '@nomicfoundation/hardhat-ignition-ethers' diff --git a/packages/horizon/scripts/e2e/e2e b/packages/horizon/scripts/e2e/e2e index 2ebf663e9..46e1a332a 100755 --- a/packages/horizon/scripts/e2e/e2e +++ b/packages/horizon/scripts/e2e/e2e @@ -12,10 +12,6 @@ export SECURE_ACCOUNTS_DISABLE_PROVIDER=true # Function to cleanup resources cleanup() { - # Remove ignition deployment files - echo "Removing ignition deployment files..." - rm -rf ignition/deployments/horizon-localhost - # Kill hardhat node only if we started it if [ ! -z "$NODE_PID" ] && [ "$STARTED_NODE" = true ]; then echo "Cleaning up node process..." @@ -40,6 +36,19 @@ cleanup() { # Set trap to call cleanup function on script exit (normal or error) trap cleanup EXIT +# Check if ignition deployment folder exists and prompt before proceeding +if [ -d "ignition/deployments/horizon-localhost" ]; then + read -p "Ignition deployment files already exist. These must be removed for the tests to work properly. Remove them? (y/n) [y]: " confirm + confirm=${confirm:-y} + if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then + echo "Removing existing ignition deployment files..." + rm -rf ignition/deployments/horizon-localhost + else + echo "Cannot continue with existing deployment files. Exiting." + exit 1 + fi +fi + # Check required env variables if [ -z "$ARBITRUM_SEPOLIA_RPC" ]; then echo "ARBITRUM_SEPOLIA_RPC environment variable is required" diff --git a/packages/horizon/scripts/e2e/pre-upgrade.ts b/packages/horizon/scripts/e2e/pre-upgrade.ts index 7706b9b9e..d843bcee7 100644 --- a/packages/horizon/scripts/e2e/pre-upgrade.ts +++ b/packages/horizon/scripts/e2e/pre-upgrade.ts @@ -9,6 +9,7 @@ import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' import { mergeABIs } from 'hardhat-graph-protocol/sdk' import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' +import { createBanner } from '../../utils/banners' import { delegators } from './fixtures/delegators' import { indexers } from './fixtures/indexers' @@ -33,7 +34,7 @@ function generateAllocationProof(indexerAddress: string, allocationPrivateKey: s const randomHexBytes = (n = 32): string => ethers.hexlify(ethers.randomBytes(n)) async function main() { - console.log(getBanner()) + console.log(createBanner('PRE-HORIZON UPGRADE SETUP')) console.log('\n--- STEP 0: Setup ---') @@ -194,13 +195,3 @@ main() console.error(error) process.exitCode = 1 }) - -function getBanner() { - return ` -+-----------------------------------------------+ -| | -| PRE-HORIZON UPGRADE SETUP | -| | -+-----------------------------------------------+ - ` -} diff --git a/packages/horizon/scripts/e2e/transfer-ownership.ts b/packages/horizon/scripts/e2e/transfer-ownership.ts index 238bf5c83..20f3ac90c 100644 --- a/packages/horizon/scripts/e2e/transfer-ownership.ts +++ b/packages/horizon/scripts/e2e/transfer-ownership.ts @@ -7,8 +7,10 @@ import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' import { mergeABIs } from 'hardhat-graph-protocol/sdk' import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' +import { createBanner } from '../../utils/banners' + async function main() { - console.log(getBanner()) + console.log(createBanner('TRANSFER OWNERSHIP')) // Check that we're on a local network if (hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { @@ -94,13 +96,3 @@ main() console.error(error) process.exit(1) }) - -function getBanner() { - return ` - +-----------------------------------------------+ - | | - | TRANSFER OWNERSHIP SCRIPT | - | | - +-----------------------------------------------+ - ` -} diff --git a/packages/horizon/tasks/e2e.ts b/packages/horizon/tasks/e2e.ts index 1ec233bee..28688acb0 100644 --- a/packages/horizon/tasks/e2e.ts +++ b/packages/horizon/tasks/e2e.ts @@ -1,6 +1,7 @@ import { glob } from 'glob' import { task } from 'hardhat/config' import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' +import { createBanner } from '../utils/banners' task('test:integration', 'Runs all integration tests') .addParam( @@ -34,34 +35,5 @@ task('test:integration', 'Runs all integration tests') }) function getTestPhaseBanner(phase: string): string { - const title = phase - .split('-') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' ') - - const baseText = 'INTEGRATION TESTS: ' - const fullText = baseText + title - - // Calculate minimum banner width needed for the text - const contentWidth = fullText.length - const bannerWidth = Math.max(47, contentWidth + 10) // Add padding - - // Create the centered text line - const paddingLeft = Math.floor((bannerWidth - contentWidth) / 2) - const paddingRight = bannerWidth - contentWidth - paddingLeft - const centeredLine = '|' + ' '.repeat(paddingLeft) + fullText + ' '.repeat(paddingRight) + '|' - - // Create empty line with correct width - const emptyLine = '|' + ' '.repeat(bannerWidth) + '|' - - // Create border with correct width - const border = '+' + '-'.repeat(bannerWidth) + '+' - - return ` -${border} -${emptyLine} -${centeredLine} -${emptyLine} -${border} -` + return createBanner(phase, 'INTEGRATION TESTS: ') } diff --git a/packages/horizon/tasks/transitions.ts b/packages/horizon/tasks/transitions.ts index 280d43de8..837b6819c 100644 --- a/packages/horizon/tasks/transitions.ts +++ b/packages/horizon/tasks/transitions.ts @@ -1,13 +1,15 @@ import { task, types } from 'hardhat/config' +import { createBanner } from '../utils/banners' import { ethers } from 'ethers' task('transition:unset-subgraph-service', 'Unsets the subgraph service in HorizonStaking') .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { - console.log(getTransitionBanner('UNSETTING SUBGRAPH SERVICE')) + console.log(createBanner('UNSETTING SUBGRAPH SERVICE')) const signers = await hre.ethers.getSigners() - const governor = signers[taskArgs.governorIndex] + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const governor = signers[taskArgs.governorIndex] as any const rewardsManager = hre.graph().horizon!.contracts.RewardsManager console.log('Unsetting subgraph service...') @@ -19,7 +21,7 @@ task('transition:unset-subgraph-service', 'Unsets the subgraph service in Horizo task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { - console.log(getTransitionBanner('CLEARING THAWING PERIOD')) + console.log(createBanner('CLEARING THAWING PERIOD')) const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] @@ -34,7 +36,7 @@ task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') task('transition:enable-delegation-slashing', 'Enables delegation slashing in HorizonStaking') .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { - console.log(getTransitionBanner('ENABLING DELEGATION SLASHING')) + console.log(createBanner('ENABLING DELEGATION SLASHING')) const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] @@ -48,23 +50,3 @@ task('transition:enable-delegation-slashing', 'Enables delegation slashing in Ho const delegationSlashingEnabled = await horizonStaking.isDelegationSlashingEnabled() console.log('Delegation slashing enabled:', delegationSlashingEnabled) }) - -function getTransitionBanner(title: string): string { - const bannerWidth = 47 // Total width inside the box - const fullText = title - - // Calculate padding needed to center the text - const totalPadding = bannerWidth - fullText.length - const leftPadding = Math.floor(totalPadding / 2) - const rightPadding = totalPadding - leftPadding - - const centeredText = ' '.repeat(leftPadding) + fullText + ' '.repeat(rightPadding) - - return ` -+-----------------------------------------------+ -| | -|${centeredText}| -| | -+-----------------------------------------------+ -` -} diff --git a/packages/horizon/utils/banners.ts b/packages/horizon/utils/banners.ts new file mode 100644 index 000000000..7cdcdc3b3 --- /dev/null +++ b/packages/horizon/utils/banners.ts @@ -0,0 +1,41 @@ +/** + * Creates a box-style banner with centered text + * @param title The main title text to display + * @param prefix Optional prefix text that appears before the title (default: '') + * @param minWidth Minimum width of the banner (default: 47) + * @returns A string containing the formatted banner + */ +export function createBanner(title: string, prefix = '', minWidth = 47): string { + // Format title with capitalized words if it contains hyphens + const formattedTitle = title.includes('-') + ? title + .split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' ') + : title + + const fullText = prefix + formattedTitle + + // Calculate minimum banner width needed for the text + const contentWidth = fullText.length + const bannerWidth = Math.max(minWidth, contentWidth + 10) // Add padding + + // Create the centered text line + const paddingLeft = Math.floor((bannerWidth - contentWidth) / 2) + const paddingRight = bannerWidth - contentWidth - paddingLeft + const centeredLine = '|' + ' '.repeat(paddingLeft) + fullText + ' '.repeat(paddingRight) + '|' + + // Create empty line with correct width + const emptyLine = '|' + ' '.repeat(bannerWidth) + '|' + + // Create border with correct width + const border = '+' + '-'.repeat(bannerWidth) + '+' + + return ` +${border} +${emptyLine} +${centeredLine} +${emptyLine} +${border} +` +} From 42cc449a8fd997bf43ffc782209590aca777aabd Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 19 Mar 2025 14:55:55 -0300 Subject: [PATCH 12/23] fix: during transition period test fixes --- .../service-provider.test.ts | 66 +++++++++++++++++-- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index f0c3a23b6..997492b6c 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -92,8 +92,18 @@ describe('Service Provider', () => { // Second unstake request await unstake({ horizonStaking, serviceProvider, tokens: request2 }) + // Mine remaining blocks to complete first unstake thawing period + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Check that withdraw reverts since thawing period is not complete + await expect( + withdraw({ horizonStaking, serviceProvider }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingStillThawing') + // Mine remaining blocks to complete thawing period - for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + for (let i = 0; i < halfThawingPeriod + 1; i++) { await ethers.provider.send('evm_mine', []) } @@ -195,7 +205,53 @@ describe('Service Provider', () => { expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationRewardsTokens, 'Delegators cut was not added to delegation pool') }) - it('should be able to collect indexing fees', async () => { + it('should be able to collect query fees', async () => { + const tokensToCollect = ethers.parseEther('1000') + + // Get idle stake before collecting + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Get delegation pool before collecting + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Collect query fees + await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) + + // Get idle stake after collecting + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) + const protocolTax = tokensToCollect * 1n / 100n + const curationFees = tokensToCollect * 99n / 1000n + const remainingTokens = tokensToCollect - protocolTax - curationFees + + // Verify tokens minus delegators cut are restaked + const indexerCutTokens = remainingTokens * BigInt(delegationQueryFeeCut) / 1000000n + expect(idleStakeAfter).to.equal(idleStakeBefore + indexerCutTokens, 'Indexer cut was not restaked') + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationCutTokens = remainingTokens - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationCutTokens, 'Delegators cut was not added to delegation pool') + }) + + it('should be able to close an allocation and collect query fees for the closed allocation', async () => { + // Use a non-zero POI + const poi = ethers.getBytes(keccak256(toUtf8Bytes('poi'))) + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Close allocation + await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) + + // Tokens to collect const tokensToCollect = ethers.parseEther('1000') // Get idle stake before collecting @@ -205,7 +261,7 @@ describe('Service Provider', () => { const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) const delegationPoolTokensBefore = delegationPoolBefore.tokens - // Collect indexing fees + // Collect query fees await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) // Get idle stake after collecting @@ -283,7 +339,7 @@ describe('Service Provider', () => { expect(delegationPoolTokensAfter).to.equal(delegationPoolTokensBefore + delegationCutTokens, 'Delegators cut was not added to delegation pool') }) - it('should be able to collect indexing fees', async () => { + it('should be able to collect query fees', async () => { const tokensToCollect = ethers.parseEther('1000') // Get rewards destination balance before collecting @@ -293,7 +349,7 @@ describe('Service Provider', () => { const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) const delegationPoolTokensBefore = delegationPoolBefore.tokens - // Collect indexing fees + // Collect query fees await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) // Get rewards destination balance after collecting From 48bbd4bcef29e8c3d42dff98903e0a4b3b84058c Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Tue, 25 Mar 2025 09:51:57 -0300 Subject: [PATCH 13/23] chore: rename e2e to integration and moved scripts to hh tasks --- packages/horizon/hardhat.config.ts | 28 ++- packages/horizon/package.json | 8 +- packages/horizon/scripts/e2e/pre-upgrade.ts | 197 ------------------ .../horizon/scripts/e2e/transfer-ownership.ts | 98 --------- .../scripts/{e2e/e2e => test/integration} | 22 +- .../e2e => tasks/test}/fixtures/delegators.ts | 0 .../e2e => tasks/test}/fixtures/indexers.ts | 0 .../tasks/{e2e.ts => test/integration.ts} | 3 +- packages/horizon/tasks/test/pre-upgrade.ts | 192 +++++++++++++++++ .../horizon/tasks/test/transfer-onwership.ts | 94 +++++++++ .../horizon/tasks/{ => test}/transitions.ts | 2 +- .../delegator.test.ts | 2 +- .../during-transition-period/operator.test.ts | 2 +- .../permissionless.test.ts | 2 +- .../service-provider.test.ts | 2 +- .../during-transition-period/slasher.test.ts | 2 +- 16 files changed, 318 insertions(+), 336 deletions(-) delete mode 100644 packages/horizon/scripts/e2e/pre-upgrade.ts delete mode 100644 packages/horizon/scripts/e2e/transfer-ownership.ts rename packages/horizon/scripts/{e2e/e2e => test/integration} (80%) rename packages/horizon/{scripts/e2e => tasks/test}/fixtures/delegators.ts (100%) rename packages/horizon/{scripts/e2e => tasks/test}/fixtures/indexers.ts (100%) rename packages/horizon/tasks/{e2e.ts => test/integration.ts} (96%) create mode 100644 packages/horizon/tasks/test/pre-upgrade.ts create mode 100644 packages/horizon/tasks/test/transfer-onwership.ts rename packages/horizon/tasks/{ => test}/transitions.ts (97%) diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts index 9f6242a58..427609c92 100644 --- a/packages/horizon/hardhat.config.ts +++ b/packages/horizon/hardhat.config.ts @@ -13,21 +13,29 @@ import 'hardhat-secure-accounts' // Hardhat tasks function loadTasks() { const tasksPath = join(__dirname, 'tasks') - readdirSync(tasksPath) - .filter(pth => pth.includes('.ts')) - .forEach((file) => { - require(join(tasksPath, file)) + + // Helper function to recursively load tasks from directories + function loadTasksFromDir(dir: string) { + readdirSync(dir, { withFileTypes: true }).forEach((dirent) => { + const fullPath = join(dir, dirent.name) + + if (dirent.isDirectory()) { + // Recursively process subdirectories + loadTasksFromDir(fullPath) + } else if (dirent.isFile() && dirent.name.includes('.ts')) { + // Load task file + require(fullPath) + } }) -} + } -if (existsSync(join(__dirname, 'build/contracts'))) { - loadTasks() + // Start recursive loading from the tasks directory + loadTasksFromDir(tasksPath) } -// Skip importing hardhat-graph-protocol when building the project, it has circular dependency -if (process.env.BUILD_RUN !== 'true') { +if (existsSync(join(__dirname, 'build/contracts'))) { require('hardhat-graph-protocol') - require('./tasks/deploy') + loadTasks() } const config: HardhatUserConfig = { diff --git a/packages/horizon/package.json b/packages/horizon/package.json index 33d291671..5249e17e4 100644 --- a/packages/horizon/package.json +++ b/packages/horizon/package.json @@ -18,11 +18,11 @@ "lint:sol:solhint": "solhint --noPrompt --fix contracts/**/*.sol --config node_modules/solhint-graph-config/index.js", "lint:sol:natspec": "natspec-smells --config natspec-smells.config.js", "clean": "rm -rf build dist cache cache_forge typechain-types", - "build": "BUILD_RUN=true hardhat compile", - "test": "forge test", + "build": "hardhat compile", + "test": "forge test && hardhat test:integration --deploy-type deploy", "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test", - "test:integration": "hardhat test:integration --deploy-type deploy", - "test:e2e": "./scripts/e2e/e2e" + "test:e2e": "./scripts/e2e/e2e", + "test:integration": "./scripts/test/integration" }, "devDependencies": { "@defi-wonderland/natspec-smells": "^1.1.6", diff --git a/packages/horizon/scripts/e2e/pre-upgrade.ts b/packages/horizon/scripts/e2e/pre-upgrade.ts deleted file mode 100644 index d843bcee7..000000000 --- a/packages/horizon/scripts/e2e/pre-upgrade.ts +++ /dev/null @@ -1,197 +0,0 @@ -import hre, { ethers } from 'hardhat' -import { Contract } from 'ethers' - -import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' - -import { IGraphToken, IStaking } from '@graphprotocol/contracts' -import L2GraphTokenABI from '@graphprotocol/contracts/build/abis/L2GraphToken.json' -import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' -import { mergeABIs } from 'hardhat-graph-protocol/sdk' -import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' - -import { createBanner } from '../../utils/banners' -import { delegators } from './fixtures/delegators' -import { indexers } from './fixtures/indexers' - -// The account on Arbitrum Sepolia that has GRT tokens -const GRT_HOLDER_ADDRESS = process.env.GRT_HOLDER_ADDRESS || '0xadE6B8EB69a49B56929C1d4F4b428d791861dB6f' - -// Load ABIs -const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) -const graphTokenABI = L2GraphTokenABI - -// Generate allocation proof with the indexer's address and the allocation id, signed by the allocation private key -function generateAllocationProof(indexerAddress: string, allocationPrivateKey: string) { - const wallet = new ethers.Wallet(allocationPrivateKey) - const messageHash = ethers.solidityPackedKeccak256( - ['address', 'address'], - [indexerAddress, wallet.address], - ) - const messageHashBytes = ethers.getBytes(messageHash) - return wallet.signMessage(messageHashBytes) -} - -const randomHexBytes = (n = 32): string => ethers.hexlify(ethers.randomBytes(n)) - -async function main() { - console.log(createBanner('PRE-HORIZON UPGRADE SETUP')) - - console.log('\n--- STEP 0: Setup ---') - - // Verify that hardhat network accounts are set to remote, otherwise we won't be able to impersonate them - if (hre.network.config.accounts !== 'remote') { - throw new Error('Hardhat network accounts must be set to remote') - } - - // Load contract addresses from addresses.json - const addressesJson = require('@graphprotocol/contracts/addresses.json') - const arbSepoliaAddresses = addressesJson['421614'] - - // Get contract addresses - const stakingAddress = arbSepoliaAddresses.L2Staking.address - const graphTokenAddress = arbSepoliaAddresses.L2GraphToken.address - - console.log(`Using Staking contract at: ${stakingAddress}`) - console.log(`Using GraphToken contract at: ${graphTokenAddress}`) - - // Create contract instances - const provider = new HardhatEthersProvider(hre.network.provider, hre.network.name) - const GraphToken = new Contract(graphTokenAddress, graphTokenABI, provider) as unknown as IGraphToken - const Staking = new Contract(stakingAddress, combinedStakingABI, provider) as unknown as IStaking - - // The account on Arbitrum Sepolia that has GRT tokens - const assetHolderBalance = BigInt((await GraphToken.balanceOf(GRT_HOLDER_ADDRESS)).toString()) - console.log(`Asset holder balance: ${assetHolderBalance}`) - - // Convert BigNumber to bigint for comparison - if (assetHolderBalance < ethers.parseEther('20000000')) { - throw new Error('Asset holder balance is less than 20M tokens') - } - - // Impersonate the account - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const grtHolder = await ethers.getImpersonatedSigner(GRT_HOLDER_ADDRESS) as any - - // Fund with GRT signers from 0 to 19 with 1M tokens - console.log('Funding signers from 0 to 19 with 1M tokens...') - const signers = await ethers.getSigners() - for (let i = 0; i < 20; i++) { - const signer = signers[i] - const transferTx = await GraphToken.connect(grtHolder).transfer(signer.address, ethers.parseEther('1000000')) - await transferTx.wait() - } - - // STEP 1: Fund and stake for indexers - console.log('\n--- STEP 1: Indexers Setup ---') - for (const indexer of indexers) { - // Impersonate the indexer - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const indexerSigner = await ethers.getSigner(indexer.address) as any - - // Approve and stake - console.log(`Staking ${indexer.stake} tokens for indexer ${indexer.address}...`) - const approveTx = await GraphToken.connect(indexerSigner).approve(stakingAddress, indexer.stake) - await approveTx.wait() - const stakeTx = await Staking.connect(indexerSigner).stake(indexer.stake) - await stakeTx.wait() - - // Set delegation parameters - console.log(`Setting delegation parameters for indexer ${indexer.address}...`) - const setDelegationParametersTx = await Staking.connect(indexerSigner).setDelegationParameters(indexer.indexingRewardCut, indexer.queryFeeCut, 0) - await setDelegationParametersTx.wait() - - // Set rewards destination if it exists - if (indexer.rewardsDestination) { - console.log(`Setting rewards destination for indexer ${indexer.address} to ${indexer.rewardsDestination}...`) - const setRewardsDestinationTx = await Staking.connect(indexerSigner).setRewardsDestination(indexer.rewardsDestination) - await setRewardsDestinationTx.wait() - } - } - - // STEP 2: Fund and delegate for delegators - console.log('\n--- STEP 2: Delegators Delegating ---') - for (const delegator of delegators) { - // Impersonate the delegator - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const delegatorSigner = await ethers.getSigner(delegator.address) as any - - // Delegate to each indexer - for (const delegation of delegator.delegations) { - console.log(`Delegating ${delegation.tokens} tokens from ${delegator.address} to indexer ${delegation.indexerAddress}...`) - const delegationApproveTx = await GraphToken.connect(delegatorSigner).approve(stakingAddress, delegation.tokens) - await delegationApproveTx.wait() - const delegateTx = await Staking.connect(delegatorSigner).delegate(delegation.indexerAddress, delegation.tokens) - await delegateTx.wait() - } - } - - // STEP 3: Create allocations - console.log('\n--- STEP 3: Creating Allocations ---') - for (const indexer of indexers) { - // Impersonate the indexer - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const indexerSigner = await ethers.getSigner(indexer.address) as any - - for (const allocation of indexer.allocations) { - console.log(`Creating allocation of ${allocation.tokens} tokens from indexer ${indexer.address} on subgraph ${allocation.subgraphDeploymentID}...`) - - const allocateTx = await Staking.connect(indexerSigner).allocate( - allocation.subgraphDeploymentID, - allocation.tokens, - allocation.allocationID, - randomHexBytes(), // metadata - await generateAllocationProof(indexer.address, allocation.allocationPrivateKey), - ) - await allocateTx.wait() - } - } - - // STEP 4: Indexer unstakes - console.log('\n--- STEP 4: Indexer unstakes ---') - for (const indexer of indexers) { - if (indexer.tokensToUnstake) { - console.log(`Indexer ${indexer.address} is unstaking...`) - - // Impersonate the indexer - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const indexerSigner = await ethers.getSigner(indexer.address) as any - - // Unstake - const unstakeTx = await Staking.connect(indexerSigner).unstake(indexer.tokensToUnstake) - await unstakeTx.wait() - } - } - - // STEP 5: Undelegate - console.log('\n--- STEP 5: Undelegating ---') - for (const delegator of delegators) { - if (delegator.undelegate) { - console.log(`Delegator ${delegator.address} is undelegating...`) - - // Impersonate the delegator - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const delegatorSigner = await ethers.getSigner(delegator.address) as any - - for (const delegation of delegator.delegations) { - // Get the delegation information - const delegationInfo = await Staking.getDelegation(delegation.indexerAddress, delegator.address) - const shares = BigInt(delegationInfo.shares.toString()) - - console.log(`Undelegating ${shares} shares from indexer ${delegation.indexerAddress}...`) - - // Undelegate the shares - const undelegateTx = await Staking.connect(delegatorSigner).undelegate(delegation.indexerAddress, shares) - await undelegateTx.wait() - } - } - } - - console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Pre-upgrade state setup complete! πŸŽ‰ ✨ πŸš€ βœ…\n') -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error) - process.exitCode = 1 - }) diff --git a/packages/horizon/scripts/e2e/transfer-ownership.ts b/packages/horizon/scripts/e2e/transfer-ownership.ts deleted file mode 100644 index 20f3ac90c..000000000 --- a/packages/horizon/scripts/e2e/transfer-ownership.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Contract } from 'ethers' -import { ethers } from 'hardhat' -import hre from 'hardhat' - -import { IStaking } from '@graphprotocol/contracts' -import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' -import { mergeABIs } from 'hardhat-graph-protocol/sdk' -import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' - -import { createBanner } from '../../utils/banners' - -async function main() { - console.log(createBanner('TRANSFER OWNERSHIP')) - - // Check that we're on a local network - if (hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { - throw new Error('This script can only be run on localhost or hardhat network') - } - - console.log('\n--- STEP 0: Setup ---') - - // Get signers - const signers = await ethers.getSigners() - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const newGovernor = signers[1] as any - const newSlasher = signers[2] - - console.log(`New governor will be: ${newGovernor.address}`) - - // Get contract addresses - const addressesJson = require('@graphprotocol/contracts/addresses.json') - const arbSepoliaAddresses = addressesJson['421614'] - const stakingAddress = arbSepoliaAddresses.L2Staking.address - - // Get ABIs - const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) - - // Get contracts - const staking = new Contract(stakingAddress, combinedStakingABI, ethers.provider) as unknown as IStaking - const controller = hre.graph().horizon!.contracts.Controller - const graphProxyAdmin = hre.graph().horizon!.contracts.GraphProxyAdmin - - // Get current owners - const controllerGovernor = await controller.governor() - const proxyAdminGovernor = await graphProxyAdmin.governor() - - console.log(`Current Controller governor: ${controllerGovernor}`) - console.log(`Current GraphProxyAdmin governor: ${proxyAdminGovernor}`) - - // Get impersonated signers - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const controllerSigner = await ethers.getImpersonatedSigner(controllerGovernor) as any - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const proxyAdminSigner = await ethers.getImpersonatedSigner(proxyAdminGovernor) as any - - console.log('\n--- STEP 1: Transfer ownership of Controller ---') - - // Transfer Controller ownership - console.log('Transferring Controller ownership...') - const controllerTx = await controller.connect(controllerSigner).transferOwnership(newGovernor.address) - await controllerTx.wait() - console.log('Accepting Controller ownership...') - - // Accept ownership of Controller - const acceptControllerTx = await controller.connect(newGovernor).acceptOwnership() - await acceptControllerTx.wait() - console.log(`New Controller governor: ${await controller.governor()}`) - - console.log('\n--- STEP 2: Transfer ownership of GraphProxyAdmin ---') - - // Transfer GraphProxyAdmin ownership - console.log('Transferring GraphProxyAdmin ownership...') - const proxyAdminTx = await graphProxyAdmin.connect(proxyAdminSigner).transferOwnership(newGovernor.address) - await proxyAdminTx.wait() - console.log('Accepting GraphProxyAdmin ownership...') - - // Accept ownership of GraphProxyAdmin - const acceptProxyAdminTx = await graphProxyAdmin.connect(newGovernor).acceptOwnership() - await acceptProxyAdminTx.wait() - console.log(`New GraphProxyAdmin governor: ${await graphProxyAdmin.governor()}`) - - console.log('\n--- STEP 3: Assign new slasher ---') - - // Assign new slasher - console.log('Assigning new slasher...') - const slasherTx = await staking.connect(newGovernor).setSlasher(newSlasher.address, true) - await slasherTx.wait() - console.log(`New slasher: ${newSlasher.address}, allowed: ${await staking.slashers(newSlasher.address)}`) - - console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Transfer ownership complete! πŸŽ‰ ✨ πŸš€ βœ…\n') -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error) - process.exit(1) - }) diff --git a/packages/horizon/scripts/e2e/e2e b/packages/horizon/scripts/test/integration similarity index 80% rename from packages/horizon/scripts/e2e/e2e rename to packages/horizon/scripts/test/integration index 46e1a332a..8648ea993 100755 --- a/packages/horizon/scripts/e2e/e2e +++ b/packages/horizon/scripts/test/integration @@ -2,10 +2,6 @@ set -eo pipefail -# Save original environment variable values -ORIGINAL_HARDHAT_FORK=${HARDHAT_FORK:-""} -ORIGINAL_SECURE_ACCOUNTS_DISABLE_PROVIDER=${SECURE_ACCOUNTS_DISABLE_PROVIDER:-""} - # Set environment variables for this script export HARDHAT_FORK=true export SECURE_ACCOUNTS_DISABLE_PROVIDER=true @@ -17,20 +13,6 @@ cleanup() { echo "Cleaning up node process..." kill $NODE_PID 2>/dev/null || true fi - - # Restore original environment variables - echo "Restoring original environment variables..." - if [ -z "$ORIGINAL_HARDHAT_FORK" ]; then - unset HARDHAT_FORK - else - export HARDHAT_FORK="$ORIGINAL_HARDHAT_FORK" - fi - - if [ -z "$ORIGINAL_SECURE_ACCOUNTS_DISABLE_PROVIDER" ]; then - unset SECURE_ACCOUNTS_DISABLE_PROVIDER - else - export SECURE_ACCOUNTS_DISABLE_PROVIDER="$ORIGINAL_SECURE_ACCOUNTS_DISABLE_PROVIDER" - fi } # Set trap to call cleanup function on script exit (normal or error) @@ -75,10 +57,10 @@ else fi # Setup pre horizon migration state needed for the e2e tests -npx hardhat run ./scripts/e2e/pre-upgrade.ts --network localhost +npx hardhat test:integration:pre-upgrade --network localhost # Transfer ownership of protocol to hardhat signer 1 -npx hardhat run ./scripts/e2e/transfer-ownership.ts --network localhost +npx hardhat test:integration:transfer-ownership --network localhost # Step 1 - Deployer npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 1 --signer-index 0 diff --git a/packages/horizon/scripts/e2e/fixtures/delegators.ts b/packages/horizon/tasks/test/fixtures/delegators.ts similarity index 100% rename from packages/horizon/scripts/e2e/fixtures/delegators.ts rename to packages/horizon/tasks/test/fixtures/delegators.ts diff --git a/packages/horizon/scripts/e2e/fixtures/indexers.ts b/packages/horizon/tasks/test/fixtures/indexers.ts similarity index 100% rename from packages/horizon/scripts/e2e/fixtures/indexers.ts rename to packages/horizon/tasks/test/fixtures/indexers.ts diff --git a/packages/horizon/tasks/e2e.ts b/packages/horizon/tasks/test/integration.ts similarity index 96% rename from packages/horizon/tasks/e2e.ts rename to packages/horizon/tasks/test/integration.ts index 28688acb0..23a49620f 100644 --- a/packages/horizon/tasks/e2e.ts +++ b/packages/horizon/tasks/test/integration.ts @@ -1,7 +1,8 @@ import { glob } from 'glob' import { task } from 'hardhat/config' import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' -import { createBanner } from '../utils/banners' + +import { createBanner } from '../../utils/banners' task('test:integration', 'Runs all integration tests') .addParam( diff --git a/packages/horizon/tasks/test/pre-upgrade.ts b/packages/horizon/tasks/test/pre-upgrade.ts new file mode 100644 index 000000000..ad5f0cc51 --- /dev/null +++ b/packages/horizon/tasks/test/pre-upgrade.ts @@ -0,0 +1,192 @@ +import { Contract } from 'ethers' +import { task } from 'hardhat/config' + +import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' + +import { IGraphToken, IStaking } from '@graphprotocol/contracts' +import L2GraphTokenABI from '@graphprotocol/contracts/build/abis/L2GraphToken.json' +import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' +import { mergeABIs } from 'hardhat-graph-protocol/sdk' +import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' + +import { createBanner } from '../../utils/banners' +import { delegators } from './fixtures/delegators' +import { indexers } from './fixtures/indexers' + +// The account on Arbitrum Sepolia that has GRT tokens +const GRT_HOLDER_ADDRESS = process.env.GRT_HOLDER_ADDRESS || '0xadE6B8EB69a49B56929C1d4F4b428d791861dB6f' + +// Load ABIs +const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) +const graphTokenABI = L2GraphTokenABI + +task('test:integration:pre-upgrade', 'Sets up the pre-upgrade state for testing') + .setAction(async (_, hre) => { + console.log(createBanner('PRE-HORIZON UPGRADE SETUP')) + + console.log('\n--- STEP 0: Setup ---') + + // Helper functions that use hre.ethers + // Generate allocation proof with the indexer's address and the allocation id, signed by the allocation private key + const generateAllocationProof = async (indexerAddress: string, allocationPrivateKey: string) => { + const wallet = new hre.ethers.Wallet(allocationPrivateKey) + const messageHash = hre.ethers.solidityPackedKeccak256( + ['address', 'address'], + [indexerAddress, wallet.address], + ) + const messageHashBytes = hre.ethers.getBytes(messageHash) + return wallet.signMessage(messageHashBytes) + } + + const randomHexBytes = (n = 32): string => hre.ethers.hexlify(hre.ethers.randomBytes(n)) + + // Verify that hardhat network accounts are set to remote, otherwise we won't be able to impersonate them + if (hre.network.config.accounts !== 'remote') { + throw new Error('Hardhat network accounts must be set to remote') + } + + // Load contract addresses from addresses.json + const addressesJson = require('@graphprotocol/contracts/addresses.json') + const arbSepoliaAddresses = addressesJson['421614'] + + // Get contract addresses + const stakingAddress = arbSepoliaAddresses.L2Staking.address + const graphTokenAddress = arbSepoliaAddresses.L2GraphToken.address + + console.log(`Using Staking contract at: ${stakingAddress}`) + console.log(`Using GraphToken contract at: ${graphTokenAddress}`) + + // Create contract instances + const provider = new HardhatEthersProvider(hre.network.provider, hre.network.name) + const GraphToken = new Contract(graphTokenAddress, graphTokenABI, provider) as unknown as IGraphToken + const Staking = new Contract(stakingAddress, combinedStakingABI, provider) as unknown as IStaking + + // The account on Arbitrum Sepolia that has GRT tokens + const assetHolderBalance = BigInt((await GraphToken.balanceOf(GRT_HOLDER_ADDRESS)).toString()) + console.log(`Asset holder balance: ${assetHolderBalance}`) + + // Convert BigNumber to bigint for comparison + if (assetHolderBalance < hre.ethers.parseEther('20000000')) { + throw new Error('Asset holder balance is less than 20M tokens') + } + + // Impersonate the account + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const grtHolder = await hre.ethers.getImpersonatedSigner(GRT_HOLDER_ADDRESS) as any + + // Fund with GRT signers from 0 to 19 with 1M tokens + console.log('Funding signers from 0 to 19 with 1M tokens...') + const signers = await hre.ethers.getSigners() + for (let i = 0; i < 20; i++) { + const signer = signers[i] + const transferTx = await GraphToken.connect(grtHolder).transfer(signer.address, hre.ethers.parseEther('1000000')) + await transferTx.wait() + } + + // STEP 1: Fund and stake for indexers + console.log('\n--- STEP 1: Indexers Setup ---') + for (const indexer of indexers) { + // Impersonate the indexer + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const indexerSigner = await hre.ethers.getImpersonatedSigner(indexer.address) as any + + // Approve and stake + console.log(`Staking ${indexer.stake} tokens for indexer ${indexer.address}...`) + const approveTx = await GraphToken.connect(indexerSigner).approve(stakingAddress, indexer.stake) + await approveTx.wait() + const stakeTx = await Staking.connect(indexerSigner).stake(indexer.stake) + await stakeTx.wait() + + // Set delegation parameters + console.log(`Setting delegation parameters for indexer ${indexer.address}...`) + const setDelegationParametersTx = await Staking.connect(indexerSigner).setDelegationParameters(indexer.indexingRewardCut, indexer.queryFeeCut, 0) + await setDelegationParametersTx.wait() + + // Set rewards destination if it exists + if (indexer.rewardsDestination) { + console.log(`Setting rewards destination for indexer ${indexer.address} to ${indexer.rewardsDestination}...`) + const setRewardsDestinationTx = await Staking.connect(indexerSigner).setRewardsDestination(indexer.rewardsDestination) + await setRewardsDestinationTx.wait() + } + } + + // STEP 2: Fund and delegate for delegators + console.log('\n--- STEP 2: Delegators Delegating ---') + for (const delegator of delegators) { + // Impersonate the delegator + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const delegatorSigner = await hre.ethers.getImpersonatedSigner(delegator.address) as any + + // Delegate to each indexer + for (const delegation of delegator.delegations) { + console.log(`Delegating ${delegation.tokens} tokens from ${delegator.address} to indexer ${delegation.indexerAddress}...`) + const delegationApproveTx = await GraphToken.connect(delegatorSigner).approve(stakingAddress, delegation.tokens) + await delegationApproveTx.wait() + const delegateTx = await Staking.connect(delegatorSigner).delegate(delegation.indexerAddress, delegation.tokens) + await delegateTx.wait() + } + } + + // STEP 3: Create allocations + console.log('\n--- STEP 3: Creating Allocations ---') + for (const indexer of indexers) { + // Impersonate the indexer + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const indexerSigner = await hre.ethers.getImpersonatedSigner(indexer.address) as any + + for (const allocation of indexer.allocations) { + console.log(`Creating allocation of ${allocation.tokens} tokens from indexer ${indexer.address} on subgraph ${allocation.subgraphDeploymentID}...`) + + const allocateTx = await Staking.connect(indexerSigner).allocate( + allocation.subgraphDeploymentID, + allocation.tokens, + allocation.allocationID, + randomHexBytes(), // metadata + await generateAllocationProof(indexer.address, allocation.allocationPrivateKey), + ) + await allocateTx.wait() + } + } + + // STEP 4: Indexer unstakes + console.log('\n--- STEP 4: Indexer unstakes ---') + for (const indexer of indexers) { + if (indexer.tokensToUnstake) { + console.log(`Indexer ${indexer.address} is unstaking...`) + + // Impersonate the indexer + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const indexerSigner = await hre.ethers.getImpersonatedSigner(indexer.address) as any + + // Unstake + const unstakeTx = await Staking.connect(indexerSigner).unstake(indexer.tokensToUnstake) + await unstakeTx.wait() + } + } + + // STEP 5: Undelegate + console.log('\n--- STEP 5: Undelegating ---') + for (const delegator of delegators) { + if (delegator.undelegate) { + console.log(`Delegator ${delegator.address} is undelegating...`) + + // Impersonate the delegator + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const delegatorSigner = await hre.ethers.getImpersonatedSigner(delegator.address) as any + + for (const delegation of delegator.delegations) { + // Get the delegation information + const delegationInfo = await Staking.getDelegation(delegation.indexerAddress, delegator.address) + const shares = BigInt(delegationInfo.shares.toString()) + + console.log(`Undelegating ${shares} shares from indexer ${delegation.indexerAddress}...`) + + // Undelegate the shares + const undelegateTx = await Staking.connect(delegatorSigner).undelegate(delegation.indexerAddress, shares) + await undelegateTx.wait() + } + } + } + + console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Pre-upgrade state setup complete! πŸŽ‰ ✨ πŸš€ βœ…\n') + }) diff --git a/packages/horizon/tasks/test/transfer-onwership.ts b/packages/horizon/tasks/test/transfer-onwership.ts new file mode 100644 index 000000000..6f279f2d7 --- /dev/null +++ b/packages/horizon/tasks/test/transfer-onwership.ts @@ -0,0 +1,94 @@ +import { task, types } from 'hardhat/config' +import { Contract } from 'ethers' + +import { IStaking } from '@graphprotocol/contracts' +import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' +import { mergeABIs } from 'hardhat-graph-protocol/sdk' +import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' + +import { createBanner } from '../../utils/banners' + +task('test:integration:transfer-ownership', 'Transfer ownership of protocol contracts to a new governor') + .addOptionalParam('governorIndex', 'Index of the new governor account in getSigners array', 1, types.int) + .addOptionalParam('slasherIndex', 'Index of the new slasher account in getSigners array', 2, types.int) + .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') + .setAction(async (taskArgs, hre) => { + console.log(createBanner('TRANSFER OWNERSHIP')) + + // Check that we're on a local network + if (!taskArgs.skipNetworkCheck && hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { + throw new Error('This task can only be run on localhost or hardhat network. Use --skip-network-check to override (use with caution)') + } + + console.log('\n--- STEP 0: Setup ---') + + // Get signers + const signers = await hre.ethers.getSigners() + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const newGovernor = signers[taskArgs.governorIndex] as any + const newSlasher = signers[taskArgs.slasherIndex] + + console.log(`New governor will be: ${newGovernor.address}`) + + // Get contract addresses + const addressesJson = require('@graphprotocol/contracts/addresses.json') + const arbSepoliaAddresses = addressesJson['421614'] + const stakingAddress = arbSepoliaAddresses.L2Staking.address + + // Get ABIs + const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) + + // Get contracts + const staking = new Contract(stakingAddress, combinedStakingABI, hre.ethers.provider) as unknown as IStaking + const controller = hre.graph().horizon!.contracts.Controller + const graphProxyAdmin = hre.graph().horizon!.contracts.GraphProxyAdmin + + // Get current owners + const controllerGovernor = await controller.governor() + const proxyAdminGovernor = await graphProxyAdmin.governor() + + console.log(`Current Controller governor: ${controllerGovernor}`) + console.log(`Current GraphProxyAdmin governor: ${proxyAdminGovernor}`) + + // Get impersonated signers + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const controllerSigner = await hre.ethers.getImpersonatedSigner(controllerGovernor) as any + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const proxyAdminSigner = await hre.ethers.getImpersonatedSigner(proxyAdminGovernor) as any + + console.log('\n--- STEP 1: Transfer ownership of Controller ---') + + // Transfer Controller ownership + console.log('Transferring Controller ownership...') + const controllerTx = await controller.connect(controllerSigner).transferOwnership(newGovernor.address) + await controllerTx.wait() + console.log('Accepting Controller ownership...') + + // Accept ownership of Controller + const acceptControllerTx = await controller.connect(newGovernor).acceptOwnership() + await acceptControllerTx.wait() + console.log(`New Controller governor: ${await controller.governor()}`) + + console.log('\n--- STEP 2: Transfer ownership of GraphProxyAdmin ---') + + // Transfer GraphProxyAdmin ownership + console.log('Transferring GraphProxyAdmin ownership...') + const proxyAdminTx = await graphProxyAdmin.connect(proxyAdminSigner).transferOwnership(newGovernor.address) + await proxyAdminTx.wait() + console.log('Accepting GraphProxyAdmin ownership...') + + // Accept ownership of GraphProxyAdmin + const acceptProxyAdminTx = await graphProxyAdmin.connect(newGovernor).acceptOwnership() + await acceptProxyAdminTx.wait() + console.log(`New GraphProxyAdmin governor: ${await graphProxyAdmin.governor()}`) + + console.log('\n--- STEP 3: Assign new slasher ---') + + // Assign new slasher + console.log('Assigning new slasher...') + const slasherTx = await staking.connect(newGovernor).setSlasher(newSlasher.address, true) + await slasherTx.wait() + console.log(`New slasher: ${newSlasher.address}, allowed: ${await staking.slashers(newSlasher.address)}`) + + console.log('\n\nπŸŽ‰ ✨ πŸš€ βœ… Transfer ownership complete! πŸŽ‰ ✨ πŸš€ βœ…\n') + }) diff --git a/packages/horizon/tasks/transitions.ts b/packages/horizon/tasks/test/transitions.ts similarity index 97% rename from packages/horizon/tasks/transitions.ts rename to packages/horizon/tasks/test/transitions.ts index 837b6819c..36934b5fe 100644 --- a/packages/horizon/tasks/transitions.ts +++ b/packages/horizon/tasks/test/transitions.ts @@ -1,5 +1,5 @@ import { task, types } from 'hardhat/config' -import { createBanner } from '../utils/banners' +import { createBanner } from '../../utils/banners' import { ethers } from 'ethers' task('transition:unset-subgraph-service', 'Unsets the subgraph service in HorizonStaking') diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts index d13fef533..1340569cf 100644 --- a/packages/horizon/test/integration/during-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/delegator.test.ts @@ -6,7 +6,7 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' -import { delegators } from '../../../scripts/e2e/fixtures/delegators' +import { delegators } from '../../../tasks/test/fixtures/delegators' import { withdrawDelegatedLegacy } from '../shared/staking' describe('Delegator', () => { diff --git a/packages/horizon/test/integration/during-transition-period/operator.test.ts b/packages/horizon/test/integration/during-transition-period/operator.test.ts index 2e11cdf59..39fe4e9f8 100644 --- a/packages/horizon/test/integration/during-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/operator.test.ts @@ -8,7 +8,7 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IHorizonStaking, IRewardsManager } from '../../../typechain-types' -import { indexers } from '../../../scripts/e2e/fixtures/indexers' +import { indexers } from '../../../tasks/test/fixtures/indexers' describe('Operator', () => { let horizonStaking: IHorizonStaking diff --git a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts index ee4347a0f..c319a5a04 100644 --- a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts +++ b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts @@ -8,7 +8,7 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IEpochManager, IHorizonStaking } from '../../../typechain-types' -import { indexers } from '../../../scripts/e2e/fixtures/indexers' +import { indexers } from '../../../tasks/test/fixtures/indexers' describe('Permissionless', () => { let horizonStaking: IHorizonStaking diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index 997492b6c..311c705c5 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -9,7 +9,7 @@ import { IGraphToken, IHorizonStaking, IRewardsManager } from '../../../typechai import { stake, unstake, withdraw } from '../shared/staking' import { collect } from '../shared/stakingExtension' -import { indexers } from '../../../scripts/e2e/fixtures/indexers' +import { indexers } from '../../../tasks/test/fixtures/indexers' describe('Service Provider', () => { let horizonStaking: IHorizonStaking diff --git a/packages/horizon/test/integration/during-transition-period/slasher.test.ts b/packages/horizon/test/integration/during-transition-period/slasher.test.ts index a3aa0b38d..b4d3d12d8 100644 --- a/packages/horizon/test/integration/during-transition-period/slasher.test.ts +++ b/packages/horizon/test/integration/during-transition-period/slasher.test.ts @@ -6,7 +6,7 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' -import { indexers } from '../../../scripts/e2e/fixtures/indexers' +import { indexers } from '../../../tasks/test/fixtures/indexers' import { slash } from '../shared/staking' describe('Slasher', () => { From a1adeb2cc8a5d01cfe7ccdf32f2bf240858ae0ce Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Tue, 25 Mar 2025 11:16:31 -0300 Subject: [PATCH 14/23] wip: moving staking actions to sdk --- packages/hardhat-graph-protocol/src/config.ts | 2 - .../deployments/horizon/actions}/staking.ts | 82 ++++++++++++------- .../sdk/deployments/horizon}/utils/types.ts | 0 .../src/sdk/hardhat.base.config.ts | 2 +- .../hardhat-graph-protocol/src/sdk/index.ts | 6 +- .../src/sdk/utils/abi.ts | 7 +- .../after-transition-period/operator.test.ts | 31 +++---- .../service-provider.test.ts | 4 +- 8 files changed, 82 insertions(+), 52 deletions(-) rename packages/{horizon/test/integration/shared => hardhat-graph-protocol/src/sdk/deployments/horizon/actions}/staking.ts (87%) rename packages/{horizon/test/integration => hardhat-graph-protocol/src/sdk/deployments/horizon}/utils/types.ts (100%) diff --git a/packages/hardhat-graph-protocol/src/config.ts b/packages/hardhat-graph-protocol/src/config.ts index 9f2e2af82..d27d805e5 100644 --- a/packages/hardhat-graph-protocol/src/config.ts +++ b/packages/hardhat-graph-protocol/src/config.ts @@ -1,5 +1,3 @@ -import fs from 'fs' - import { GraphPluginError } from './sdk/utils/error' import { logDebug } from './logger' import { normalizePath } from './sdk/utils/path' diff --git a/packages/horizon/test/integration/shared/staking.ts b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts similarity index 87% rename from packages/horizon/test/integration/shared/staking.ts rename to packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts index cf4b936b8..ad7f926d0 100644 --- a/packages/horizon/test/integration/shared/staking.ts +++ b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts @@ -1,12 +1,36 @@ import { ethers, HDNodeWallet } from 'ethers' import { expect } from 'chai' -import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' -import { IGraphToken, IHorizonStaking } from '../../../typechain-types' +import { IGraphToken, IHorizonStaking } from '@graphprotocol/horizon' import { ThawRequestType } from '../utils/types' +/* ////////////////////////////////////////////////////////////// + EXPORTS +////////////////////////////////////////////////////////////// */ + +export const HorizonHelper = { + addToDelegationPool, + delegate, + deprovision, + redelegate, + reprovision, + stake, + stakeTo, + stakeToProvision, + slash, + thaw, + undelegate, + unstake, + withdraw, + withdrawDelegated, + withdrawDelegatedLegacy, + createProvision, + addToProvision +} + /* ////////////////////////////////////////////////////////////// STAKE MANAGEMENT ////////////////////////////////////////////////////////////// */ @@ -14,11 +38,11 @@ import { ThawRequestType } from '../utils/types' interface StakeParams { horizonStaking: IHorizonStaking graphToken: IGraphToken - serviceProvider: SignerWithAddress + serviceProvider: HardhatEthersSigner tokens: bigint } -export async function stake({ +async function stake({ horizonStaking, graphToken, serviceProvider, @@ -30,10 +54,10 @@ export async function stake({ } interface StakeToParams extends StakeParams { - signer: SignerWithAddress + signer: HardhatEthersSigner } -export async function stakeTo({ +async function stakeTo({ horizonStaking, graphToken, signer, @@ -48,7 +72,7 @@ export async function stakeTo({ interface UnstakeParams extends Omit {} -export async function unstake({ +async function unstake({ horizonStaking, serviceProvider, tokens, @@ -59,7 +83,7 @@ export async function unstake({ interface WithdrawParams extends Omit {} -export async function withdraw({ +async function withdraw({ horizonStaking, serviceProvider, }: WithdrawParams): Promise { @@ -71,7 +95,7 @@ interface StakeToProvisionParams extends StakeParams { verifier: string } -export async function stakeToProvision({ +async function stakeToProvision({ horizonStaking, graphToken, serviceProvider, @@ -94,14 +118,14 @@ export async function stakeToProvision({ } interface SlashParams extends Omit { - verifier: SignerWithAddress | HDNodeWallet + verifier: HardhatEthersSigner | HDNodeWallet serviceProvider: string tokens: bigint tokensVerifier: bigint verifierDestination: string } -export async function slash({ +async function slash({ horizonStaking, verifier, serviceProvider, @@ -124,10 +148,10 @@ export async function slash({ interface ProvisionParams { horizonStaking: IHorizonStaking - serviceProvider: SignerWithAddress + serviceProvider: HardhatEthersSigner verifier: string tokens: bigint - signer?: SignerWithAddress + signer?: HardhatEthersSigner } interface CreateProvisionParams extends ProvisionParams { @@ -144,7 +168,7 @@ interface ReprovisionParams extends Omit { nThawRequests: bigint } -export async function createProvision({ +async function createProvision({ horizonStaking, serviceProvider, verifier, @@ -170,7 +194,7 @@ export async function createProvision({ expect(provision.thawingPeriod).to.equal(thawingPeriod, 'Provision thawing period was not set') } -export async function addToProvision({ +async function addToProvision({ horizonStaking, serviceProvider, verifier, @@ -186,7 +210,7 @@ export async function addToProvision({ await addToProvisionTx.wait() } -export async function thaw({ +async function thaw({ horizonStaking, serviceProvider, verifier, @@ -233,7 +257,7 @@ export async function thaw({ expect(thawRequest.shares).to.equal(expectedThawRequestShares, 'Thaw request shares were not set') } -export async function deprovision({ +async function deprovision({ horizonStaking, serviceProvider, verifier, @@ -249,7 +273,7 @@ export async function deprovision({ await deprovisionTx.wait() } -export async function reprovision({ +async function reprovision({ horizonStaking, serviceProvider, verifier: oldVerifier, @@ -273,8 +297,8 @@ export async function reprovision({ interface DelegationParams { horizonStaking: IHorizonStaking - delegator: SignerWithAddress - serviceProvider: SignerWithAddress + delegator: HardhatEthersSigner + serviceProvider: HardhatEthersSigner verifier: string } @@ -284,7 +308,7 @@ interface DelegateParams extends DelegationParams { minSharesOut: bigint } -export async function delegate({ +async function delegate({ horizonStaking, graphToken, delegator, @@ -309,7 +333,7 @@ interface UndelegateParams extends DelegationParams { shares: bigint } -export async function undelegate({ +async function undelegate({ horizonStaking, delegator, serviceProvider, @@ -325,13 +349,13 @@ export async function undelegate({ } interface RedelegateParams extends DelegationParams { - newServiceProvider: SignerWithAddress + newServiceProvider: HardhatEthersSigner newVerifier: string minSharesForNewProvider: bigint nThawRequests: bigint } -export async function redelegate({ +async function redelegate({ horizonStaking, delegator, serviceProvider, @@ -356,7 +380,7 @@ interface WithdrawDelegatedParams extends DelegationParams { nThawRequests: bigint } -export async function withdrawDelegated({ +async function withdrawDelegated({ horizonStaking, delegator, serviceProvider, @@ -373,7 +397,7 @@ export async function withdrawDelegated({ interface WithdrawDelegatedLegacyParams extends Omit {} -export async function withdrawDelegatedLegacy({ +async function withdrawDelegatedLegacy({ horizonStaking, delegator, serviceProvider, @@ -387,11 +411,11 @@ export async function withdrawDelegatedLegacy({ interface AddToDelegationPoolParams extends Omit { graphToken: IGraphToken - signer: SignerWithAddress + signer: HardhatEthersSigner tokens: bigint } -export async function addToDelegationPool({ +async function addToDelegationPool({ horizonStaking, graphToken, signer, @@ -417,7 +441,7 @@ export async function addToDelegationPool({ async function approve( graphToken: IGraphToken, - signer: SignerWithAddress, + signer: HardhatEthersSigner, spender: string, tokens: bigint, ): Promise { diff --git a/packages/horizon/test/integration/utils/types.ts b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/utils/types.ts similarity index 100% rename from packages/horizon/test/integration/utils/types.ts rename to packages/hardhat-graph-protocol/src/sdk/deployments/horizon/utils/types.ts diff --git a/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts index 5e23a44c7..2d0583fb2 100644 --- a/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts +++ b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts @@ -78,7 +78,7 @@ export const networksUserConfig: BaseNetworksUserConfig = { }, ...(vars.has('FORK') && vars.get('FORK') === 'true' ? { accounts: 'remote' } - : vars.has('LOCALHOST_ACCOUNTS_MNEMONIC') + : vars.has('LOCALHOST_ACCOUNTS_MNEMONIC') ? { accounts: { mnemonic: vars.get('LOCALHOST_ACCOUNTS_MNEMONIC') } } : {} ), diff --git a/packages/hardhat-graph-protocol/src/sdk/index.ts b/packages/hardhat-graph-protocol/src/sdk/index.ts index 8faedb77a..af7734506 100644 --- a/packages/hardhat-graph-protocol/src/sdk/index.ts +++ b/packages/hardhat-graph-protocol/src/sdk/index.ts @@ -1,6 +1,10 @@ import { loadConfig, patchConfig, saveToAddressBook } from './ignition/ignition' +import { PaymentTypes, ThawRequestType } from './deployments/horizon/utils/types' import { hardhatBaseConfig } from './hardhat.base.config' +import { HorizonHelper } from './deployments/horizon/actions/staking' import { mergeABIs } from './utils/abi' const IgnitionHelper = { saveToAddressBook, loadConfig, patchConfig } -export { hardhatBaseConfig, IgnitionHelper, mergeABIs } +const HorizonTypes = { PaymentTypes, ThawRequestType } + +export { hardhatBaseConfig, IgnitionHelper, mergeABIs, HorizonTypes, HorizonHelper } diff --git a/packages/hardhat-graph-protocol/src/sdk/utils/abi.ts b/packages/hardhat-graph-protocol/src/sdk/utils/abi.ts index 97b28973c..385ab2b5a 100644 --- a/packages/hardhat-graph-protocol/src/sdk/utils/abi.ts +++ b/packages/hardhat-graph-protocol/src/sdk/utils/abi.ts @@ -1,8 +1,11 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any export function mergeABIs(abi1: any[], abi2: any[]) { for (const item of abi2) { - if (abi1.find((v) => v.name === item.name) === undefined) { + if (abi1.find(v => v.name === item.name) === undefined) { abi1.push(item) } } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return abi1 -} \ No newline at end of file +} diff --git a/packages/horizon/test/integration/after-transition-period/operator.test.ts b/packages/horizon/test/integration/after-transition-period/operator.test.ts index 28990075e..2683de894 100644 --- a/packages/horizon/test/integration/after-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/operator.test.ts @@ -2,19 +2,20 @@ import { ethers } from 'hardhat' import { expect } from 'chai' import hre from 'hardhat' -import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' -import { createProvision, deprovision, reprovision, stakeTo, thaw, unstake } from '../shared/staking' -import { PaymentTypes } from '../utils/types' +// import { createProvision, deprovision, reprovision, stakeTo, thaw, unstake } from '../shared/staking' +import { HorizonHelper } from 'hardhat-graph-protocol/sdk' +import { HorizonTypes } from 'hardhat-graph-protocol/sdk' describe('Operator', () => { let horizonStaking: IHorizonStaking let graphToken: IGraphToken - let serviceProvider: SignerWithAddress + let serviceProvider: HardhatEthersSigner let verifier: string - let operator: SignerWithAddress + let operator: HardhatEthersSigner const tokens = ethers.parseEther('100000') const maxVerifierCut = 1000000 // 100% @@ -43,7 +44,7 @@ describe('Operator', () => { const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) // Operator stakes on behalf of service provider - await stakeTo({ + await HorizonHelper.stakeTo({ horizonStaking, graphToken, signer: operator, @@ -52,7 +53,7 @@ describe('Operator', () => { }) // Service provider unstakes - await unstake({ horizonStaking, serviceProvider, tokens: stakeTokens }) + await HorizonHelper.unstake({ horizonStaking, serviceProvider, tokens: stakeTokens }) // Verify tokens were removed from operator's address const operatorBalanceAfter = await graphToken.balanceOf(operator.address) @@ -65,7 +66,7 @@ describe('Operator', () => { it('operator sets delegation fee cut', async () => { const feeCut = 100000 // 10% - const paymentType = PaymentTypes.QueryFee + const paymentType = HorizonTypes.PaymentTypes.QueryFee // Operator sets delegation fee cut await horizonStaking.connect(operator).setDelegationFeeCut( @@ -88,7 +89,7 @@ describe('Operator', () => { before(async () => { const provisionTokens = ethers.parseEther('10000') // Operator stakes tokens to service provider - await stakeTo({ + await HorizonHelper.stakeTo({ horizonStaking, graphToken, signer: operator, @@ -97,7 +98,7 @@ describe('Operator', () => { }) // Operator creates provision - await createProvision({ + await HorizonHelper.createProvision({ horizonStaking, serviceProvider, verifier, @@ -118,7 +119,7 @@ describe('Operator', () => { const provisionTokensBefore = (await horizonStaking.getProvision(serviceProvider.address, verifier)).tokens // Operator thaws tokens - await thaw({ + await HorizonHelper.thaw({ horizonStaking, serviceProvider, verifier, @@ -131,7 +132,7 @@ describe('Operator', () => { await ethers.provider.send('evm_mine', []) // Operator deprovisions - await deprovision({ + await HorizonHelper.deprovision({ horizonStaking, serviceProvider, verifier, @@ -152,7 +153,7 @@ describe('Operator', () => { const thawTokens = ethers.parseEther('100') // Operator thaws tokens - await thaw({ + await HorizonHelper.thaw({ horizonStaking, serviceProvider, verifier, @@ -169,7 +170,7 @@ describe('Operator', () => { await horizonStaking.connect(serviceProvider).setOperator(newVerifier, operator.address, true) // Operator creates a provision for the new verifier - await createProvision({ + await HorizonHelper.createProvision({ horizonStaking, serviceProvider, verifier: newVerifier, @@ -180,7 +181,7 @@ describe('Operator', () => { }) // Operator reprovisions - await reprovision({ + await HorizonHelper.reprovision({ horizonStaking, serviceProvider, verifier, diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index ceef7a37b..e97997802 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -16,7 +16,7 @@ import { thaw, unstake, } from '../shared/staking' -import { PaymentTypes } from '../utils/types' +import { HorizonTypes } from 'hardhat-graph-protocol/sdk' describe('Service provider', () => { let horizonStaking: IHorizonStaking @@ -56,7 +56,7 @@ describe('Service provider', () => { it('should be able to set delegation fee cut for payment type', async () => { const delegationFeeCut = 10_000 // 10% - const paymentType = PaymentTypes.QueryFee + const paymentType = HorizonTypes.PaymentTypes.QueryFee const tx = await horizonStaking.connect(serviceProvider).setDelegationFeeCut( serviceProvider.address, From 912a10fed8f4de28dfa4f9cecadd46518df81ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Tue, 25 Mar 2025 12:01:15 -0300 Subject: [PATCH 15/23] chore: reset yarn lock file due to shenanigans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: TomΓ‘s Migone --- packages/contracts/package.json | 4 +- packages/data-edge/package.json | 1 + yarn.lock | 5974 ++++++++++++++++--------------- 3 files changed, 3103 insertions(+), 2876 deletions(-) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index cde47f6eb..49eb74540 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -30,8 +30,8 @@ "@typechain/ethers-v5": "^7.0.0", "@typechain/hardhat": "^2.0.0", "@types/bs58": "^4.0.1", + "@types/chai": "4.3.4", "@types/chai-as-promised": "^7.1.5", - "@types/dotenv": "^8.2.0", "@types/glob": "^7.2.0", "@types/inquirer": "^7.3.1", "@types/minimist": "^1.2.1", @@ -43,7 +43,7 @@ "@urql/core": "^2.1.3", "arbos-precompiles": "^1.0.2", "bignumber.js": "^9.0.0", - "chai": "^4.3.4", + "chai": "4.3.4", "chai-as-promised": "^7.1.1", "cli-table": "^0.3.6", "console-table-printer": "^2.11.1", diff --git a/packages/data-edge/package.json b/packages/data-edge/package.json index 6c31c8107..833067b78 100644 --- a/packages/data-edge/package.json +++ b/packages/data-edge/package.json @@ -48,6 +48,7 @@ "@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": "^9.0.0", "@typechain/hardhat": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index a7ea5693e..99d80b378 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,14 +6,14 @@ __metadata: cacheKey: 10c0 "@0no-co/graphql.web@npm:^1.0.5": - version: 1.0.7 - resolution: "@0no-co/graphql.web@npm:1.0.7" + version: 1.1.2 + resolution: "@0no-co/graphql.web@npm:1.1.2" peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 peerDependenciesMeta: graphql: optional: true - checksum: 4744a6c327e0a2d564c8f4720ef08dcece6c3b8373f52208ff29f7086f90e18d211c59cc222c229f1e3241abd1fc6e30377dc1dadac491bbb25706f29dea626a + checksum: 7074de29681f0563cb9a90d702c7cda4443dce858e09f9a09adbafe32c302890cab81959ccba4ed7ac3e332423b2928a1dc95dd4a5004e6a5c156b733caa349a languageName: node linkType: hard @@ -122,12 +122,12 @@ __metadata: linkType: hard "@aws-sdk/types@npm:^3.1.0": - version: 3.577.0 - resolution: "@aws-sdk/types@npm:3.577.0" + version: 3.734.0 + resolution: "@aws-sdk/types@npm:3.734.0" dependencies: - "@smithy/types": "npm:^3.0.0" + "@smithy/types": "npm:^4.1.0" tslib: "npm:^2.6.2" - checksum: ae31757b05c2445f52b3f3268d7e9cbae765cae24f088afb8f967c8e3a268b425794a8e99fab3e0428dc6491ccca99b6c57ab5ca69e2d1cc2878ec85ff9643f7 + checksum: 74313849619b8bce9e6a52c70fcdaa212574a443503c78bccdba77cdc7bc66b8cecefe461852e0bab7376cc2ec3e1891730b1a027be63efb47394115c8ddb856 languageName: node linkType: hard @@ -140,264 +140,210 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/code-frame@npm:7.24.2" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": "npm:^7.24.2" + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406 + checksum: 7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.23.5": - version: 7.24.4 - resolution: "@babel/compat-data@npm:7.24.4" - checksum: 9cd8a9cd28a5ca6db5d0e27417d609f95a8762b655e8c9c97fd2de08997043ae99f0139007083c5e607601c6122e8432c85fe391731b19bf26ad458fa0c60dd3 +"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca languageName: node linkType: hard "@babel/core@npm:^7.14.0": - version: 7.24.5 - resolution: "@babel/core@npm:7.24.5" + version: 7.26.10 + resolution: "@babel/core@npm:7.26.10" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.5" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.24.5" - "@babel/helpers": "npm:^7.24.5" - "@babel/parser": "npm:^7.24.5" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.5" - "@babel/types": "npm:^7.24.5" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.10" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: e26ba810a77bc8e21579a12fc36c79a0a60554404dc9447f2d64eb1f26d181c48d3b97d39d9f158e9911ec7162a8280acfaf2b4b210e975f0dd4bd4dbb1ee159 + checksum: e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/generator@npm:7.24.5" +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.26.10, @babel/generator@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/generator@npm:7.27.0" dependencies: - "@babel/types": "npm:^7.24.5" + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 0d64f880150e7dfb92ceff2b4ac865f36aa1e295120920246492ffd0146562dabf79ba8699af1c8833f8a7954818d4d146b7b02f808df4d6024fb99f98b2f78d + jsesc: "npm:^3.0.2" + checksum: 7cb10693d2b365c278f109a745dc08856cae139d262748b77b70ce1d97da84627f79648cab6940d847392c0e5d180441669ed958b3aee98d9c7d274b37c553bd languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" +"@babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 5a80dc364ddda26b334bbbc0f6426cab647381555ef7d0cd32eb284e35b867c012ce6ce7d52a64672ed71383099c99d32765b3d260626527bb0e3470b0f58e45 + "@babel/types": "npm:^7.25.9" + checksum: 095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5": + version: 7.27.0 + resolution: "@babel/helper-compilation-targets@npm:7.27.0" dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" + "@babel/compat-data": "npm:^7.26.8" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa + checksum: 375c9f80e6540118f41bd53dd54d670b8bf91235d631bdead44c8b313b26e9cd89aed5c6df770ad13a87a464497b5346bb72b9462ba690473da422f5402618b6 languageName: node linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.18.6": - version: 7.24.5 - resolution: "@babel/helper-create-class-features-plugin@npm:7.24.5" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-member-expression-to-functions": "npm:^7.24.5" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" - "@babel/helper-replace-supers": "npm:^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.24.5" + version: 7.27.0 + resolution: "@babel/helper-create-class-features-plugin@npm:7.27.0" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.27.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: afc72e8075a249663f8024ef1760de4c0b9252bdde16419ac955fa7e15b8d4096ca1e01f796df4fa8cfdb056708886f60b631ad492242a8e47307974fc305920 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" - dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 + checksum: c4945903136d934050e070f69a4d72ec425f1f70634e0ddf14ad36695f935125a6df559f8d5b94cc1ed49abd4ce9c5be8ef3ba033fa8d09c5dd78d1a9b97d8cc languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.23.0, @babel/helper-member-expression-to-functions@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.5" +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.5" - checksum: a3c0276a1ede8648a0e6fd86ad846cd57421d05eddfa29446b8b5a013db650462022b9ec1e65ea32c747d0542d729c80866830697f94fb12d603e87c51f080a5 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.3": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3, @babel/helper-module-transforms@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-module-transforms@npm:7.24.5" +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.24.3" - "@babel/helper-simple-access": "npm:^7.24.5" - "@babel/helper-split-export-declaration": "npm:^7.24.5" - "@babel/helper-validator-identifier": "npm:^7.24.5" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 6e77d72f62b7e87abaea800ea0bccd4d54cde26485750969f5f493c032eb63251eb50c3522cace557781565d51c1d0c4bcc866407d24becfb109c18fb92c978d + checksum: ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 31b41a764fc3c585196cf5b776b70cf4705c132e4ce9723f39871f215f2ddbfb2e28a62f9917610f67c8216c1080482b9b05f65dd195dae2a52cef461f2ac7b8 + "@babel/types": "npm:^7.25.9" + checksum: 90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.24.5, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.24.5 - resolution: "@babel/helper-plugin-utils@npm:7.24.5" - checksum: 4ae40094e6a2f183281213344f4df60c66b16b19a2bc38d2bb11810a6dc0a0e7ec638957d0e433ff8b615775b8f3cd1b7edbf59440d1b50e73c389fc22913377 +"@babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helper-replace-supers@npm:7.24.1" +"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-replace-supers@npm:7.26.5" dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-member-expression-to-functions": "npm:^7.23.0" - "@babel/helper-optimise-call-expression": "npm:^7.22.5" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: d39a3df7892b7c3c0e307fb229646168a9bd35e26a72080c2530729322600e8cff5f738f44a14860a2358faffa741b6a6a0d6749f113387b03ddbfa0ec10e1a0 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.22.5, @babel/helper-simple-access@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-simple-access@npm:7.24.5" - dependencies: - "@babel/types": "npm:^7.24.5" - checksum: d96a0ab790a400f6c2dcbd9457b9ca74b9ba6d0f67ff9cd5bcc73792c8fbbd0847322a0dddbd8987dd98610ee1637c680938c7d83d3ffce7d06d7519d823d996 - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: ab7fa2aa709ab49bb8cd86515a1e715a3108c4bb9a616965ba76b43dc346dee66d1004ccf4d222b596b6224e43e04cbc5c3a34459501b388451f8c589fbc3691 + checksum: b19b1245caf835207aaaaac3a494f03a16069ae55e76a2e1350b5acd560e6a820026997a8160e8ebab82ae873e8208759aa008eb8422a67a775df41f0a4633d4 languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-split-export-declaration@npm:7.24.5" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.5" - checksum: d7a812d67d031a348f3fb0e6263ce2dbe6038f81536ba7fb16db385383bcd6542b71833194303bf6d3d0e4f7b6b584c9c8fae8772122e2ce68fc9bdf07f4135d + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helper-string-parser@npm:7.24.1" - checksum: 2f9bfcf8d2f9f083785df0501dbab92770111ece2f90d120352fda6dd2a7d47db11b807d111e6f32aa1ba6d763fe2dc6603d153068d672a5d0ad33ca802632b2 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-validator-identifier@npm:7.24.5" - checksum: 05f957229d89ce95a137d04e27f7d0680d84ae48b6ad830e399db0779341f7d30290f863a93351b4b3bde2166737f73a286ea42856bb07c8ddaa95600d38645c +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard -"@babel/helpers@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helpers@npm:7.24.5" +"@babel/helpers@npm:^7.26.10": + version: 7.27.0 + resolution: "@babel/helpers@npm:7.27.0" dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.5" - "@babel/types": "npm:^7.24.5" - checksum: 0630b0223c3a9a34027ddc05b3bac54d68d5957f84e92d2d4814b00448a76e12f9188f9c85cfce2011696d82a8ffcbd8189da097c0af0181d32eb27eca34185e + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: a3c64fd2d8b164c041808826cc00769d814074ea447daaacaf2e3714b66d3f4237ef6e420f61d08f463d6608f3468c2ac5124ab7c68f704e20384def5ade95f4 languageName: node linkType: hard -"@babel/highlight@npm:^7.24.2": - version: 7.24.5 - resolution: "@babel/highlight@npm:7.24.5" +"@babel/parser@npm:^7.14.0, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/parser@npm:7.27.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.5" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: e98047d3ad24608bfa596d000c861a2cc875af897427f2833b91a4e0d4cead07301a7ec15fa26093dcd61e036e2eed2db338ae54f93016fe0dc785fadc4159db - languageName: node - linkType: hard - -"@babel/parser@npm:^7.14.0, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/parser@npm:7.24.5" + "@babel/types": "npm:^7.27.0" bin: parser: ./bin/babel-parser.js - checksum: 8333a6ad5328bad34fa0e12bcee147c3345ea9a438c0909e7c68c6cfbea43c464834ffd7eabd1cbc1c62df0a558e22ffade9f5b29440833ba7b33d96a71f88c0 + checksum: ba2ed3f41735826546a3ef2a7634a8d10351df221891906e59b29b0a0cd748f9b0e7a6f07576858a9de8e77785aad925c8389ddef146de04ea2842047c9d2859 languageName: node linkType: hard @@ -439,36 +385,36 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/plugin-syntax-flow@npm:7.24.1" +"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-flow@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 618de04360a96111408abdaafaba2efbaef0d90faad029d50e0281eaad5d7c7bd2ce4420bbac0ee27ad84c2b7bbc3e48f782064f81ed5bc40c398637991004c7 + checksum: 3d5cc1627a67af8be9df8cfe246869f18e7e9e2592f4b6f1c4bcd9bbe4ad27102784a25b31ebdbed23499ecb6fc23aaf7891ccf5ac3f432fd26a27123d1e242b languageName: node linkType: hard "@babel/plugin-syntax-import-assertions@npm:^7.20.0": - version: 7.24.1 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1" + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 72f0340d73e037f0702c61670054e0af66ece7282c5c2f4ba8de059390fee502de282defdf15959cd9f71aa18dc5c5e4e7a0fde317799a0600c6c4e0a656d82b + checksum: 525b174e60b210d96c1744c1575fc2ddedcc43a479cba64a5344cf77bd0541754fc58120b5a11ff832ba098437bb05aa80900d1f49bb3d888c5e349a4a3a356e languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" +"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a + checksum: d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c languageName: node linkType: hard @@ -484,291 +430,291 @@ __metadata: linkType: hard "@babel/plugin-transform-arrow-functions@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f44bfacf087dc21b422bab99f4e9344ee7b695b05c947dacae66de05c723ab9d91800be7edc1fa016185e8c819f3aca2b4a5f66d8a4d1e47d9bad80b8fa55b8e + checksum: 851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 languageName: node linkType: hard "@babel/plugin-transform-block-scoped-functions@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1" + version: 7.26.5 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6fbaa85f5204f34845dfc0bebf62fdd3ac5a286241c85651e59d426001e7a1785ac501f154e093e0b8ee49e1f51e3f8b06575a5ae8d4a9406d43e4816bf18c37 + checksum: 2f3060800ead46b09971dd7bf830d66383b7bc61ced9945633b4ef9bf87787956ea83fcf49b387cecb377812588c6b81681714c760f9cf89ecba45edcbab1192 languageName: node linkType: hard "@babel/plugin-transform-block-scoping@npm:^7.0.0": - version: 7.24.5 - resolution: "@babel/plugin-transform-block-scoping@npm:7.24.5" + version: 7.27.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.27.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.5" + "@babel/helper-plugin-utils": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 85997fc8179b7d26e8af30865aeb91789f3bc1f0cd5643ed25f25891ff9c071460ec1220599b19070b424a3b902422f682e9b02e515872540173eae2e25f760c + checksum: 15a604fac04151a795ff3213c73ece06bda7cd5f7c8cb7a3b29563ab243f0b3f7cba9e6facfc9d70e3e63b21af32f9d26bd10ccc58e1c425c7801186014b5ce4 languageName: node linkType: hard "@babel/plugin-transform-classes@npm:^7.0.0": - version: 7.24.5 - resolution: "@babel/plugin-transform-classes@npm:7.24.5" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.24.5" - "@babel/helper-replace-supers": "npm:^7.24.1" - "@babel/helper-split-export-declaration": "npm:^7.24.5" + version: 7.25.9 + resolution: "@babel/plugin-transform-classes@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4affcbb7cb01fa4764c7a4b534c30fd24a4b68e680a2d6e242dd7ca8726490f0f1426c44797deff84a38a162e0629718900c68d28daffe2b12adf5b4194156a7 + checksum: 02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d languageName: node linkType: hard "@babel/plugin-transform-computed-properties@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/template": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8292c508b656b7722e2c2ca0f6f31339852e3ed2b9b80f6e068a4010e961b431ca109ecd467fc906283f4b1574c1e7b1cb68d35a4dea12079d386c15ff7e0eac + checksum: 948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b languageName: node linkType: hard "@babel/plugin-transform-destructuring@npm:^7.0.0": - version: 7.24.5 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.5" + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6a37953a95f04b335bf3e2118fb93f50dd9593c658d1b2f8918a380a2ee30f1b420139eccf7ec3873c86a8208527895fcf6b7e21c0e734a6ad6e5d5042eace4d + checksum: 7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 languageName: node linkType: hard "@babel/plugin-transform-flow-strip-types@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.24.1" + version: 7.26.5 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.26.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/plugin-syntax-flow": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/plugin-syntax-flow": "npm:^7.26.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e6aa9cbad0441867598d390d4df65bc8c6b797574673e4eedbdae0cc528e81e00f4b2cd38f7d138b0f04bcdd2540384a9812d5d76af5abfa06aee1c7fc20ca58 + checksum: 61a0c0b652931cd0344e3357e41a89a717c787a55cb9e3381681ea5dfb8f267f6309bd337bc2064ffb267ba5eac92dd0f52984d376c23da105e7767266c2fc6f languageName: node linkType: hard "@babel/plugin-transform-for-of@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-for-of@npm:7.24.1" + version: 7.26.9 + resolution: "@babel/plugin-transform-for-of@npm:7.26.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e4bc92b1f334246e62d4bde079938df940794db564742034f6597f2e38bd426e11ae8c5670448e15dd6e45c462f2a9ab3fa87259bddf7c08553ffd9457fc2b2c + checksum: e28a521521cf9f84ddd69ca8da7c89fb9f7aa38e4dea35742fe973e4e1d7c23f9cee1a4861a2fdd9e9f18ff945886a44d7335cea1c603b96bfcb1c7c8791ef09 languageName: node linkType: hard "@babel/plugin-transform-function-name@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-function-name@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-function-name@npm:7.25.9" dependencies: - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 65c1735ec3b5e43db9b5aebf3c16171c04b3050c92396b9e22dda0d2aaf51f43fdcf147f70a40678fd9a4ee2272a5acec4826e9c21bcf968762f4c184897ad75 + checksum: 8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 languageName: node linkType: hard "@babel/plugin-transform-literals@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-literals@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a27cc7d565ee57b5a2bf136fa889c5c2f5988545ae7b3b2c83a7afe5dd37dfac80dca88b1c633c65851ce6af7d2095c04c01228657ce0198f918e64b5ccd01fa + checksum: 00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b languageName: node linkType: hard "@babel/plugin-transform-member-expression-literals@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2af731d02aa4c757ef80c46df42264128cbe45bfd15e1812d1a595265b690a44ad036041c406a73411733540e1c4256d8174705ae6b8cfaf757fc175613993fd + checksum: 91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 languageName: node linkType: hard "@babel/plugin-transform-modules-commonjs@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1" + version: 7.26.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" dependencies: - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-simple-access": "npm:^7.22.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: efb3ea2047604a7eb44a9289311ebb29842fe6510ff8b66a77a60440448c65e1312a60dc48191ed98246bdbd163b5b6f3348a0669bcc0e3809e69c7c776b20fa + checksum: 82e59708f19f36da29531a64a7a94eabbf6ff46a615e0f5d9b49f3f59e8ef10e2bac607d749091508d3fa655146c9e5647c3ffeca781060cdabedb4c7a33c6f2 languageName: node linkType: hard "@babel/plugin-transform-object-super@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-object-super@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-object-super@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-replace-supers": "npm:^7.24.1" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d30e6b9e59a707efd7ed524fc0a8deeea046011a6990250f2e9280516683138e2d13d9c52daf41d78407bdab0378aef7478326f2a15305b773d851cb6e106157 + checksum: 0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 languageName: node linkType: hard "@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7": - version: 7.24.5 - resolution: "@babel/plugin-transform-parameters@npm:7.24.5" + version: 7.25.9 + resolution: "@babel/plugin-transform-parameters@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e08b8c46a24b1b21dde7783cb0aeb56ffe9ef6d6f1795649ce76273657158d3bfa5370c6594200ed7d371983b599c8e194b76108dffed9ab5746fe630ef2e8f5 + checksum: aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 languageName: node linkType: hard "@babel/plugin-transform-property-literals@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3bf3e01f7bb8215a8b6d0081b6f86fea23e3a4543b619e059a264ede028bc58cdfb0acb2c43271271915a74917effa547bc280ac636a9901fa9f2fb45623f87e + checksum: 1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 languageName: node linkType: hard "@babel/plugin-transform-react-display-name@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: adf1a3cb0df8134533a558a9072a67e34127fd489dfe431c3348a86dd41f3e74861d5d5134bbb68f61a9cdb3f7e79b2acea1346be94ce4d3328a64e5a9e09be1 + checksum: 63a0f962d64e71baf87c212755419e25c637d2d95ea6fdc067df26b91e606ae186442ae815b99a577eca9bf5404d9577ecad218a3cf42d0e9e286ca7b003a992 languageName: node linkType: hard "@babel/plugin-transform-react-jsx@npm:^7.0.0": - version: 7.23.4 - resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/types": "npm:^7.23.4" + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8851b3adc515cd91bdb06ff3a23a0f81f0069cfef79dfb3fa744da4b7a82e3555ccb6324c4fa71ecf22508db13b9ff6a0ed96675f95fc87903b9fc6afb699580 + checksum: 5c9947e8ed141f7606f54da3e05eea1074950c5b8354c39df69cb7f43cb5a83c6c9d7973b24bc3d89341c8611f8ad50830a98ab10d117d850e6bdd8febdce221 languageName: node linkType: hard "@babel/plugin-transform-shorthand-properties@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8273347621183aada3cf1f3019d8d5f29467ba13a75b72cb405bc7f23b7e05fd85f4edb1e4d9f0103153dddb61826a42dc24d466480d707f8932c1923a4c25fa + checksum: 05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b languageName: node linkType: hard "@babel/plugin-transform-spread@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-spread@npm:7.24.1" + version: 7.25.9 + resolution: "@babel/plugin-transform-spread@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 50a0302e344546d57e5c9f4dea575f88e084352eeac4e9a3e238c41739eef2df1daf4a7ebbb3ccb7acd3447f6a5ce9938405f98bf5f5583deceb8257f5a673c9 + checksum: 996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf languageName: node linkType: hard "@babel/plugin-transform-template-literals@npm:^7.0.0": - version: 7.24.1 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.1" + version: 7.26.8 + resolution: "@babel/plugin-transform-template-literals@npm:7.26.8" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.26.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f73bcda5488eb81c6e7a876498d9e6b72be32fca5a4d9db9053491a2d1300cd27b889b463fd2558f3cd5826a85ed00f61d81b234aa55cb5a0abf1b6fa1bd5026 + checksum: 205a938ded9554857a604416d369023a961334b6c20943bd861b45f0e5dbbeca1cf6fda1c2049126e38a0d18865993433fdc78eae3028e94836b3b643c08ba0d languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.5.5": - version: 7.24.5 - resolution: "@babel/runtime@npm:7.24.5" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.5.5": + version: 7.27.0 + resolution: "@babel/runtime@npm:7.27.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 05730e43e8ba6550eae9fd4fb5e7d9d3cb91140379425abcb2a1ff9cebad518a280d82c4c4b0f57ada26a863106ac54a748d90c775790c0e2cd0ddd85ccdf346 + checksum: 35091ea9de48bd7fd26fb177693d64f4d195eb58ab2b142b893b7f3fa0f1d7c677604d36499ae0621a3703f35ba0c6a8f6c572cc8f7dc0317213841e493cf663 languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/template@npm:7.24.0" +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/template@npm:7.27.0" dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.24.0" - "@babel/types": "npm:^7.24.0" - checksum: 9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 13af543756127edb5f62bf121f9b093c09a2b6fe108373887ccffc701465cfbcb17e07cf48aa7f440415b263f6ec006e9415c79dfc2e8e6010b069435f81f340 languageName: node linkType: hard -"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/traverse@npm:7.24.5" +"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/traverse@npm:7.27.0" dependencies: - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.24.5" - "@babel/parser": "npm:^7.24.5" - "@babel/types": "npm:^7.24.5" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.27.0" + "@babel/parser": "npm:^7.27.0" + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 3f22534bc2b2ed9208e55ef48af3b32939032b23cb9dc4037447cb108640df70bbb0b9fea86e9c58648949fdc2cb14e89aa79ffa3c62a5dd43459a52fe8c01d1 + checksum: c7af29781960dacaae51762e8bc6c4b13d6ab4b17312990fbca9fc38e19c4ad7fecaae24b1cf52fb844e8e6cdc76c70ad597f90e496bcb3cc0a1d66b41a0aa5b languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.5, @babel/types@npm:^7.8.3": - version: 7.24.5 - resolution: "@babel/types@npm:7.24.5" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/types@npm:7.27.0" dependencies: - "@babel/helper-string-parser": "npm:^7.24.1" - "@babel/helper-validator-identifier": "npm:^7.24.5" - to-fast-properties: "npm:^2.0.0" - checksum: e1284eb046c5e0451b80220d1200e2327e0a8544a2fe45bb62c952e5fdef7099c603d2336b17b6eac3cc046b7a69bfbce67fe56e1c0ea48cd37c65cb88638f2a + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 6f1592eabe243c89a608717b07b72969be9d9d2fce1dee21426238757ea1fa60fdfc09b29de9e48d8104311afc6e6fb1702565a9cc1e09bc1e76f2b2ddb0f6e1 + languageName: node + linkType: hard + +"@bytecodealliance/preview2-shim@npm:0.17.0": + version: 0.17.0 + resolution: "@bytecodealliance/preview2-shim@npm:0.17.0" + checksum: a2cb46dd0e14319ec4c6b89cc6e629884a98120c70fc831131bc0941e03b8a40b35cd7d5bf4440653ac3658a73484a0be0a7066bfb4d2c43adc122488279c10b languageName: node linkType: hard @@ -818,15 +764,15 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^7.0.1": - version: 7.0.1 - resolution: "@changesets/apply-release-plan@npm:7.0.1" +"@changesets/apply-release-plan@npm:^7.0.10": + version: 7.0.10 + resolution: "@changesets/apply-release-plan@npm:7.0.10" dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/config": "npm:^3.0.0" + "@changesets/config": "npm:^3.1.1" "@changesets/get-version-range-type": "npm:^0.4.0" - "@changesets/git": "npm:^3.0.0" - "@changesets/types": "npm:^6.0.0" + "@changesets/git": "npm:^3.0.2" + "@changesets/should-skip-package": "npm:^0.1.2" + "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" detect-indent: "npm:^6.0.0" fs-extra: "npm:^7.0.1" @@ -835,87 +781,83 @@ __metadata: prettier: "npm:^2.7.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" - checksum: ca41f84a22a1fd25af4b195956afd393000139581a84528b6d21871e4ce417abf884ad2ef8a8ed7abb49031fed7cbb69226a158df36050aa70ed295636a42369 + checksum: 4ee5951448c26bbf73fac5c9a0785d5bb0cc3f2e6c1ffc9337766b446fe79a7b018834be2a4723938faec0d331aa30f1d6c7ea47db48d7a7babe37862645dd57 languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^6.0.0": - version: 6.0.0 - resolution: "@changesets/assemble-release-plan@npm:6.0.0" +"@changesets/assemble-release-plan@npm:^6.0.6": + version: 6.0.6 + resolution: "@changesets/assemble-release-plan@npm:6.0.6" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.0.0" - "@changesets/types": "npm:^6.0.0" + "@changesets/get-dependents-graph": "npm:^2.1.3" + "@changesets/should-skip-package": "npm:^0.1.2" + "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" semver: "npm:^7.5.3" - checksum: 7ccff4dba07fd5c7d219b69d6f5e5ec4ea942b3f3482a76be6f9caa072ae5b2128b4d6c561030cb488ca1bc23416a2f8f638daa784f4ae9792c89c9b571231b3 + checksum: 292c6570310818f5427b97f1ddfd518ae4493f47e2674ca40bb11251808a20d7f07bff548c4277b1ad5ddfe53602b69ae6628fc45864286e34edfb5f7c2e19a0 languageName: node linkType: hard -"@changesets/changelog-git@npm:^0.2.0": - version: 0.2.0 - resolution: "@changesets/changelog-git@npm:0.2.0" +"@changesets/changelog-git@npm:^0.2.1": + version: 0.2.1 + resolution: "@changesets/changelog-git@npm:0.2.1" dependencies: - "@changesets/types": "npm:^6.0.0" - checksum: d94df555656ac4ac9698d87a173b1955227ac0f1763d59b9b4d4f149ab3f879ca67603e48407b1dfdadaef4e7882ae7bbc7b7be160a45a55f05442004bdc61bd + "@changesets/types": "npm:^6.1.0" + checksum: 6a6fb315ffb2266fcb8f32ae9a60ccdb5436e52350a2f53beacf9822d3355f9052aba5001a718e12af472b4a8fabd69b408d0b11c02ac909ba7a183d27a9f7fd languageName: node linkType: hard "@changesets/cli@npm:^2.27.1": - version: 2.27.3 - resolution: "@changesets/cli@npm:2.27.3" - dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/apply-release-plan": "npm:^7.0.1" - "@changesets/assemble-release-plan": "npm:^6.0.0" - "@changesets/changelog-git": "npm:^0.2.0" - "@changesets/config": "npm:^3.0.0" + version: 2.28.1 + resolution: "@changesets/cli@npm:2.28.1" + dependencies: + "@changesets/apply-release-plan": "npm:^7.0.10" + "@changesets/assemble-release-plan": "npm:^6.0.6" + "@changesets/changelog-git": "npm:^0.2.1" + "@changesets/config": "npm:^3.1.1" "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.0.0" - "@changesets/get-release-plan": "npm:^4.0.0" - "@changesets/git": "npm:^3.0.0" - "@changesets/logger": "npm:^0.1.0" - "@changesets/pre": "npm:^2.0.0" - "@changesets/read": "npm:^0.6.0" - "@changesets/types": "npm:^6.0.0" - "@changesets/write": "npm:^0.3.1" + "@changesets/get-dependents-graph": "npm:^2.1.3" + "@changesets/get-release-plan": "npm:^4.0.8" + "@changesets/git": "npm:^3.0.2" + "@changesets/logger": "npm:^0.1.1" + "@changesets/pre": "npm:^2.0.2" + "@changesets/read": "npm:^0.6.3" + "@changesets/should-skip-package": "npm:^0.1.2" + "@changesets/types": "npm:^6.1.0" + "@changesets/write": "npm:^0.4.0" "@manypkg/get-packages": "npm:^1.1.3" - "@types/semver": "npm:^7.5.0" ansi-colors: "npm:^4.1.3" - chalk: "npm:^2.1.0" ci-info: "npm:^3.7.0" - enquirer: "npm:^2.3.0" + enquirer: "npm:^2.4.1" external-editor: "npm:^3.1.0" fs-extra: "npm:^7.0.1" - human-id: "npm:^1.0.2" - meow: "npm:^6.0.0" - outdent: "npm:^0.5.0" + mri: "npm:^1.2.0" p-limit: "npm:^2.2.0" - preferred-pm: "npm:^3.0.0" + package-manager-detector: "npm:^0.2.0" + picocolors: "npm:^1.1.0" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" - spawndamnit: "npm:^2.0.0" + spawndamnit: "npm:^3.0.1" term-size: "npm:^2.1.0" - tty-table: "npm:^4.1.5" bin: changeset: bin.js - checksum: fee10ae204926dbf4847111bf49ca93dc5b43a55b48635e2e08e71ab8442cf414c8165ae11174d6366ef12305274ea1b75beb14ca74b9a766d82b8c32148199b + checksum: f965b56fa533f91b5de0f5fd5b09fac46662f023dafbe474d3fc7ceb71629dce4783a37429a927d50292a7ea95c0694e5a8f0c143d9cbba95d28a4d11ab8106b languageName: node linkType: hard -"@changesets/config@npm:^3.0.0": - version: 3.0.0 - resolution: "@changesets/config@npm:3.0.0" +"@changesets/config@npm:^3.1.1": + version: 3.1.1 + resolution: "@changesets/config@npm:3.1.1" dependencies: "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.0.0" - "@changesets/logger": "npm:^0.1.0" - "@changesets/types": "npm:^6.0.0" + "@changesets/get-dependents-graph": "npm:^2.1.3" + "@changesets/logger": "npm:^0.1.1" + "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" fs-extra: "npm:^7.0.1" - micromatch: "npm:^4.0.2" - checksum: c64463a92b99986e42657c3b8804851aab8b592bb64532177ce35769a7fedfad3ce1395ad0e2ab3e357e3029fd23333bff1ce51bc3634e6f43223724398639d3 + micromatch: "npm:^4.0.8" + checksum: e6e529ca9525d1550cc2155a01a477c5b923e084985cb5cb15b6efc06da543c2faf623dd67d305688ffa8a8fc9d48f1ba74ad6653ce230183e40f10ffaa0c2dc languageName: node linkType: hard @@ -928,31 +870,29 @@ __metadata: languageName: node linkType: hard -"@changesets/get-dependents-graph@npm:^2.0.0": - version: 2.0.0 - resolution: "@changesets/get-dependents-graph@npm:2.0.0" +"@changesets/get-dependents-graph@npm:^2.1.3": + version: 2.1.3 + resolution: "@changesets/get-dependents-graph@npm:2.1.3" dependencies: - "@changesets/types": "npm:^6.0.0" + "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" - chalk: "npm:^2.1.0" - fs-extra: "npm:^7.0.1" + picocolors: "npm:^1.1.0" semver: "npm:^7.5.3" - checksum: 68ac8f7f0b7b6f671b9809541238798aebe9250b083f6d9dace1305c436b565a71634412e83f642c6b21ed8656f4d548c92f583d2f4c6bf7a8665f6dddf14309 + checksum: b9d9992440b7e09dcaf22f57d28f1d8e0e31996e1bc44dbbfa1801e44f93fa49ebba6f9356c60f6ff0bd85cd0f0d0b8602f7e0f2addc5be647b686e6f8985f70 languageName: node linkType: hard -"@changesets/get-release-plan@npm:^4.0.0": - version: 4.0.0 - resolution: "@changesets/get-release-plan@npm:4.0.0" - dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/assemble-release-plan": "npm:^6.0.0" - "@changesets/config": "npm:^3.0.0" - "@changesets/pre": "npm:^2.0.0" - "@changesets/read": "npm:^0.6.0" - "@changesets/types": "npm:^6.0.0" +"@changesets/get-release-plan@npm:^4.0.8": + version: 4.0.8 + resolution: "@changesets/get-release-plan@npm:4.0.8" + dependencies: + "@changesets/assemble-release-plan": "npm:^6.0.6" + "@changesets/config": "npm:^3.1.1" + "@changesets/pre": "npm:^2.0.2" + "@changesets/read": "npm:^0.6.3" + "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" - checksum: d77140ca1d45a6e70c3ed8a3859986a7d1ae40c015a8ca85910acec6455e333311c78e3664d9cee02ed540020f7bacde1846d3cff58ec2ffd64edd55bf8a114b + checksum: b638f83683264818ea6cb729a3fd10f9edf29c61c7acee15ce321287cacbe03700706a20c0b531fdb3bbb23bda8967f4c6cbef08db207189fb7289313f473a1a languageName: node linkType: hard @@ -963,66 +903,72 @@ __metadata: languageName: node linkType: hard -"@changesets/git@npm:^3.0.0": - version: 3.0.0 - resolution: "@changesets/git@npm:3.0.0" +"@changesets/git@npm:^3.0.2": + version: 3.0.2 + resolution: "@changesets/git@npm:3.0.2" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/errors": "npm:^0.2.0" - "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" is-subdir: "npm:^1.1.1" - micromatch: "npm:^4.0.2" - spawndamnit: "npm:^2.0.0" - checksum: 75b0ce2d8c52c8141a2d07be1cc05da15463d6f93a8a95351e171c6c3d48345b3134f33bfeb695a11467adbcc51ff3d87487995a61fba99af89063eac4a8ce7a + micromatch: "npm:^4.0.8" + spawndamnit: "npm:^3.0.1" + checksum: a3a9c9ab71e3cd8ecd804e2965790efa40bdcd29804bdf873c5d38f7cfd8cd6ae1c23a6eb5a16796a3e05c4dbfeb0eb04f4be988049f31173adbbeac9e7cf566 languageName: node linkType: hard -"@changesets/logger@npm:^0.1.0": - version: 0.1.0 - resolution: "@changesets/logger@npm:0.1.0" +"@changesets/logger@npm:^0.1.1": + version: 0.1.1 + resolution: "@changesets/logger@npm:0.1.1" dependencies: - chalk: "npm:^2.1.0" - checksum: b40365a4e62be4bf7a75c5900e8f95b1abd8fb9ff9f2cf71a7b567532377ddd5490b0ee1d566189a91e8c8250c9e875d333cfb3e44a34c230a11fd61337f923e + picocolors: "npm:^1.1.0" + checksum: a0933b5bd4d99e10730b22612dc1bdfd25b8804c5b48f8cada050bf5c7a89b2ae9a61687f846a5e9e5d379a95b59fef795c8d5d91e49a251f8da2be76133f83f languageName: node linkType: hard -"@changesets/parse@npm:^0.4.0": - version: 0.4.0 - resolution: "@changesets/parse@npm:0.4.0" +"@changesets/parse@npm:^0.4.1": + version: 0.4.1 + resolution: "@changesets/parse@npm:0.4.1" dependencies: - "@changesets/types": "npm:^6.0.0" + "@changesets/types": "npm:^6.1.0" js-yaml: "npm:^3.13.1" - checksum: 8e76f8540aceb2263eb76c97f027c1990fc069bf275321ad0aabf843cb51bc6711b13118eda35c701a30a36d26f48e75f7afc14e9a5c863f8a98091021fd5d61 + checksum: 8caf73b48addb1add246f0287f0dcbd47ca0444b33f251b6208dad36de9c21d2654f0ae0527e5bf14b075be23144b59f48a36e2d87850fb7c004050f07461fdc languageName: node linkType: hard -"@changesets/pre@npm:^2.0.0": - version: 2.0.0 - resolution: "@changesets/pre@npm:2.0.0" +"@changesets/pre@npm:^2.0.2": + version: 2.0.2 + resolution: "@changesets/pre@npm:2.0.2" dependencies: - "@babel/runtime": "npm:^7.20.1" "@changesets/errors": "npm:^0.2.0" - "@changesets/types": "npm:^6.0.0" + "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" fs-extra: "npm:^7.0.1" - checksum: 3971fb9b3f8b1719a983b82fcd34aab573151d0765ff38ae44f31d66d040ca40d33e80808b3694ae40331ebf6d654d479352c3bc0a964ad553200ebf5d1ec44f + checksum: 0af9396d84c47a88d79b757e9db4e3579b6620260f92c243b8349e7fcefca3c2652583f6d215c13115bed5d5cdc30c975f307fd6acbb89d205b1ba2ae403b918 languageName: node linkType: hard -"@changesets/read@npm:^0.6.0": - version: 0.6.0 - resolution: "@changesets/read@npm:0.6.0" - dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/git": "npm:^3.0.0" - "@changesets/logger": "npm:^0.1.0" - "@changesets/parse": "npm:^0.4.0" - "@changesets/types": "npm:^6.0.0" - chalk: "npm:^2.1.0" +"@changesets/read@npm:^0.6.3": + version: 0.6.3 + resolution: "@changesets/read@npm:0.6.3" + dependencies: + "@changesets/git": "npm:^3.0.2" + "@changesets/logger": "npm:^0.1.1" + "@changesets/parse": "npm:^0.4.1" + "@changesets/types": "npm:^6.1.0" fs-extra: "npm:^7.0.1" p-filter: "npm:^2.1.0" - checksum: ec2914fb89de923145a3482e00a2930b011c9c7a7c5690b053e344e8e8941ab06087bd3fe3b6cc01a651656c0438b5f9b96c616c7df1ad146f87b8751701bf5a + picocolors: "npm:^1.1.0" + checksum: 4c2eac60aab0a6b14ad5a2ed2f57427019fe567dd6d2c6e122bd3cbf7f69903dcec6c864a67c39544ed011369223c838e498212303404a7f884428f4366f10da + languageName: node + linkType: hard + +"@changesets/should-skip-package@npm:^0.1.2": + version: 0.1.2 + resolution: "@changesets/should-skip-package@npm:0.1.2" + dependencies: + "@changesets/types": "npm:^6.1.0" + "@manypkg/get-packages": "npm:^1.1.3" + checksum: 484e339e7d6e6950e12bff4eda6e8eccb077c0fbb1f09dd95d2ae948b715226a838c71eaf50cd2d7e0e631ce3bfb1ca93ac752436e6feae5b87aece2e917b440 languageName: node linkType: hard @@ -1033,23 +979,22 @@ __metadata: languageName: node linkType: hard -"@changesets/types@npm:^6.0.0": - version: 6.0.0 - resolution: "@changesets/types@npm:6.0.0" - checksum: e755f208792547e3b9ece15ce4da22466267da810c6fd87d927a1b8cec4d7fb7f0eea0d1a7585747676238e3e4ba1ffdabe016ccb05cfa537b4e4b03ec399f41 +"@changesets/types@npm:^6.1.0": + version: 6.1.0 + resolution: "@changesets/types@npm:6.1.0" + checksum: b4cea3a4465d1eaf0bbd7be1e404aca5a055a61d4cc72aadcb73bbbda1670b4022736b8d3052616cbf1f451afa0637545d077697f4b923236539af9cd5abce6c languageName: node linkType: hard -"@changesets/write@npm:^0.3.1": - version: 0.3.1 - resolution: "@changesets/write@npm:0.3.1" +"@changesets/write@npm:^0.4.0": + version: 0.4.0 + resolution: "@changesets/write@npm:0.4.0" dependencies: - "@babel/runtime": "npm:^7.20.1" - "@changesets/types": "npm:^6.0.0" + "@changesets/types": "npm:^6.1.0" fs-extra: "npm:^7.0.1" - human-id: "npm:^1.0.2" + human-id: "npm:^4.1.1" prettier: "npm:^2.7.1" - checksum: 6c6ef4c12f93ae10706eea96fae73ab05fddeaa1870102681106a29e4e92c37be9643f214c56187141ab5cf3a4cccb4e8a59212d0fa6c7c26083c5d613878c9a + checksum: 311f4d0e536d1b5f2d3f9053537d62b2d4cdbd51e1d2767807ac9d1e0f380367f915d2ad370e5c73902d5a54bffd282d53fff5418c8ad31df51751d652bea826 languageName: node linkType: hard @@ -1572,20 +1517,20 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" + version: 4.5.1 + resolution: "@eslint-community/eslint-utils@npm:4.5.1" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + checksum: b520ae1b7bd04531a5c5da2021071815df4717a9f7d13720e3a5ddccf5c9c619532039830811fcbae1c2f1c9d133e63af2435ee69e0fc0fabbd6d928c6800fb2 languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard @@ -1606,10 +1551,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 languageName: node linkType: hard @@ -1770,7 +1715,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.0.0, @ethersproject/abi@npm:^5.0.9, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.5.0, @ethersproject/abi@npm:^5.6.0, @ethersproject/abi@npm:^5.6.3, @ethersproject/abi@npm:^5.7.0": +"@ethersproject/abi@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/abi@npm:5.7.0" dependencies: @@ -1787,6 +1732,23 @@ __metadata: languageName: node linkType: hard +"@ethersproject/abi@npm:5.8.0, @ethersproject/abi@npm:^5.0.0, @ethersproject/abi@npm:^5.0.9, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.5.0, @ethersproject/abi@npm:^5.6.0, @ethersproject/abi@npm:^5.6.3, @ethersproject/abi@npm:^5.7.0, @ethersproject/abi@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/abi@npm:5.8.0" + dependencies: + "@ethersproject/address": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/constants": "npm:^5.8.0" + "@ethersproject/hash": "npm:^5.8.0" + "@ethersproject/keccak256": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + checksum: 6b759247a2f43ecc1548647d0447d08de1e946dfc7e71bfb014fa2f749c1b76b742a1d37394660ebab02ff8565674b3593fdfa011e16a5adcfc87ca4d85af39c + languageName: node + linkType: hard + "@ethersproject/abstract-provider@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/abstract-provider@npm:5.6.0" @@ -1802,7 +1764,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.6.0, @ethersproject/abstract-provider@npm:^5.7.0": +"@ethersproject/abstract-provider@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/abstract-provider@npm:5.7.0" dependencies: @@ -1817,6 +1779,21 @@ __metadata: languageName: node linkType: hard +"@ethersproject/abstract-provider@npm:5.8.0, @ethersproject/abstract-provider@npm:^5.6.0, @ethersproject/abstract-provider@npm:^5.7.0, @ethersproject/abstract-provider@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/abstract-provider@npm:5.8.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/networks": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/transactions": "npm:^5.8.0" + "@ethersproject/web": "npm:^5.8.0" + checksum: 9c183da1d037b272ff2b03002c3d801088d0534f88985f4983efc5f3ebd59b05f04bc05db97792fe29ddf87eeba3c73416e5699615f183126f85f877ea6c8637 + languageName: node + linkType: hard + "@ethersproject/abstract-signer@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/abstract-signer@npm:5.6.0" @@ -1830,7 +1807,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.0.0, @ethersproject/abstract-signer@npm:^5.6.0, @ethersproject/abstract-signer@npm:^5.7.0": +"@ethersproject/abstract-signer@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/abstract-signer@npm:5.7.0" dependencies: @@ -1843,6 +1820,19 @@ __metadata: languageName: node linkType: hard +"@ethersproject/abstract-signer@npm:5.8.0, @ethersproject/abstract-signer@npm:^5.0.0, @ethersproject/abstract-signer@npm:^5.6.0, @ethersproject/abstract-signer@npm:^5.7.0, @ethersproject/abstract-signer@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/abstract-signer@npm:5.8.0" + dependencies: + "@ethersproject/abstract-provider": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + checksum: 143f32d7cb0bc7064e45674d4a9dffdb90d6171425d20e8de9dc95765be960534bae7246ead400e6f52346624b66569d9585d790eedd34b0b6b7f481ec331cc2 + languageName: node + linkType: hard + "@ethersproject/address@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/address@npm:5.6.0" @@ -1869,7 +1859,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:>=5.0.0-beta.128, @ethersproject/address@npm:^5.0.0, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.0.8, @ethersproject/address@npm:^5.6.0, @ethersproject/address@npm:^5.7.0": +"@ethersproject/address@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/address@npm:5.7.0" dependencies: @@ -1882,6 +1872,19 @@ __metadata: languageName: node linkType: hard +"@ethersproject/address@npm:5.8.0, @ethersproject/address@npm:>=5.0.0-beta.128, @ethersproject/address@npm:^5.0.0, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.0.8, @ethersproject/address@npm:^5.6.0, @ethersproject/address@npm:^5.7.0, @ethersproject/address@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/address@npm:5.8.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/keccak256": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/rlp": "npm:^5.8.0" + checksum: 8bac8a4b567c75c1abc00eeca08c200de1a2d5cf76d595dc04fa4d7bff9ffa5530b2cdfc5e8656cfa8f6fa046de54be47620a092fb429830a8ddde410b9d50bc + languageName: node + linkType: hard + "@ethersproject/base64@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/base64@npm:5.6.0" @@ -1891,7 +1894,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.6.0, @ethersproject/base64@npm:^5.7.0": +"@ethersproject/base64@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/base64@npm:5.7.0" dependencies: @@ -1900,6 +1903,15 @@ __metadata: languageName: node linkType: hard +"@ethersproject/base64@npm:5.8.0, @ethersproject/base64@npm:^5.6.0, @ethersproject/base64@npm:^5.7.0, @ethersproject/base64@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/base64@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + checksum: 60ae6d1e2367d70f4090b717852efe62075442ae59aeac9bb1054fe8306a2de8ef0b0561e7fb4666ecb1f8efa1655d683dd240675c3a25d6fa867245525a63ca + languageName: node + linkType: hard + "@ethersproject/basex@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/basex@npm:5.6.0" @@ -1910,7 +1922,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.6.0, @ethersproject/basex@npm:^5.7.0": +"@ethersproject/basex@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/basex@npm:5.7.0" dependencies: @@ -1920,6 +1932,16 @@ __metadata: languageName: node linkType: hard +"@ethersproject/basex@npm:5.8.0, @ethersproject/basex@npm:^5.6.0, @ethersproject/basex@npm:^5.7.0, @ethersproject/basex@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/basex@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + checksum: 46a94ba9678fc458ab0bee4a0af9f659f1d3f5df5bb98485924fe8ecbd46eda37d81f95f882243d56f0f5efe051b0749163f5056e48ff836c5fba648754d4956 + languageName: node + linkType: hard + "@ethersproject/bignumber@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/bignumber@npm:5.6.0" @@ -1931,7 +1953,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:>=5.0.0-beta.130, @ethersproject/bignumber@npm:^5.0.0, @ethersproject/bignumber@npm:^5.1.1, @ethersproject/bignumber@npm:^5.6.0, @ethersproject/bignumber@npm:^5.6.2, @ethersproject/bignumber@npm:^5.7.0": +"@ethersproject/bignumber@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/bignumber@npm:5.7.0" dependencies: @@ -1942,6 +1964,17 @@ __metadata: languageName: node linkType: hard +"@ethersproject/bignumber@npm:5.8.0, @ethersproject/bignumber@npm:>=5.0.0-beta.130, @ethersproject/bignumber@npm:^5.0.0, @ethersproject/bignumber@npm:^5.1.1, @ethersproject/bignumber@npm:^5.6.0, @ethersproject/bignumber@npm:^5.6.2, @ethersproject/bignumber@npm:^5.7.0, @ethersproject/bignumber@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/bignumber@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + bn.js: "npm:^5.2.1" + checksum: 8e87fa96999d59d0ab4c814c79e3a8354d2ba914dfa78cf9ee688f53110473cec0df0db2aaf9d447e84ab2dbbfca39979abac4f2dac69fef4d080f4cc3e29613 + languageName: node + linkType: hard + "@ethersproject/bytes@npm:5.6.1": version: 5.6.1 resolution: "@ethersproject/bytes@npm:5.6.1" @@ -1951,7 +1984,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:>=5.0.0-beta.129, @ethersproject/bytes@npm:^5.0.0, @ethersproject/bytes@npm:^5.0.8, @ethersproject/bytes@npm:^5.6.0, @ethersproject/bytes@npm:^5.6.1, @ethersproject/bytes@npm:^5.7.0": +"@ethersproject/bytes@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/bytes@npm:5.7.0" dependencies: @@ -1960,6 +1993,15 @@ __metadata: languageName: node linkType: hard +"@ethersproject/bytes@npm:5.8.0, @ethersproject/bytes@npm:>=5.0.0-beta.129, @ethersproject/bytes@npm:^5.0.0, @ethersproject/bytes@npm:^5.0.8, @ethersproject/bytes@npm:^5.6.0, @ethersproject/bytes@npm:^5.6.1, @ethersproject/bytes@npm:^5.7.0, @ethersproject/bytes@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/bytes@npm:5.8.0" + dependencies: + "@ethersproject/logger": "npm:^5.8.0" + checksum: 47ef798f3ab43b95dc74097b2c92365c919308ecabc3e34d9f8bf7f886fa4b99837ba5cf4dc8921baaaafe6899982f96b0e723b3fc49132c061f83d1ca3fed8b + languageName: node + linkType: hard + "@ethersproject/constants@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/constants@npm:5.6.0" @@ -1969,7 +2011,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:>=5.0.0-beta.128, @ethersproject/constants@npm:^5.6.0, @ethersproject/constants@npm:^5.7.0": +"@ethersproject/constants@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/constants@npm:5.7.0" dependencies: @@ -1978,6 +2020,15 @@ __metadata: languageName: node linkType: hard +"@ethersproject/constants@npm:5.8.0, @ethersproject/constants@npm:>=5.0.0-beta.128, @ethersproject/constants@npm:^5.6.0, @ethersproject/constants@npm:^5.7.0, @ethersproject/constants@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/constants@npm:5.8.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.8.0" + checksum: 374b3c2c6da24f8fef62e2316eae96faa462826c0774ef588cd7313ae7ddac8eb1bb85a28dad80123148be2ba0821c217c14ecfc18e2e683c72adc734b6248c9 + languageName: node + linkType: hard + "@ethersproject/contracts@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/contracts@npm:5.6.0" @@ -1996,7 +2047,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/contracts@npm:5.7.0, @ethersproject/contracts@npm:^5.0.0, @ethersproject/contracts@npm:^5.7.0": +"@ethersproject/contracts@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/contracts@npm:5.7.0" dependencies: @@ -2014,14 +2065,32 @@ __metadata: languageName: node linkType: hard +"@ethersproject/contracts@npm:5.8.0, @ethersproject/contracts@npm:^5.0.0, @ethersproject/contracts@npm:^5.7.0": + version: 5.8.0 + resolution: "@ethersproject/contracts@npm:5.8.0" + dependencies: + "@ethersproject/abi": "npm:^5.8.0" + "@ethersproject/abstract-provider": "npm:^5.8.0" + "@ethersproject/abstract-signer": "npm:^5.8.0" + "@ethersproject/address": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/constants": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/transactions": "npm:^5.8.0" + checksum: 49961b92334c4f2fab5f4da8f3119e97c1dc39cc8695e3043931757968213f5e732c00bf896193cf0186dcb33101dcd6efb70690dee0dd2cfbfd3843f55485aa + languageName: node + linkType: hard + "@ethersproject/experimental@npm:^5.0.7, @ethersproject/experimental@npm:^5.6.0, @ethersproject/experimental@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/experimental@npm:5.7.0" + version: 5.8.0 + resolution: "@ethersproject/experimental@npm:5.8.0" dependencies: - "@ethersproject/web": "npm:^5.7.0" - ethers: "npm:^5.7.0" + "@ethersproject/web": "npm:^5.8.0" + ethers: "npm:^5.8.0" scrypt-js: "npm:3.0.1" - checksum: 0546f8737ca062ce7d4a890d9cb354fde34b10b042b1d6b26e7206810c39d0fdb7ac20e60686a89f3f41faf33cc4c4c7366f49700a2d0978f0457e79759a79a4 + checksum: 61412f6762b0fe09ff605eb45e317aa753b96223a4ea77351209a1424ea67ce43edb57ec1cb1b53ed07917fac224cd4e5c763ad9ca6e7128c4d5c830f5f33dd0 languageName: node linkType: hard @@ -2041,7 +2110,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/hash@npm:5.7.0, @ethersproject/hash@npm:>=5.0.0-beta.128, @ethersproject/hash@npm:^5.6.0, @ethersproject/hash@npm:^5.7.0": +"@ethersproject/hash@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/hash@npm:5.7.0" dependencies: @@ -2058,6 +2127,23 @@ __metadata: languageName: node linkType: hard +"@ethersproject/hash@npm:5.8.0, @ethersproject/hash@npm:>=5.0.0-beta.128, @ethersproject/hash@npm:^5.6.0, @ethersproject/hash@npm:^5.7.0, @ethersproject/hash@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/hash@npm:5.8.0" + dependencies: + "@ethersproject/abstract-signer": "npm:^5.8.0" + "@ethersproject/address": "npm:^5.8.0" + "@ethersproject/base64": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/keccak256": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + checksum: 72a287d4d70fae716827587339ffb449b8c23ef8728db6f8a661f359f7cb1e5ffba5b693c55e09d4e7162bf56af4a0e98a334784e0706d98102d1a5786241537 + languageName: node + linkType: hard + "@ethersproject/hdnode@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/hdnode@npm:5.6.0" @@ -2078,7 +2164,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.6.0, @ethersproject/hdnode@npm:^5.7.0": +"@ethersproject/hdnode@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/hdnode@npm:5.7.0" dependencies: @@ -2098,6 +2184,26 @@ __metadata: languageName: node linkType: hard +"@ethersproject/hdnode@npm:5.8.0, @ethersproject/hdnode@npm:^5.6.0, @ethersproject/hdnode@npm:^5.7.0, @ethersproject/hdnode@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/hdnode@npm:5.8.0" + dependencies: + "@ethersproject/abstract-signer": "npm:^5.8.0" + "@ethersproject/basex": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/pbkdf2": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/sha2": "npm:^5.8.0" + "@ethersproject/signing-key": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + "@ethersproject/transactions": "npm:^5.8.0" + "@ethersproject/wordlists": "npm:^5.8.0" + checksum: da0ac7d60e76a76471be1f4f3bba3f28a24165dc3b63c6930a9ec24481e9f8b23936e5fc96363b3591cdfda4381d4623f25b06898b89bf5530b158cb5ea58fdd + languageName: node + linkType: hard + "@ethersproject/json-wallets@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/json-wallets@npm:5.6.0" @@ -2119,7 +2225,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.6.0, @ethersproject/json-wallets@npm:^5.7.0": +"@ethersproject/json-wallets@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/json-wallets@npm:5.7.0" dependencies: @@ -2140,6 +2246,27 @@ __metadata: languageName: node linkType: hard +"@ethersproject/json-wallets@npm:5.8.0, @ethersproject/json-wallets@npm:^5.6.0, @ethersproject/json-wallets@npm:^5.7.0, @ethersproject/json-wallets@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/json-wallets@npm:5.8.0" + dependencies: + "@ethersproject/abstract-signer": "npm:^5.8.0" + "@ethersproject/address": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/hdnode": "npm:^5.8.0" + "@ethersproject/keccak256": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/pbkdf2": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/random": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + "@ethersproject/transactions": "npm:^5.8.0" + aes-js: "npm:3.0.0" + scrypt-js: "npm:3.0.1" + checksum: 6c5cac87bdfac9ac47bf6ac25168a85865dc02e398e97f83820568c568a8cb27cf13a3a5d482f71a2534c7d704a3faa46023bb7ebe8737872b376bec1b66c67b + languageName: node + linkType: hard + "@ethersproject/keccak256@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/keccak256@npm:5.6.0" @@ -2150,7 +2277,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:>=5.0.0-beta.127, @ethersproject/keccak256@npm:^5.6.0, @ethersproject/keccak256@npm:^5.6.1, @ethersproject/keccak256@npm:^5.7.0": +"@ethersproject/keccak256@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/keccak256@npm:5.7.0" dependencies: @@ -2160,6 +2287,16 @@ __metadata: languageName: node linkType: hard +"@ethersproject/keccak256@npm:5.8.0, @ethersproject/keccak256@npm:>=5.0.0-beta.127, @ethersproject/keccak256@npm:^5.6.0, @ethersproject/keccak256@npm:^5.6.1, @ethersproject/keccak256@npm:^5.7.0, @ethersproject/keccak256@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/keccak256@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + js-sha3: "npm:0.8.0" + checksum: cd93ac6a5baf842313cde7de5e6e2c41feeea800db9e82955f96e7f3462d2ac6a6a29282b1c9e93b84ce7c91eec02347043c249fd037d6051214275bfc7fe99f + languageName: node + linkType: hard + "@ethersproject/logger@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/logger@npm:5.6.0" @@ -2167,13 +2304,20 @@ __metadata: languageName: node linkType: hard -"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:>=5.0.0-beta.129, @ethersproject/logger@npm:^5.6.0, @ethersproject/logger@npm:^5.7.0": +"@ethersproject/logger@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/logger@npm:5.7.0" checksum: d03d460fb2d4a5e71c627b7986fb9e50e1b59a6f55e8b42a545b8b92398b961e7fd294bd9c3d8f92b35d0f6ff9d15aa14c95eab378f8ea194e943c8ace343501 languageName: node linkType: hard +"@ethersproject/logger@npm:5.8.0, @ethersproject/logger@npm:>=5.0.0-beta.129, @ethersproject/logger@npm:^5.6.0, @ethersproject/logger@npm:^5.7.0, @ethersproject/logger@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/logger@npm:5.8.0" + checksum: 7f39f33e8f254ee681d4778bb71ce3c5de248e1547666f85c43bfbc1c18996c49a31f969f056b66d23012f2420f2d39173107284bc41eb98d0482ace1d06403e + languageName: node + linkType: hard + "@ethersproject/networks@npm:5.6.1": version: 5.6.1 resolution: "@ethersproject/networks@npm:5.6.1" @@ -2192,12 +2336,12 @@ __metadata: languageName: node linkType: hard -"@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.6.0, @ethersproject/networks@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/networks@npm:5.7.1" +"@ethersproject/networks@npm:5.8.0, @ethersproject/networks@npm:^5.6.0, @ethersproject/networks@npm:^5.7.0, @ethersproject/networks@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/networks@npm:5.8.0" dependencies: - "@ethersproject/logger": "npm:^5.7.0" - checksum: 9efcdce27f150459e85d74af3f72d5c32898823a99f5410e26bf26cca2d21fb14e403377314a93aea248e57fb2964e19cee2c3f7bfc586ceba4c803a8f1b75c0 + "@ethersproject/logger": "npm:^5.8.0" + checksum: 3f23bcc4c3843cc9b7e4b9f34df0a1f230b24dc87d51cdad84552302159a84d7899cd80c8a3d2cf8007b09ac373a5b10407007adde23d4c4881a4d6ee6bc4b9c languageName: node linkType: hard @@ -2211,7 +2355,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.6.0, @ethersproject/pbkdf2@npm:^5.7.0": +"@ethersproject/pbkdf2@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/pbkdf2@npm:5.7.0" dependencies: @@ -2221,6 +2365,16 @@ __metadata: languageName: node linkType: hard +"@ethersproject/pbkdf2@npm:5.8.0, @ethersproject/pbkdf2@npm:^5.6.0, @ethersproject/pbkdf2@npm:^5.7.0, @ethersproject/pbkdf2@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/pbkdf2@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/sha2": "npm:^5.8.0" + checksum: 0397cf5370cfd568743c3e46ac431f1bd425239baa2691689f1430997d44d310cef5051ea9ee53fabe444f96aced8d6324b41da698e8d7021389dce36251e7e9 + languageName: node + linkType: hard + "@ethersproject/properties@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/properties@npm:5.6.0" @@ -2230,7 +2384,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:>=5.0.0-beta.131, @ethersproject/properties@npm:^5.6.0, @ethersproject/properties@npm:^5.7.0": +"@ethersproject/properties@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/properties@npm:5.7.0" dependencies: @@ -2239,6 +2393,15 @@ __metadata: languageName: node linkType: hard +"@ethersproject/properties@npm:5.8.0, @ethersproject/properties@npm:>=5.0.0-beta.131, @ethersproject/properties@npm:^5.6.0, @ethersproject/properties@npm:^5.7.0, @ethersproject/properties@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/properties@npm:5.8.0" + dependencies: + "@ethersproject/logger": "npm:^5.8.0" + checksum: 20256d7eed65478a38dabdea4c3980c6591b7b75f8c45089722b032ceb0e1cd3dd6dd60c436cfe259337e6909c28d99528c172d06fc74bbd61be8eb9e68be2e6 + languageName: node + linkType: hard + "@ethersproject/providers@npm:5.6.2": version: 5.6.2 resolution: "@ethersproject/providers@npm:5.6.2" @@ -2294,31 +2457,31 @@ __metadata: languageName: node linkType: hard -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.0.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": - version: 5.7.2 - resolution: "@ethersproject/providers@npm:5.7.2" - dependencies: - "@ethersproject/abstract-provider": "npm:^5.7.0" - "@ethersproject/abstract-signer": "npm:^5.7.0" - "@ethersproject/address": "npm:^5.7.0" - "@ethersproject/base64": "npm:^5.7.0" - "@ethersproject/basex": "npm:^5.7.0" - "@ethersproject/bignumber": "npm:^5.7.0" - "@ethersproject/bytes": "npm:^5.7.0" - "@ethersproject/constants": "npm:^5.7.0" - "@ethersproject/hash": "npm:^5.7.0" - "@ethersproject/logger": "npm:^5.7.0" - "@ethersproject/networks": "npm:^5.7.0" - "@ethersproject/properties": "npm:^5.7.0" - "@ethersproject/random": "npm:^5.7.0" - "@ethersproject/rlp": "npm:^5.7.0" - "@ethersproject/sha2": "npm:^5.7.0" - "@ethersproject/strings": "npm:^5.7.0" - "@ethersproject/transactions": "npm:^5.7.0" - "@ethersproject/web": "npm:^5.7.0" +"@ethersproject/providers@npm:5.8.0, @ethersproject/providers@npm:^5.0.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": + version: 5.8.0 + resolution: "@ethersproject/providers@npm:5.8.0" + dependencies: + "@ethersproject/abstract-provider": "npm:^5.8.0" + "@ethersproject/abstract-signer": "npm:^5.8.0" + "@ethersproject/address": "npm:^5.8.0" + "@ethersproject/base64": "npm:^5.8.0" + "@ethersproject/basex": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/constants": "npm:^5.8.0" + "@ethersproject/hash": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/networks": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/random": "npm:^5.8.0" + "@ethersproject/rlp": "npm:^5.8.0" + "@ethersproject/sha2": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + "@ethersproject/transactions": "npm:^5.8.0" + "@ethersproject/web": "npm:^5.8.0" bech32: "npm:1.1.4" - ws: "npm:7.4.6" - checksum: 4c8d19e6b31f769c24042fb2d02e483a4ee60dcbfca9e3291f0a029b24337c47d1ea719a390be856f8fd02997125819e834415e77da4fb2023369712348dae4c + ws: "npm:8.18.0" + checksum: 893dba429443bbf0a3eadef850e772ad1c706cf17ae6ae48b73467a23b614a3f461e9004850e24439b5c73d30e9259bc983f0f90a911ba11af749e6384fd355a languageName: node linkType: hard @@ -2332,7 +2495,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.6.0, @ethersproject/random@npm:^5.7.0": +"@ethersproject/random@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/random@npm:5.7.0" dependencies: @@ -2342,6 +2505,16 @@ __metadata: languageName: node linkType: hard +"@ethersproject/random@npm:5.8.0, @ethersproject/random@npm:^5.6.0, @ethersproject/random@npm:^5.7.0, @ethersproject/random@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/random@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + checksum: e44c010715668fc29383141ae16cd2ec00c34a434d47e23338e740b8c97372515d95d3b809b969eab2055c19e92b985ca591d326fbb71270c26333215f9925d1 + languageName: node + linkType: hard + "@ethersproject/rlp@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/rlp@npm:5.6.0" @@ -2352,7 +2525,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.6.0, @ethersproject/rlp@npm:^5.6.1, @ethersproject/rlp@npm:^5.7.0": +"@ethersproject/rlp@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/rlp@npm:5.7.0" dependencies: @@ -2362,6 +2535,16 @@ __metadata: languageName: node linkType: hard +"@ethersproject/rlp@npm:5.8.0, @ethersproject/rlp@npm:^5.6.0, @ethersproject/rlp@npm:^5.6.1, @ethersproject/rlp@npm:^5.7.0, @ethersproject/rlp@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/rlp@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + checksum: db742ec9c1566d6441242cc2c2ae34c1e5304d48e1fe62bc4e53b1791f219df211e330d2de331e0e4f74482664e205c2e4220e76138bd71f1ec07884e7f5221b + languageName: node + linkType: hard + "@ethersproject/sha2@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/sha2@npm:5.6.0" @@ -2373,7 +2556,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.6.0, @ethersproject/sha2@npm:^5.7.0": +"@ethersproject/sha2@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/sha2@npm:5.7.0" dependencies: @@ -2384,6 +2567,17 @@ __metadata: languageName: node linkType: hard +"@ethersproject/sha2@npm:5.8.0, @ethersproject/sha2@npm:^5.6.0, @ethersproject/sha2@npm:^5.7.0, @ethersproject/sha2@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/sha2@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + hash.js: "npm:1.1.7" + checksum: eab941907b7d40ee8436acaaedee32306ed4de2cb9ab37543bc89b1dd2a78f28c8da21efd848525fa1b04a78575be426cfca28f5392f4d28ce6c84e7c26a9421 + languageName: node + linkType: hard + "@ethersproject/signing-key@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/signing-key@npm:5.6.0" @@ -2398,7 +2592,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.6.0, @ethersproject/signing-key@npm:^5.7.0": +"@ethersproject/signing-key@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/signing-key@npm:5.7.0" dependencies: @@ -2412,6 +2606,20 @@ __metadata: languageName: node linkType: hard +"@ethersproject/signing-key@npm:5.8.0, @ethersproject/signing-key@npm:^5.6.0, @ethersproject/signing-key@npm:^5.7.0, @ethersproject/signing-key@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/signing-key@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + bn.js: "npm:^5.2.1" + elliptic: "npm:6.6.1" + hash.js: "npm:1.1.7" + checksum: a7ff6cd344b0609737a496b6d5b902cf5528ed5a7ce2c0db5e7b69dc491d1810d1d0cd51dddf9dc74dd562ab4961d76e982f1750359b834c53c202e85e4c8502 + languageName: node + linkType: hard + "@ethersproject/solidity@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/solidity@npm:5.6.0" @@ -2426,7 +2634,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.0.0, @ethersproject/solidity@npm:^5.7.0": +"@ethersproject/solidity@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/solidity@npm:5.7.0" dependencies: @@ -2440,6 +2648,20 @@ __metadata: languageName: node linkType: hard +"@ethersproject/solidity@npm:5.8.0, @ethersproject/solidity@npm:^5.0.0, @ethersproject/solidity@npm:^5.7.0": + version: 5.8.0 + resolution: "@ethersproject/solidity@npm:5.8.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/keccak256": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/sha2": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + checksum: 5b5e0531bcec1d919cfbd261694694c8999ca5c379c1bb276ec779b896d299bb5db8ed7aa5652eb2c7605fe66455832b56ef123dec07f6ddef44231a7aa6fe6c + languageName: node + linkType: hard + "@ethersproject/strings@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/strings@npm:5.6.0" @@ -2451,7 +2673,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:>=5.0.0-beta.130, @ethersproject/strings@npm:^5.6.0, @ethersproject/strings@npm:^5.7.0": +"@ethersproject/strings@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/strings@npm:5.7.0" dependencies: @@ -2462,6 +2684,17 @@ __metadata: languageName: node linkType: hard +"@ethersproject/strings@npm:5.8.0, @ethersproject/strings@npm:>=5.0.0-beta.130, @ethersproject/strings@npm:^5.6.0, @ethersproject/strings@npm:^5.7.0, @ethersproject/strings@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/strings@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/constants": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + checksum: 6db39503c4be130110612b6d593a381c62657e41eebf4f553247ebe394fda32cdf74ff645daee7b7860d209fd02c7e909a95b1f39a2f001c662669b9dfe81d00 + languageName: node + linkType: hard + "@ethersproject/transactions@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/transactions@npm:5.6.0" @@ -2479,7 +2712,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.0.0, @ethersproject/transactions@npm:^5.0.0-beta.135, @ethersproject/transactions@npm:^5.6.0, @ethersproject/transactions@npm:^5.6.2, @ethersproject/transactions@npm:^5.7.0": +"@ethersproject/transactions@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/transactions@npm:5.7.0" dependencies: @@ -2496,6 +2729,23 @@ __metadata: languageName: node linkType: hard +"@ethersproject/transactions@npm:5.8.0, @ethersproject/transactions@npm:^5.0.0, @ethersproject/transactions@npm:^5.0.0-beta.135, @ethersproject/transactions@npm:^5.6.0, @ethersproject/transactions@npm:^5.6.2, @ethersproject/transactions@npm:^5.7.0, @ethersproject/transactions@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/transactions@npm:5.8.0" + dependencies: + "@ethersproject/address": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/constants": "npm:^5.8.0" + "@ethersproject/keccak256": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/rlp": "npm:^5.8.0" + "@ethersproject/signing-key": "npm:^5.8.0" + checksum: dd32f090df5945313aafa8430ce76834479750d6655cb786c3b65ec841c94596b14d3c8c59ee93eed7b4f32f27d321a9b8b43bc6bb51f7e1c6694f82639ffe68 + languageName: node + linkType: hard + "@ethersproject/units@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/units@npm:5.6.0" @@ -2518,6 +2768,17 @@ __metadata: languageName: node linkType: hard +"@ethersproject/units@npm:5.8.0": + version: 5.8.0 + resolution: "@ethersproject/units@npm:5.8.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/constants": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + checksum: 5f92b8379a58024078fce6a4cbf7323cfd79bc41ef8f0a7bbf8be9c816ce18783140ab0d5c8d34ed615639aef7fc3a2ed255e92809e3558a510c4f0d49e27309 + languageName: node + linkType: hard + "@ethersproject/wallet@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/wallet@npm:5.6.0" @@ -2541,7 +2802,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/wallet@npm:5.7.0, @ethersproject/wallet@npm:^5.0.0, @ethersproject/wallet@npm:^5.7.0": +"@ethersproject/wallet@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/wallet@npm:5.7.0" dependencies: @@ -2564,6 +2825,29 @@ __metadata: languageName: node linkType: hard +"@ethersproject/wallet@npm:5.8.0, @ethersproject/wallet@npm:^5.0.0, @ethersproject/wallet@npm:^5.7.0": + version: 5.8.0 + resolution: "@ethersproject/wallet@npm:5.8.0" + dependencies: + "@ethersproject/abstract-provider": "npm:^5.8.0" + "@ethersproject/abstract-signer": "npm:^5.8.0" + "@ethersproject/address": "npm:^5.8.0" + "@ethersproject/bignumber": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/hash": "npm:^5.8.0" + "@ethersproject/hdnode": "npm:^5.8.0" + "@ethersproject/json-wallets": "npm:^5.8.0" + "@ethersproject/keccak256": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/random": "npm:^5.8.0" + "@ethersproject/signing-key": "npm:^5.8.0" + "@ethersproject/transactions": "npm:^5.8.0" + "@ethersproject/wordlists": "npm:^5.8.0" + checksum: 6da450872dda3d9008bad3ccf8467816a63429241e51c66627647123c0fe5625494c4f6c306e098eb8419cc5702ac017d41f5161af5ff670a41fe5d199883c09 + languageName: node + linkType: hard + "@ethersproject/web@npm:5.6.0": version: 5.6.0 resolution: "@ethersproject/web@npm:5.6.0" @@ -2590,16 +2874,16 @@ __metadata: languageName: node linkType: hard -"@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.6.0, @ethersproject/web@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/web@npm:5.7.1" +"@ethersproject/web@npm:5.8.0, @ethersproject/web@npm:^5.6.0, @ethersproject/web@npm:^5.7.0, @ethersproject/web@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/web@npm:5.8.0" dependencies: - "@ethersproject/base64": "npm:^5.7.0" - "@ethersproject/bytes": "npm:^5.7.0" - "@ethersproject/logger": "npm:^5.7.0" - "@ethersproject/properties": "npm:^5.7.0" - "@ethersproject/strings": "npm:^5.7.0" - checksum: c82d6745c7f133980e8dab203955260e07da22fa544ccafdd0f21c79fae127bd6ef30957319e37b1cc80cddeb04d6bfb60f291bb14a97c9093d81ce50672f453 + "@ethersproject/base64": "npm:^5.8.0" + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + checksum: e3cd547225638db6e94fcd890001c778d77adb0d4f11a7f8c447e961041678f3fbfaffe77a962c7aa3f6597504232442e7015f2335b1788508a108708a30308a languageName: node linkType: hard @@ -2616,7 +2900,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.6.0, @ethersproject/wordlists@npm:^5.7.0": +"@ethersproject/wordlists@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/wordlists@npm:5.7.0" dependencies: @@ -2629,6 +2913,19 @@ __metadata: languageName: node linkType: hard +"@ethersproject/wordlists@npm:5.8.0, @ethersproject/wordlists@npm:^5.6.0, @ethersproject/wordlists@npm:^5.7.0, @ethersproject/wordlists@npm:^5.8.0": + version: 5.8.0 + resolution: "@ethersproject/wordlists@npm:5.8.0" + dependencies: + "@ethersproject/bytes": "npm:^5.8.0" + "@ethersproject/hash": "npm:^5.8.0" + "@ethersproject/logger": "npm:^5.8.0" + "@ethersproject/properties": "npm:^5.8.0" + "@ethersproject/strings": "npm:^5.8.0" + checksum: e230a2ba075006bc3a2538e096003e43ef9ba453317f37a4d99638720487ec447c1fa61a592c80483f8a8ad6466511cf4cf5c49cf84464a1679999171ce311f4 + languageName: node + linkType: hard + "@fastify/busboy@npm:^2.0.0": version: 2.1.1 resolution: "@fastify/busboy@npm:2.1.1" @@ -2766,13 +3063,13 @@ __metadata: linkType: hard "@graphprotocol/common-ts@npm:^2.0.7": - version: 2.0.9 - resolution: "@graphprotocol/common-ts@npm:2.0.9" + version: 2.0.11 + resolution: "@graphprotocol/common-ts@npm:2.0.11" dependencies: "@graphprotocol/contracts": "npm:5.3.3" "@graphprotocol/pino-sentry-simple": "npm:0.7.1" - "@urql/core": "npm:2.4.4" - "@urql/exchange-execute": "npm:1.2.2" + "@urql/core": "npm:3.1.0" + "@urql/exchange-execute": "npm:2.1.0" body-parser: "npm:1.20.2" bs58: "npm:5.0.0" cors: "npm:2.8.5" @@ -2790,7 +3087,7 @@ __metadata: pino-multi-stream: "npm:6.0.0" prom-client: "npm:14.2.0" sequelize: "npm:6.33.0" - checksum: b0009fbfcd0eb86f411627ef4cb974b1cee33922610f7636833e4b56cb9ca5652161115072e880b06e2ab500c34068d3d2f193395d0b16f69a5562d2b7585c74 + checksum: 28c50ec49354014eeb1d8a9d878f30fe6e0b88418ef79887d4dfd6e33241bbb1b1f5fb7f4827df918fe2b4af7a1fd5ec0fe5a70e1151fa6c11a1b1b9cf3a00cf languageName: node linkType: hard @@ -2845,8 +3142,8 @@ __metadata: "@typechain/ethers-v5": "npm:^7.0.0" "@typechain/hardhat": "npm:^2.0.0" "@types/bs58": "npm:^4.0.1" + "@types/chai": "npm:4.3.4" "@types/chai-as-promised": "npm:^7.1.5" - "@types/dotenv": "npm:^8.2.0" "@types/glob": "npm:^7.2.0" "@types/inquirer": "npm:^7.3.1" "@types/minimist": "npm:^1.2.1" @@ -2858,7 +3155,7 @@ __metadata: "@urql/core": "npm:^2.1.3" arbos-precompiles: "npm:^1.0.2" bignumber.js: "npm:^9.0.0" - chai: "npm:^4.3.4" + chai: "npm:4.3.4" chai-as-promised: "npm:^7.1.1" cli-table: "npm:^0.3.6" console-table-printer: "npm:^2.11.1" @@ -2908,6 +3205,7 @@ __metadata: "@nomiclabs/hardhat-waffle": "npm:^2.0.1" "@openzeppelin/contracts": "npm:^4.5.0" "@openzeppelin/hardhat-upgrades": "npm:^1.8.2" + "@tenderly/api-client": "npm:^1.0.13" "@tenderly/hardhat-tenderly": "npm:^1.0.13" "@typechain/ethers-v5": "npm:^9.0.0" "@typechain/hardhat": "npm:^4.0.0" @@ -3992,14 +4290,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" + "@humanwhocodes/object-schema": "npm:^2.0.3" debug: "npm:^4.3.1" minimatch: "npm:^3.0.5" - checksum: 66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 + checksum: 205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e languageName: node linkType: hard @@ -4010,7 +4308,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": +"@humanwhocodes/object-schema@npm:^2.0.3": version: 2.0.3 resolution: "@humanwhocodes/object-schema@npm:2.0.3" checksum: 80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c @@ -4031,14 +4329,23 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: "@jridgewell/set-array": "npm:^1.2.1" "@jridgewell/sourcemap-codec": "npm:^1.4.10" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + checksum: c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a languageName: node linkType: hard @@ -4057,9 +4364,9 @@ __metadata: linkType: hard "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 languageName: node linkType: hard @@ -4093,11 +4400,11 @@ __metadata: linkType: hard "@ljharb/through@npm:^2.3.9, @ljharb/through@npm:~2.3.9": - version: 2.3.13 - resolution: "@ljharb/through@npm:2.3.13" + version: 2.3.14 + resolution: "@ljharb/through@npm:2.3.14" dependencies: - call-bind: "npm:^1.0.7" - checksum: fb60b2fb2c674a674d8ebdb8972ccf52f8a62a9c1f5a2ac42557bc0273231c65d642aa2d7627cbb300766a25ae4642acd0f95fba2f8a1ff891086f0cb15807c3 + call-bind: "npm:^1.0.8" + checksum: 7c5c22ed668f51193b82e4a352c7a44f777f537ef47f37befb49032f4827a766ea74c2972e5a0185bdfe355431ae50722d9fb57fa63553ba36aa4aeb941f0e70 languageName: node linkType: hard @@ -4156,12 +4463,12 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.3.0, @noble/curves@npm:~1.3.0": - version: 1.3.0 - resolution: "@noble/curves@npm:1.3.0" +"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": + version: 1.4.2 + resolution: "@noble/curves@npm:1.4.2" dependencies: - "@noble/hashes": "npm:1.3.3" - checksum: 704bf8fda8e1365a9bb9e9945bd06645ef4ce85aa2fac5594abe09f19889197518152319481b89a271e0ee011787bd2ee87202441500bca7ca587a2c3ac10b01 + "@noble/hashes": "npm:1.4.0" + checksum: 65620c895b15d46e8087939db6657b46a1a15cd4e0e4de5cd84b97a0dfe0af85f33a431bb21ac88267e3dc508618245d4cb564213959d66a84d690fe18a63419 languageName: node linkType: hard @@ -4179,17 +4486,17 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.3, @noble/hashes@npm:~1.3.2": - version: 1.3.3 - resolution: "@noble/hashes@npm:1.3.3" - checksum: 23c020b33da4172c988e44100e33cd9f8f6250b68b43c467d3551f82070ebd9716e0d9d2347427aa3774c85934a35fa9ee6f026fca2117e3fa12db7bedae7668 +"@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 8c3f005ee72e7b8f9cff756dfae1241485187254e3f743873e22073d63906863df5d4f13d441b7530ea614b7a093f0d889309f28b59850f33b66cb26a779a4a5 languageName: node linkType: hard "@noble/hashes@npm:^1.4.0": - version: 1.4.0 - resolution: "@noble/hashes@npm:1.4.0" - checksum: 8c3f005ee72e7b8f9cff756dfae1241485187254e3f743873e22073d63906863df5d4f13d441b7530ea614b7a093f0d889309f28b59850f33b66cb26a779a4a5 + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 1b46539695fbfe4477c0822d90c881a04d4fa2921c08c552375b444a48cac9930cb1ee68de0a3c7859e676554d0f3771999716606dc4d8f826e414c11692cdd9 languageName: node linkType: hard @@ -4227,195 +4534,67 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/edr-darwin-arm64@npm:0.3.8": - version: 0.3.8 - resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.3.8" - checksum: 98298ddd1dd1d513245be57dc89aad51a0ff6da2f1227c32085a8d49c0d3cbc311981539037c3030b652e1008253d6e72081f019d44cf47c6aa8f14175505554 +"@nomicfoundation/edr-darwin-arm64@npm:0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.8.0" + checksum: f8bdede09ba5db53f0e55b9fde132c188e09c15faef473675465e0ead97ae0c5c562d820415bb1fe4a46cb29f28cfd2a5bf492229a2f64815f9d000b85e26f84 languageName: node linkType: hard -"@nomicfoundation/edr-darwin-arm64@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.6.5" - checksum: 1ed23f670f280834db7b0cc144d8287b3a572639917240beb6c743ff0f842fadf200eb3e226a13f0650d8a611f5092ace093679090ceb726d97fb4c6023073e6 +"@nomicfoundation/edr-darwin-x64@npm:0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr-darwin-x64@npm:0.8.0" + checksum: 2601d21267d18421f5ded3ca673064bd7ee680fa3340ecfb868ed4b21566eb61f6eed1cc684e3c5df4ade9ec2bc218df19c7e50b8882c17ab2f27fede241881c languageName: node linkType: hard -"@nomicfoundation/edr-darwin-arm64@npm:0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.7.0" - checksum: 7a643fe1c2a1e907699e0b2469672f9d88510c399bd6ef893e480b601189da6daf654e73537bb811f160a397a28ce1b4fe0e36ba763919ac7ee0922a62d09d51 +"@nomicfoundation/edr-linux-arm64-gnu@npm:0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.8.0" + checksum: 8e20e330d2b812a47ee9634eeab494b2730dee9f4cc663dea543fd905d7fcedae4b9ac60cd62a0f8f13311e43d97d8201872177a997cd7e01bf41b8ebcac355a languageName: node linkType: hard -"@nomicfoundation/edr-darwin-x64@npm:0.3.8": - version: 0.3.8 - resolution: "@nomicfoundation/edr-darwin-x64@npm:0.3.8" - checksum: a09fb0030b5dc7e202e7d42aae9f52af86090999a50cbfd9a4b3197b9c7fc8c7325c01d67fdd88b7037a8831e0e89ecf131155edf2c98c453c28f37c6da346f4 +"@nomicfoundation/edr-linux-arm64-musl@npm:0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.8.0" + checksum: 3065ef7e47e8518fa052fd6f263cd314b0b077248beb79734d35e8896a071313ddf8111a081275fca6d9be3d4c9d709dd643e2aa6b870ba52b85c0dbb255898c languageName: node linkType: hard -"@nomicfoundation/edr-darwin-x64@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-darwin-x64@npm:0.6.5" - checksum: 298810fe1ed61568beeb4e4a8ddfb4d3e3cf49d51f89578d5edb5817a7d131069c371d07ea000b246daa2fd57fa4853ab983e3a2e2afc9f27005156e5abfa500 - languageName: node - linkType: hard - -"@nomicfoundation/edr-darwin-x64@npm:0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr-darwin-x64@npm:0.7.0" - checksum: c33a0320fc4f4e27ef6718a678cfc6ff9fe5b03d3fc604cb503a7291e5f9999da1b4e45ebeff77e24031c4dd53e6defecb3a0d475c9f51d60ea6f48e78f74d8e - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-gnu@npm:0.3.8": - version: 0.3.8 - resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.3.8" - checksum: 20766169cb3425202a45812f01f9e49560f7cedfb797ea548759136fb8078d6179c11557b69fab8514e7f21a3f3f856dec0ba7a1584d5b431ac1440142f2012e - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-gnu@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.6.5" - checksum: 695850a75dda9ad00899ca2bd150c72c6b7a2470c352348540791e55459dc6f87ff88b3b647efe07dfe24d4b6aa9d9039724a9761ffc7a557e3e75a784c302a1 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-gnu@npm:0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.7.0" - checksum: 8347524cecca3a41ecb6e05581f386ccc6d7e831d4080eca5723724c4307c30ee787a944c70028360cb280a7f61d4967c152ff7b319ccfe08eadf1583a15d018 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-musl@npm:0.3.8": - version: 0.3.8 - resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.3.8" - checksum: dabd1ee8fc5f45382e8d58770138ba0cd6536915aa5f99459404d27dec046c76e427a0971ed705da83a6aa65e9272ac84b86b14313bd83ea4fea2c81c2d3f1e5 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-musl@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.6.5" - checksum: 9a6e01a545491b12673334628b6e1601c7856cb3973451ba1a4c29cf279e9a4874b5e5082fc67d899af7930b6576565e2c7e3dbe67824bfe454bf9ce87435c56 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-musl@npm:0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.7.0" - checksum: ace6d7691058250341dc0d0a2915c2020cc563ab70627f816e06abca7f0181e93941e5099d4a7ca0e6f8f225caff8be2c6563ad7ab8eeaf9124cb2cc53b9d9ac - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-gnu@npm:0.3.8": - version: 0.3.8 - resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.3.8" - checksum: 060aaa197a8401b0142d07042e72159703c6e61ef866e98548c00ff2512deb75d179536d63a89ce6cd0866269d22b2823459be730c2766c95b73645f7d4d1afc - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-gnu@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.6.5" - checksum: 959b62520cc9375284fcc1ae2ad67c5711d387912216e0b0ab7a3d087ef03967e2c8c8bd2e87697a3b1369fc6a96ec60399e3d71317a8be0cb8864d456a30e36 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-gnu@npm:0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.7.0" - checksum: 11a0eb76a628772ec28fe000b3014e83081f216b0f89568eb42f46c1d3d6ee10015d897857f372087e95651aeeea5cf525c161070f2068bd5e4cf3ccdd4b0201 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-musl@npm:0.3.8": - version: 0.3.8 - resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.3.8" - checksum: 49a7cb73b833a694744e2f5323d7268009eb1961e01ceb91f9137cf843e54571636b89418f204222d5f40b9122dd1c0e058b6efd368a438bc3bdb50205ea70d9 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-musl@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.6.5" - checksum: d91153a8366005e6a6124893a1da377568157709a147e6c9a18fe6dacae21d3847f02d2e9e89794dc6cb8dbdcd7ee7e49e6c9d3dc74c8dc80cea44e4810752da - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-musl@npm:0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.7.0" - checksum: 5559718b3ec00b9f6c9a6cfa6c60540b8f277728482db46183aa907d60f169bc7c8908551b5790c8bad2b0d618ade5ede15b94bdd209660cf1ce707b1fe99fd6 - languageName: node - linkType: hard - -"@nomicfoundation/edr-win32-x64-msvc@npm:0.3.8": - version: 0.3.8 - resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.3.8" - checksum: b7dfea0f01fd034ff6b48c44f75836f4dda84975f49c3655c97e76f2535945ed532756e7f2c22fa31035c4a29ce26d9546051f993ce553a8c4d570298525f55c - languageName: node - linkType: hard - -"@nomicfoundation/edr-win32-x64-msvc@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.6.5" - checksum: 96c2f68393b517f9b45cb4e777eb594a969abc3fea10bf11756cd050a7e8cefbe27808bd44d8e8a16dc9c425133a110a2ad186e1e6d29b49f234811db52a1edb - languageName: node - linkType: hard - -"@nomicfoundation/edr-win32-x64-msvc@npm:0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.7.0" - checksum: 19c10fa99245397556bf70971cc7d68544dc4a63ec7cc087fd09b2541729ec57d03166592837394b0fad903fbb20b1428ec67eed29926227155aa5630a249306 +"@nomicfoundation/edr-linux-x64-gnu@npm:0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.8.0" + checksum: eedbf9b751264dccdcd9817d8b592facf32c6fc7036b8c0736fce8dffba86c32eddde5f3354aa7692224f2e9d1f9b6a594ad16d428887517b8325e4d0982c0ed languageName: node linkType: hard -"@nomicfoundation/edr@npm:^0.3.7": - version: 0.3.8 - resolution: "@nomicfoundation/edr@npm:0.3.8" - dependencies: - "@nomicfoundation/edr-darwin-arm64": "npm:0.3.8" - "@nomicfoundation/edr-darwin-x64": "npm:0.3.8" - "@nomicfoundation/edr-linux-arm64-gnu": "npm:0.3.8" - "@nomicfoundation/edr-linux-arm64-musl": "npm:0.3.8" - "@nomicfoundation/edr-linux-x64-gnu": "npm:0.3.8" - "@nomicfoundation/edr-linux-x64-musl": "npm:0.3.8" - "@nomicfoundation/edr-win32-x64-msvc": "npm:0.3.8" - checksum: 56f4debf1d736783f498624fc2d647b075a56baedc6daf593a3e9627c99724e3fbf665245daa321a6f1db74694c11c2d70585d84fd13ecc90bf5632f503e1f04 +"@nomicfoundation/edr-linux-x64-musl@npm:0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.8.0" + checksum: 748e674b95e4b5ef354ea86f712520a3a81d58ff69c03467051a3f3e8c4ba3e830e5581af54be8c4d0c3790565a15c04b9a1efe1a2179d9f9416a5e093f3fbc9 languageName: node linkType: hard -"@nomicfoundation/edr@npm:^0.6.4": - version: 0.6.5 - resolution: "@nomicfoundation/edr@npm:0.6.5" - dependencies: - "@nomicfoundation/edr-darwin-arm64": "npm:0.6.5" - "@nomicfoundation/edr-darwin-x64": "npm:0.6.5" - "@nomicfoundation/edr-linux-arm64-gnu": "npm:0.6.5" - "@nomicfoundation/edr-linux-arm64-musl": "npm:0.6.5" - "@nomicfoundation/edr-linux-x64-gnu": "npm:0.6.5" - "@nomicfoundation/edr-linux-x64-musl": "npm:0.6.5" - "@nomicfoundation/edr-win32-x64-msvc": "npm:0.6.5" - checksum: 4344efbc7173119bd69dd37c5e60a232ab8307153e9cc329014df95a60f160026042afdd4dc34188f29fc8e8c926f0a3abdf90fb69bed92be031a206da3a6df5 +"@nomicfoundation/edr-win32-x64-msvc@npm:0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.8.0" + checksum: 0cecbe7093b4f4f4215db4944191a6199105da30edc87427d0eede70b2139b77748664cd3a94d0c87b7658532b8bd5e0b37f3e0f7bc0e894650b16d82b289125 languageName: node linkType: hard -"@nomicfoundation/edr@npm:^0.7.0": - version: 0.7.0 - resolution: "@nomicfoundation/edr@npm:0.7.0" +"@nomicfoundation/edr@npm:^0.8.0": + version: 0.8.0 + resolution: "@nomicfoundation/edr@npm:0.8.0" dependencies: - "@nomicfoundation/edr-darwin-arm64": "npm:0.7.0" - "@nomicfoundation/edr-darwin-x64": "npm:0.7.0" - "@nomicfoundation/edr-linux-arm64-gnu": "npm:0.7.0" - "@nomicfoundation/edr-linux-arm64-musl": "npm:0.7.0" - "@nomicfoundation/edr-linux-x64-gnu": "npm:0.7.0" - "@nomicfoundation/edr-linux-x64-musl": "npm:0.7.0" - "@nomicfoundation/edr-win32-x64-msvc": "npm:0.7.0" - checksum: 7dc0ae7533a9b57bfdee5275e08d160ff01cba1496cc7341a2782706b40f43e5c448ea0790b47dd1cf2712fa08295f271329109ed2313d9c7ff074ca3ae303e0 + "@nomicfoundation/edr-darwin-arm64": "npm:0.8.0" + "@nomicfoundation/edr-darwin-x64": "npm:0.8.0" + "@nomicfoundation/edr-linux-arm64-gnu": "npm:0.8.0" + "@nomicfoundation/edr-linux-arm64-musl": "npm:0.8.0" + "@nomicfoundation/edr-linux-x64-gnu": "npm:0.8.0" + "@nomicfoundation/edr-linux-x64-musl": "npm:0.8.0" + "@nomicfoundation/edr-win32-x64-msvc": "npm:0.8.0" + checksum: da24b58d30b8438739124087e8c13d44e516e1526bfce46d10ea12a25dd527d458f1818f2aa3fcbb75ffc3bdd93e9bba7eb12a77f876002a347a6eb20cd871fa languageName: node linkType: hard @@ -4784,8 +4963,8 @@ __metadata: linkType: hard "@nomicfoundation/hardhat-chai-matchers@npm:^2.0.0": - version: 2.0.6 - resolution: "@nomicfoundation/hardhat-chai-matchers@npm:2.0.6" + version: 2.0.8 + resolution: "@nomicfoundation/hardhat-chai-matchers@npm:2.0.8" dependencies: "@types/chai-as-promised": "npm:^7.1.3" chai-as-promised: "npm:^7.1.1" @@ -4796,7 +4975,7 @@ __metadata: chai: ^4.2.0 ethers: ^6.1.0 hardhat: ^2.9.4 - checksum: 0d65a0b0a552391ee3b20db9ffc9559138c02bc9c9cdd30106c9b5247d5a9e9b412480772faecab210a8cade0dfcddce3b04f5d3f3371e80085d6883a917dfe5 + checksum: 51e3ee9ff17319180a5f45108514b33437c004b724c591dc6d7d2e9842e24e2d793aaf94ce5316117475021e67c88228283d20c9f45fb0693dd8f6b61674b4ff languageName: node linkType: hard @@ -4814,35 +4993,35 @@ __metadata: linkType: hard "@nomicfoundation/hardhat-foundry@npm:^1.1.1": - version: 1.1.2 - resolution: "@nomicfoundation/hardhat-foundry@npm:1.1.2" + version: 1.1.3 + resolution: "@nomicfoundation/hardhat-foundry@npm:1.1.3" dependencies: - chalk: "npm:^2.4.2" + picocolors: "npm:^1.1.0" peerDependencies: hardhat: ^2.17.2 - checksum: 54cad1a0d1fc3c2137722a1b213dcbd18f77e63778bda9593052e6090868b2fb7bf8087c10404c6b181fa631e75f7e70490b5b97c3e4eba8f52ef449131dada0 + checksum: adf436eb0ab6f0eb5aad645cfbd1aa9dbb4641de24048b3399a810fed84f699179b4a2c406276ec6e35996300a4a335b8115a667a4e7c4841a67f30401c98e7f languageName: node linkType: hard "@nomicfoundation/hardhat-ignition-ethers@npm:^0.15.9": - version: 0.15.9 - resolution: "@nomicfoundation/hardhat-ignition-ethers@npm:0.15.9" + version: 0.15.10 + resolution: "@nomicfoundation/hardhat-ignition-ethers@npm:0.15.10" peerDependencies: "@nomicfoundation/hardhat-ethers": ^3.0.4 - "@nomicfoundation/hardhat-ignition": ^0.15.9 - "@nomicfoundation/ignition-core": ^0.15.9 + "@nomicfoundation/hardhat-ignition": ^0.15.10 + "@nomicfoundation/ignition-core": ^0.15.10 ethers: ^6.7.0 hardhat: ^2.18.0 - checksum: 3e5ebe4b0eeea2ddefeaac3ef8db474399cf9688547ef8e39780cb7af3bbb4fb2db9e73ec665f071bb7203cb667e7a9587c86b94c8bdd6346630a263c57b3056 + checksum: bce58dbd0dec9eeb3bf58007febe73cdb5c58424094c029c5aae6e5c3885e919e1ce8b31f97a8ac366c76461c2dca2c5dff1e9c661c58465fc27db4d72903bef languageName: node linkType: hard "@nomicfoundation/hardhat-ignition@npm:^0.15.9": - version: 0.15.9 - resolution: "@nomicfoundation/hardhat-ignition@npm:0.15.9" + version: 0.15.10 + resolution: "@nomicfoundation/hardhat-ignition@npm:0.15.10" dependencies: - "@nomicfoundation/ignition-core": "npm:^0.15.9" - "@nomicfoundation/ignition-ui": "npm:^0.15.9" + "@nomicfoundation/ignition-core": "npm:^0.15.10" + "@nomicfoundation/ignition-ui": "npm:^0.15.10" chalk: "npm:^4.0.0" debug: "npm:^4.3.2" fs-extra: "npm:^10.0.0" @@ -4851,18 +5030,18 @@ __metadata: peerDependencies: "@nomicfoundation/hardhat-verify": ^2.0.1 hardhat: ^2.18.0 - checksum: b8d6b3f92a0183d6d3bb7b3f9919860ba001dc8d0995d74ad1a324110b93d4dfbdbfb685e8a4a3bec6da5870750325d63ebe014653a7248366adac02ff142841 + checksum: 574faad7a6d96e15f68b7b52aee19144718d698ec8e17ecec8b416745ef97307e544f7c33f45d829f67980060c672f2f8628293ae95f7873aa325193544598f9 languageName: node linkType: hard "@nomicfoundation/hardhat-network-helpers@npm:^1.0.0, @nomicfoundation/hardhat-network-helpers@npm:^1.0.9": - version: 1.0.10 - resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.10" + version: 1.0.12 + resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.12" dependencies: ethereumjs-util: "npm:^7.1.4" peerDependencies: hardhat: ^2.9.5 - checksum: ff41875b2ece46ae33d144d83e8f43fbef18c7387d069a939cdbce1581cae83f415ca3477799e26dabe5e8faea7aadee4c4b4a90460f06b5b5e5aa02f9a2e4dd + checksum: 93df80bb824fb9146c354f71637d6deee4b7ba19527eee94b4f79064ccbb8e4e45e14d8e558f6e5c2be17d64429faaef07ac8fe12ef11395c549f7b5fc540722 languageName: node linkType: hard @@ -4891,28 +5070,9 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-verify@npm:^2.0.10": - version: 2.0.10 - resolution: "@nomicfoundation/hardhat-verify@npm:2.0.10" - dependencies: - "@ethersproject/abi": "npm:^5.1.2" - "@ethersproject/address": "npm:^5.0.2" - cbor: "npm:^8.1.0" - chalk: "npm:^2.4.2" - debug: "npm:^4.1.1" - lodash.clonedeep: "npm:^4.5.0" - semver: "npm:^6.3.0" - table: "npm:^6.8.0" - undici: "npm:^5.14.0" - peerDependencies: - hardhat: ^2.0.4 - checksum: c5b8e214f2dcdda0530dbb338f65e01bbb6e6b0f96930a88c01b1d1cf2def3f470e0bdb362807bb9a7dbe8216f937b55d14ab251d3cccd2208d6b60cebf2c358 - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-verify@npm:^2.0.12": - version: 2.0.12 - resolution: "@nomicfoundation/hardhat-verify@npm:2.0.12" +"@nomicfoundation/hardhat-verify@npm:^2.0.10, @nomicfoundation/hardhat-verify@npm:^2.0.12": + version: 2.0.13 + resolution: "@nomicfoundation/hardhat-verify@npm:2.0.13" dependencies: "@ethersproject/abi": "npm:^5.1.2" "@ethersproject/address": "npm:^5.0.2" @@ -4925,13 +5085,13 @@ __metadata: undici: "npm:^5.14.0" peerDependencies: hardhat: ^2.0.4 - checksum: 551f11346480175362023807b4cebbdacc5627db70e2b4fb0afa04d8ec2c26c3b05d2e74821503e881ba745ec6e2c3a678af74206364099ec14e584a811b2564 + checksum: 391b35211646ed9efd91b88229c09c8baaa688caaf4388e077b73230b36cd7f86b04639625b0e8ebdc070166f49494c3bd32834c31ca4800db0936ca6db96ee2 languageName: node linkType: hard -"@nomicfoundation/ignition-core@npm:^0.15.9": - version: 0.15.9 - resolution: "@nomicfoundation/ignition-core@npm:0.15.9" +"@nomicfoundation/ignition-core@npm:^0.15.10, @nomicfoundation/ignition-core@npm:^0.15.9": + version: 0.15.10 + resolution: "@nomicfoundation/ignition-core@npm:0.15.10" dependencies: "@ethersproject/address": "npm:5.6.1" "@nomicfoundation/solidity-analyzer": "npm:^0.1.1" @@ -4942,21 +5102,23 @@ __metadata: immer: "npm:10.0.2" lodash: "npm:4.17.21" ndjson: "npm:2.0.0" - checksum: fe02e3f4a981ef338e3acf75cf2e05535c2aba21f4c5b5831b1430fcaa7bbb42b16bd8ac4bb0b9f036d0b9eb1aede5fa57890f0c3863c4ae173d45ac3e484ed8 + checksum: d36d6bac290ed6a8bc223d2ad57f7a722b580782e10f56c3cababeca2f890b48183e10a69154ce2ea14b9e0050c9a38e2bc992a70d43c737763a1df2b0954de6 languageName: node linkType: hard -"@nomicfoundation/ignition-ui@npm:^0.15.9": - version: 0.15.9 - resolution: "@nomicfoundation/ignition-ui@npm:0.15.9" - checksum: 88097576c4186bfdf365f4864463386e7a345be1f8c0b8eebe589267e782735f8cec55e1c5af6c0f0872ba111d79616422552dc7e26c643d01b1768a2b0fb129 +"@nomicfoundation/ignition-ui@npm:^0.15.10": + version: 0.15.10 + resolution: "@nomicfoundation/ignition-ui@npm:0.15.10" + checksum: f72b03a8a737432e06b0c1bcd4e38409292305a55f8f496ccf5618e7512a81e7758f211f91d0d55e2e8a45bc553b3a4a4e5b6f2f316f28526593e79645836bb7 languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1" - conditions: os=darwin & cpu=arm64 +"@nomicfoundation/slang@npm:^0.18.3": + version: 0.18.3 + resolution: "@nomicfoundation/slang@npm:0.18.3" + dependencies: + "@bytecodealliance/preview2-shim": "npm:0.17.0" + checksum: 68036dd38f953451c4b5825600cd44f46931608a9905811fb1d977fac00be5f16b1a39f2f2a0c65f4bbd064d81c05f44f5cd79e626798035815511de89c3b6d0 languageName: node linkType: hard @@ -4967,13 +5129,6 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.2": version: 0.1.2 resolution: "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.2" @@ -4981,20 +5136,6 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.2": version: 0.1.2 resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.2" @@ -5002,13 +5143,6 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.2": version: 0.1.2 resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.2" @@ -5016,13 +5150,6 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.2": version: 0.1.2 resolution: "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.2" @@ -5030,13 +5157,6 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.2": version: 0.1.2 resolution: "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.2" @@ -5044,27 +5164,6 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.2": version: 0.1.2 resolution: "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.2" @@ -5072,46 +5171,7 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer@npm:^0.1.0": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.1" - dependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-darwin-x64": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-freebsd-x64": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "npm:0.1.1" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "npm:0.1.1" - dependenciesMeta: - "@nomicfoundation/solidity-analyzer-darwin-arm64": - optional: true - "@nomicfoundation/solidity-analyzer-darwin-x64": - optional: true - "@nomicfoundation/solidity-analyzer-freebsd-x64": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": - optional: true - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": - optional: true - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": - optional: true - checksum: 1feee48a9506125d7736e3d1200d997cd07777f52ee6c71f7fad7d50b6705f7d3e028894968b449ca6e950991e726e9464ee5dc0c52d1066d127632be29667b4 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer@npm:^0.1.1": +"@nomicfoundation/solidity-analyzer@npm:^0.1.0, @nomicfoundation/solidity-analyzer@npm:^0.1.1": version: 0.1.2 resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.2" dependencies: @@ -5151,7 +5211,7 @@ __metadata: languageName: node linkType: hard -"@nomiclabs/hardhat-etherscan@npm:^3.1.2, @nomiclabs/hardhat-etherscan@npm:^3.1.7": +"@nomiclabs/hardhat-etherscan@npm:^3.1.0, @nomiclabs/hardhat-etherscan@npm:^3.1.2, @nomiclabs/hardhat-etherscan@npm:^3.1.7": version: 3.1.8 resolution: "@nomiclabs/hardhat-etherscan@npm:3.1.8" dependencies: @@ -5212,6 +5272,19 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": version: 3.1.1 resolution: "@npmcli/fs@npm:3.1.1" @@ -5221,6 +5294,22 @@ __metadata: languageName: node linkType: hard +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@npmcli/redact@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/redact@npm:2.0.1" + checksum: 5f346f7ef224b44c90009939f93c446a865a3d9e5a7ebe0246cdb0ebd03219de3962ee6c6e9197298d8c6127ea33535e8c44814276e4941394dc1cdf1f30f6bc + languageName: node + linkType: hard + "@openzeppelin/contracts-upgradeable@npm:3.4.2": version: 3.4.2 resolution: "@openzeppelin/contracts-upgradeable@npm:3.4.2" @@ -5229,11 +5318,11 @@ __metadata: linkType: hard "@openzeppelin/contracts-upgradeable@npm:^5.0.2": - version: 5.0.2 - resolution: "@openzeppelin/contracts-upgradeable@npm:5.0.2" + version: 5.1.0 + resolution: "@openzeppelin/contracts-upgradeable@npm:5.1.0" peerDependencies: - "@openzeppelin/contracts": 5.0.2 - checksum: 0bd47a4fa0ba8084c1df9573968ff02387bc21514d846b5feb4ad42f90f3ba26bb1e40f17f03e4fa24ffbe473b9ea06c137283297884ab7d5b98d2c112904dc9 + "@openzeppelin/contracts": 5.1.0 + checksum: 8c91e7242b73647330458f2280aeaddd3ffb6708ced1e2ebc4af115b44aac86e04fe65d27b623efa90c74abb629a3c977151893b585f9d201470692462b6ad9b languageName: node linkType: hard @@ -5252,35 +5341,35 @@ __metadata: linkType: hard "@openzeppelin/contracts@npm:^5.0.2": - version: 5.0.2 - resolution: "@openzeppelin/contracts@npm:5.0.2" - checksum: d042661db7bb2f3a4b9ef30bba332e86ac20907d171f2ebfccdc9255cc69b62786fead8d6904b8148a8f26946bc7c15eead91b95f75db0c193a99d52e528663e + version: 5.2.0 + resolution: "@openzeppelin/contracts@npm:5.2.0" + checksum: 6e2d8c6daaeb8e111d49a82c30997a6c5d4e512338b55500db7fd4340f29c1cbf35f9dcfa0dbc672e417bc84e99f5441a105cb585cd4680ad70cbcf9a24094fc languageName: node linkType: hard "@openzeppelin/defender-admin-client@npm:^1.46.0": - version: 1.54.4 - resolution: "@openzeppelin/defender-admin-client@npm:1.54.4" + version: 1.54.6 + resolution: "@openzeppelin/defender-admin-client@npm:1.54.6" dependencies: - "@openzeppelin/defender-base-client": "npm:1.54.4" + "@openzeppelin/defender-base-client": "npm:1.54.6" axios: "npm:^1.4.0" ethers: "npm:^5.7.2" lodash: "npm:^4.17.19" node-fetch: "npm:^2.6.0" - checksum: a44439ebde420aa35b36db7c2845978dd099e0fb6edc394e7b65be67ec1135e99ccc8059e78cb70c8a8fd5598ba40d082648664af95f9cb97a7673c075f64abb + checksum: 784d7d0eee87916546654f8265f0823401b18f34f0c168daa5c3c353000b5a8e595edc26a384a5f4052dedf2602947e58620442c6f1f46760bfb99a77a5ae69d languageName: node linkType: hard -"@openzeppelin/defender-base-client@npm:1.54.4, @openzeppelin/defender-base-client@npm:^1.46.0": - version: 1.54.4 - resolution: "@openzeppelin/defender-base-client@npm:1.54.4" +"@openzeppelin/defender-base-client@npm:1.54.6, @openzeppelin/defender-base-client@npm:^1.46.0": + version: 1.54.6 + resolution: "@openzeppelin/defender-base-client@npm:1.54.6" dependencies: amazon-cognito-identity-js: "npm:^6.0.1" async-retry: "npm:^1.3.3" axios: "npm:^1.4.0" lodash: "npm:^4.17.19" node-fetch: "npm:^2.6.0" - checksum: 636614a8012cfbbe065b8ccc3ef6a16635e2f1b48f7421242de81f74def99a51795464e9a2bd02e7305ff32b339a8847d7733452e6fe7810d4badd0c2086c38f + checksum: adeac961ae8e06e620ff6ff227090180613fbad233bbed962ae1d1769f1a936cdba24b952a1c10fec69bf9695a7faf7572fe86fd174198b86e26706391784bef languageName: node linkType: hard @@ -5296,7 +5385,7 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/hardhat-upgrades@npm:^1.20.0, @openzeppelin/hardhat-upgrades@npm:^1.22.1, @openzeppelin/hardhat-upgrades@npm:^1.6.0, @openzeppelin/hardhat-upgrades@npm:^1.8.2": +"@openzeppelin/hardhat-upgrades@npm:^1.0.0, @openzeppelin/hardhat-upgrades@npm:^1.20.0, @openzeppelin/hardhat-upgrades@npm:^1.22.1, @openzeppelin/hardhat-upgrades@npm:^1.6.0, @openzeppelin/hardhat-upgrades@npm:^1.8.2": version: 1.28.0 resolution: "@openzeppelin/hardhat-upgrades@npm:1.28.0" dependencies: @@ -5333,32 +5422,34 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/upgrades-core@npm:^1.27.0": - version: 1.33.1 - resolution: "@openzeppelin/upgrades-core@npm:1.33.1" +"@openzeppelin/upgrades-core@npm:^1.27.0, @openzeppelin/upgrades-core@npm:^1.32.2": + version: 1.42.2 + resolution: "@openzeppelin/upgrades-core@npm:1.42.2" dependencies: - cbor: "npm:^9.0.0" + "@nomicfoundation/slang": "npm:^0.18.3" + cbor: "npm:^10.0.0" chalk: "npm:^4.1.0" compare-versions: "npm:^6.0.0" debug: "npm:^4.1.1" ethereumjs-util: "npm:^7.0.3" + minimatch: "npm:^9.0.5" minimist: "npm:^1.2.7" proper-lockfile: "npm:^4.1.1" solidity-ast: "npm:^0.4.51" bin: openzeppelin-upgrades-core: dist/cli/cli.js - checksum: 96fbed78baec7502709a38f5a00180750c24e96aa047a438b34c0d9895dc4ffed47b7e4fedab57cabfd733a3c079e78c98eec23a6df61f3fb4c8b2c9d096bcba + checksum: 048cc6ab9dd6880dfb5e62281fbd29dd575a056a9703bfa981a2d8135f40476d99332fbb4e1fe0d57f07d1f1b148b5c57237ff552839f7934de67e36329deb8e languageName: node linkType: hard -"@peculiar/asn1-schema@npm:^2.3.8": - version: 2.3.8 - resolution: "@peculiar/asn1-schema@npm:2.3.8" +"@peculiar/asn1-schema@npm:^2.3.13, @peculiar/asn1-schema@npm:^2.3.8": + version: 2.3.15 + resolution: "@peculiar/asn1-schema@npm:2.3.15" dependencies: asn1js: "npm:^3.0.5" - pvtsutils: "npm:^1.3.5" - tslib: "npm:^2.6.2" - checksum: 65f16b2a7eb91365b6dac47730ffcad4617ef04b821e0a4286c379ac7283588b0a6744032ee686e0914a0886c2a055108ed945b9c4d22821a3b123640b61f3b2 + pvtsutils: "npm:^1.3.6" + tslib: "npm:^2.8.1" + checksum: 0e73e292a17d00a8770825a9504ceaf0994481a39126317ca0ca5d3dc742087f2b71a4d086bb5613bf19ac57f001d42f594683797d43137702db3ee2b42736a0 languageName: node linkType: hard @@ -5372,15 +5463,15 @@ __metadata: linkType: hard "@peculiar/webcrypto@npm:^1.4.0": - version: 1.4.6 - resolution: "@peculiar/webcrypto@npm:1.4.6" + version: 1.5.0 + resolution: "@peculiar/webcrypto@npm:1.5.0" dependencies: "@peculiar/asn1-schema": "npm:^2.3.8" "@peculiar/json-schema": "npm:^1.1.12" pvtsutils: "npm:^1.3.5" tslib: "npm:^2.6.2" - webcrypto-core: "npm:^1.7.9" - checksum: b9c80b1a0a3e3ebbf045bd5167fe99ec4a83b170e9aa15a5952a9138afc278210d772306dcc57101d9407c3f9c70dbf6bfb4d8b3f20996ad35c650bb0fe6a90c + webcrypto-core: "npm:^1.8.0" + checksum: 4f6f24b2c52c2155b9c569b6eb1d57954cb5f7bd2764a50cdaed7aea17a6dcf304b75b87b57ba318756ffec8179a07d9a76534aaf77855912b838543e5ff8983 languageName: node linkType: hard @@ -5391,10 +5482,10 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.1.0": - version: 0.1.1 - resolution: "@pkgr/core@npm:0.1.1" - checksum: 3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 +"@pkgr/core@npm:^0.2.0": + version: 0.2.0 + resolution: "@pkgr/core@npm:0.2.0" + checksum: 29cb9c15f4788096b8b8b786b19c75b6398b6afe814a97189922c3046d8acb5d24f1217fd2537c3f8e42c04e48d572295e7ee56d77964ddc932c44eb5a615931 languageName: node linkType: hard @@ -5415,13 +5506,13 @@ __metadata: linkType: hard "@pnpm/npm-conf@npm:^2.1.0": - version: 2.2.2 - resolution: "@pnpm/npm-conf@npm:2.2.2" + version: 2.3.1 + resolution: "@pnpm/npm-conf@npm:2.3.1" dependencies: "@pnpm/config.env-replace": "npm:^1.1.0" "@pnpm/network.ca-file": "npm:^1.0.1" config-chain: "npm:^1.1.11" - checksum: 71393dcfce85603fddd8484b486767163000afab03918303253ae97992615b91d25942f83751366cb40ad2ee32b0ae0a033561de9d878199a024286ff98b0296 + checksum: 778a3a34ff7d6000a2594d2a9821f873f737bc56367865718b2cf0ba5d366e49689efe7975148316d7afd8e6f1dcef7d736fbb6ea7ef55caadd1dc93a36bb302 languageName: node linkType: hard @@ -5535,10 +5626,10 @@ __metadata: languageName: node linkType: hard -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.4": - version: 1.1.6 - resolution: "@scure/base@npm:1.1.6" - checksum: 237a46a1f45391fc57719154f14295db936a0b1562ea3e182dd42d7aca082dbb7062a28d6c49af16a7e478b12dae8a0fe678d921ea5056bcc30238d29eb05c55 +"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.6": + version: 1.1.9 + resolution: "@scure/base@npm:1.1.9" + checksum: 77a06b9a2db8144d22d9bf198338893d77367c51b58c72b99df990c0a11f7cadd066d4102abb15e3ca6798d1529e3765f55c4355742465e49aed7a0c01fe76e8 languageName: node linkType: hard @@ -5553,14 +5644,14 @@ __metadata: languageName: node linkType: hard -"@scure/bip32@npm:1.3.3": - version: 1.3.3 - resolution: "@scure/bip32@npm:1.3.3" +"@scure/bip32@npm:1.4.0": + version: 1.4.0 + resolution: "@scure/bip32@npm:1.4.0" dependencies: - "@noble/curves": "npm:~1.3.0" - "@noble/hashes": "npm:~1.3.2" - "@scure/base": "npm:~1.1.4" - checksum: 48fa04ebf0e3b56e3d086f029ae207ea753d8d8a1b3564f3c80fafea63dc3ee4edbd21e44eadb79bd4de4afffb075cbbbcb258fd5030a9680065cb524424eb83 + "@noble/curves": "npm:~1.4.0" + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 6849690d49a3bf1d0ffde9452eb16ab83478c1bc0da7b914f873e2930cd5acf972ee81320e3df1963eb247cf57e76d2d975b5f97093d37c0e3f7326581bf41bd languageName: node linkType: hard @@ -5574,13 +5665,13 @@ __metadata: languageName: node linkType: hard -"@scure/bip39@npm:1.2.2": - version: 1.2.2 - resolution: "@scure/bip39@npm:1.2.2" +"@scure/bip39@npm:1.3.0": + version: 1.3.0 + resolution: "@scure/bip39@npm:1.3.0" dependencies: - "@noble/hashes": "npm:~1.3.2" - "@scure/base": "npm:~1.1.4" - checksum: be38bc1dc10b9a763d8b02d91dc651a4f565c822486df6cb1d3cc84896c1aab3ef6acbf7b3dc7e4a981bc9366086a4d72020aa21e11a692734a750de049c887c + "@noble/hashes": "npm:~1.4.0" + "@scure/base": "npm:~1.1.6" + checksum: 1ae1545a7384a4d9e33e12d9e9f8824f29b0279eb175b0f0657c0a782c217920054f9a1d28eb316a417dfc6c4e0b700d6fbdc6da160670107426d52fcbe017a8 languageName: node linkType: hard @@ -5687,12 +5778,12 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/types@npm:3.0.0" +"@smithy/types@npm:^4.1.0": + version: 4.2.0 + resolution: "@smithy/types@npm:4.2.0" dependencies: tslib: "npm:^2.6.2" - checksum: 9f6eefa4f715a8f0bfd79787f82156b4785baaa1524496abe9fc3db96c36f7c782fb962353601d8bd2bba3b449d999d48a09b2b25405bfcd7fb5e1d1c935f1fb + checksum: a8bd92c7e548bcbe7be211152de041ec164cfcc857d7574a87b1667c38827e5616563c13bd38a1d44b88bbfa3ee8f591dc597d4e2d50f3bc74e320ea82d7c49e languageName: node linkType: hard @@ -5714,13 +5805,6 @@ __metadata: languageName: node linkType: hard -"@solidity-parser/parser@npm:^0.17.0": - version: 0.17.0 - resolution: "@solidity-parser/parser@npm:0.17.0" - checksum: de606abd2f603b8056828c772de3f26b0d92913d0e8ebe4f2c149485f548e1b7af308c54c569542b3fc8e03d3219a9fb0a318f56b92b3042074c8074c1da53f2 - languageName: node - linkType: hard - "@solidity-parser/parser@npm:^0.18.0": version: 0.18.0 resolution: "@solidity-parser/parser@npm:0.18.0" @@ -5728,6 +5812,13 @@ __metadata: languageName: node linkType: hard +"@solidity-parser/parser@npm:^0.19.0": + version: 0.19.0 + resolution: "@solidity-parser/parser@npm:0.19.0" + checksum: 2f4c885bb32ca95ea41120f0d972437b4191d26aa63ea62b7904d075e1b90f4290996407ef84a46a20f66e4268f41fb07fc0edc7142afc443511e8c74b37c6e9 + languageName: node + linkType: hard + "@stylistic/eslint-plugin-js@npm:1.8.1, @stylistic/eslint-plugin-js@npm:^1.8.1": version: 1.8.1 resolution: "@stylistic/eslint-plugin-js@npm:1.8.1" @@ -5824,6 +5915,50 @@ __metadata: languageName: node linkType: hard +"@tenderly/api-client@npm:^1.0.13, @tenderly/api-client@npm:^1.1.0": + version: 1.1.0 + resolution: "@tenderly/api-client@npm:1.1.0" + dependencies: + axios: "npm:^0.27.2" + cli-table3: "npm:^0.6.2" + commander: "npm:^9.4.0" + dotenv: "npm:^16.4.5" + js-yaml: "npm:^4.1.0" + open: "npm:^8.4.0" + prompts: "npm:^2.4.2" + tslog: "npm:^4.4.0" + peerDependencies: + ts-node: "*" + typescript: "*" + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + checksum: ec6b1e6d890d7c38071a9e379a70ca839f4e8fef485d0e00b30cf4f36979e4263db6f05e391fdec14483f9cbccd199c8e3320c35c13cd1f974ca451eafc34038 + languageName: node + linkType: hard + +"@tenderly/hardhat-integration@npm:^1.1.0": + version: 1.1.1 + resolution: "@tenderly/hardhat-integration@npm:1.1.1" + dependencies: + "@tenderly/api-client": "npm:^1.1.0" + axios: "npm:^1.6.7" + dotenv: "npm:^16.4.5" + fs-extra: "npm:^10.1.0" + hardhat-deploy: "npm:^0.11.43" + npm-registry-fetch: "npm:^17.1.0" + semver: "npm:^7.6.3" + ts-node: "npm:^10.9.1" + tslog: "npm:^4.3.1" + typescript: "npm:^5.5.4" + peerDependencies: + hardhat: ^2.22.6 + checksum: f8a526fbf63ef9d0caf238c3ea0efab05382dd89cb0915a7206f060c7591528b8053a387d702b02e10e5bc934f567fa497efeeb3878a39c5b525a21693475ee1 + languageName: node + linkType: hard + "@tenderly/hardhat-tenderly@npm:1.0.13": version: 1.0.13 resolution: "@tenderly/hardhat-tenderly@npm:1.0.13" @@ -5838,21 +5973,18 @@ __metadata: linkType: hard "@tenderly/hardhat-tenderly@npm:^1.0.13": - version: 1.8.0 - resolution: "@tenderly/hardhat-tenderly@npm:1.8.0" + version: 1.11.0 + resolution: "@tenderly/hardhat-tenderly@npm:1.11.0" dependencies: "@ethersproject/bignumber": "npm:^5.7.0" "@nomiclabs/hardhat-ethers": "npm:^2.1.1" - axios: "npm:^0.27.2" - ethers: "npm:^5.7.0" - fs-extra: "npm:^10.1.0" - hardhat-deploy: "npm:^0.11.14" - js-yaml: "npm:^4.1.0" - tenderly: "npm:^0.6.0" - tslog: "npm:^4.3.1" - peerDependencies: - hardhat: ^2.10.2 - checksum: e5d7441fddc6dc69963cd4e46d61758c67922fab2a2848a88738e4dff2a8e5c274f746f316206205eda14edbfc2cf058f3e6e05e66400d1b8cd3bc56964d8034 + "@nomiclabs/hardhat-etherscan": "npm:^3.1.0" + "@openzeppelin/hardhat-upgrades": "npm:^1.0.0" + "@openzeppelin/upgrades-core": "npm:^1.32.2" + "@tenderly/hardhat-integration": "npm:^1.1.0" + dotenv: "npm:^16.4.5" + ethers: "npm:^5.7.2" + checksum: 13ac37fb23e09cb0d4f4488ffc8a5245443c829fa2a2ac0975ee8dc85b671d4649a9bcccb974c09d3c3cbd422635926a8db25adf21eb894f0bd4f575162b6185 languageName: node linkType: hard @@ -6024,11 +6156,11 @@ __metadata: linkType: hard "@types/bn.js@npm:*, @types/bn.js@npm:^5.1.0, @types/bn.js@npm:^5.1.1": - version: 5.1.5 - resolution: "@types/bn.js@npm:5.1.5" + version: 5.1.6 + resolution: "@types/bn.js@npm:5.1.6" dependencies: "@types/node": "npm:*" - checksum: e9f375b43d8119ed82aed2090f83d4cda8afbb63ba13223afb02fa7550258ff90acd76d65cd7186838644048f085241cd98a3a512d8d187aa497c6039c746ac8 + checksum: 073d383d87afea513a8183ce34af7bc0a7a798d057c7ae651982b7f30dd7d93f33247323bca3ba39f1f6af146b564aff547b15467bdf9fc922796c17e8426bf6 languageName: node linkType: hard @@ -6072,14 +6204,23 @@ __metadata: languageName: node linkType: hard -"@types/chai@npm:*, @types/chai@npm:^4.2.0, @types/chai@npm:^4.3.9": - version: 4.3.16 - resolution: "@types/chai@npm:4.3.16" - checksum: 745d4a9be429d5d86a7ab26064610b8957fe12dd80e94dc7d0707cf3db1c889e3ffe0d73d69bb15e6d376bf4462a7a75e9d8fc1051750b5d656d6cfe459829b7 +"@types/chai@npm:*": + version: 5.2.1 + resolution: "@types/chai@npm:5.2.1" + dependencies: + "@types/deep-eql": "npm:*" + checksum: f8a03c9f8450b7ab8df11f658c4194be17a6316b870490d5ffaf5289a3c0c0591ed6291b2d6551e181887c3eed89d0490744b3e569d9b23cf611b05f93e775b6 + languageName: node + linkType: hard + +"@types/chai@npm:4.3.4": + version: 4.3.4 + resolution: "@types/chai@npm:4.3.4" + checksum: 6e1b44629831f845b760d2f8b44c751c2cab1397c2a810730e6b1786ff0af83dfbc489b9403a3eb772f0573f8ed96e533e7500af20cafe41ef79c695fea9d9ed languageName: node linkType: hard -"@types/chai@npm:^4.0.0": +"@types/chai@npm:^4.0.0, @types/chai@npm:^4.2.0, @types/chai@npm:^4.3.9": version: 4.3.20 resolution: "@types/chai@npm:4.3.20" checksum: 4601189d611752e65018f1ecadac82e94eed29f348e1d5430e5681a60b01e1ecf855d9bcc74ae43b07394751f184f6970fac2b5561fc57a1f36e93a0f5ffb6e8 @@ -6104,22 +6245,30 @@ __metadata: languageName: node linkType: hard -"@types/dotenv@npm:^8.2.0": - version: 8.2.0 - resolution: "@types/dotenv@npm:8.2.0" +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" dependencies: - dotenv: "npm:*" - checksum: cd010440ea750acf2359fb9ed0a1681b00ce29d9c40b602fe33e51642bd44ce30ced54b23fadc05385daa415fe9f671273911bcf95381a5aaf09690b3db96938 + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e languageName: node linkType: hard -"@types/eslint@npm:*, @types/eslint@npm:^8.56.10": - version: 8.56.10 - resolution: "@types/eslint@npm:8.56.10" +"@types/eslint@npm:^8.56.10": + version: 8.56.12 + resolution: "@types/eslint@npm:8.56.12" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: 674349d6c342c3864d70f4d5a9965f96fb253801532752c8c500ad6a1c2e8b219e01ccff5dc8791dcb58b5483012c495708bb9f3ff929f5c9322b3da126c15d3 + checksum: e4ca426abe9d55f82b69a3250bec78b6d340ad1e567f91c97ecc59d3b2d6a1d8494955ac62ad0ea14b97519db580611c02be8277cbea370bdfb0f96aa2910504 languageName: node linkType: hard @@ -6133,9 +6282,9 @@ __metadata: linkType: hard "@types/estree@npm:*": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c languageName: node linkType: hard @@ -6209,9 +6358,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.200": - version: 4.17.4 - resolution: "@types/lodash@npm:4.17.4" - checksum: 0124c64cb9fe7a0f78b6777955abd05ef0d97844d49118652eae45f8fa57bfb7f5a7a9bccc0b5a84c0a6dc09631042e4590cb665acb9d58dfd5e6543c75341ec + version: 4.17.16 + resolution: "@types/lodash@npm:4.17.16" + checksum: cf017901b8ab1d7aabc86d5189d9288f4f99f19a75caf020c0e2c77b8d4cead4db0d0b842d009b029339f92399f49f34377dd7c2721053388f251778b4c23534 languageName: node linkType: hard @@ -6245,14 +6394,7 @@ __metadata: languageName: node linkType: hard -"@types/mocha@npm:>=9.1.0, @types/mocha@npm:^10.0.3": - version: 10.0.6 - resolution: "@types/mocha@npm:10.0.6" - checksum: 4526c9e88388f9e1004c6d3937c5488a39908810f26b927173c58d52b43057f3895627dc06538e96706e08b88158885f869ec6311f6b58fd72bdef715f26d6c3 - languageName: node - linkType: hard - -"@types/mocha@npm:^10.0.9": +"@types/mocha@npm:>=9.1.0, @types/mocha@npm:^10.0.3, @types/mocha@npm:^10.0.9": version: 10.0.10 resolution: "@types/mocha@npm:10.0.10" checksum: d2b8c48138cde6923493e42b38e839695eb42edd04629abe480a8f34c0e3f50dd82a55832c2e8d2b6e6f9e4deb492d7d733e600fbbdd5a0ceccbcfc6844ff9d5 @@ -6274,35 +6416,28 @@ __metadata: linkType: hard "@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: ac80bd90012116ceb2d188fde62d96830ca847823e8ca71255616bc73991aa7d9f057b8bfab79e8ee44ffefb031ddd1bcce63ea82f9e66f7c31ec02d2d823ccc + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225 languageName: node linkType: hard "@types/node-fetch@npm:^2.5.5": - version: 2.6.11 - resolution: "@types/node-fetch@npm:2.6.11" + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" dependencies: "@types/node": "npm:*" form-data: "npm:^4.0.0" - checksum: 5283d4e0bcc37a5b6d8e629aee880a4ffcfb33e089f4b903b2981b19c623972d1e64af7c3f9540ab990f0f5c89b9b5dda19c5bcb37a8e177079e93683bfd2f49 + checksum: 7693acad5499b7df2d1727d46cff092a63896dc04645f36b973dd6dd754a59a7faba76fcb777bdaa35d80625c6a9dd7257cca9c401a4bab03b04480cda7fd1af languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12, @types/node@npm:>=16.0.0, @types/node@npm:^20.11.19, @types/node@npm:^20.4.2, @types/node@npm:^20.8.7, @types/node@npm:^20.9.0": - version: 20.12.12 - resolution: "@types/node@npm:20.12.12" +"@types/node@npm:*, @types/node@npm:>=12, @types/node@npm:>=16.0.0": + version: 22.13.13 + resolution: "@types/node@npm:22.13.13" dependencies: - undici-types: "npm:~5.26.4" - checksum: f374b763c744e8f16e4f38cf6e2c0eef31781ec9228c9e43a6f267880fea420fab0a238b59f10a7cb3444e49547c5e3785787e371fc242307310995b21988812 - languageName: node - linkType: hard - -"@types/node@npm:18.15.13": - version: 18.15.13 - resolution: "@types/node@npm:18.15.13" - checksum: 6e5f61c559e60670a7a8fb88e31226ecc18a21be103297ca4cf9848f0a99049dae77f04b7ae677205f2af494f3701b113ba8734f4b636b355477a6534dbb8ada + undici-types: "npm:~6.20.0" + checksum: daf792ba5dcff1316abf4b33680f94b792f8d54d6ae495efc8929531e0ba1284a248d29aab117d2259f9280284d986ad5799b193b0516e2b926d713aab835f7d languageName: node linkType: hard @@ -6336,6 +6471,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.11.19, @types/node@npm:^20.4.2, @types/node@npm:^20.8.7, @types/node@npm:^20.9.0": + version: 20.17.27 + resolution: "@types/node@npm:20.17.27" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 09f30c65e5f2a082eddf26a7ffa859bf2b77e1123829309823e7691227fd5a691b30cd3ac413d65829aa25c1eebd2f717bed80f2f8a7f83aaa6c2c3a047b3504 + languageName: node + linkType: hard + "@types/node@npm:^8.0.0": version: 8.10.66 resolution: "@types/node@npm:8.10.66" @@ -6374,9 +6518,9 @@ __metadata: linkType: hard "@types/qs@npm:^6.2.31, @types/qs@npm:^6.9.4, @types/qs@npm:^6.9.7": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 49c5ff75ca3adb18a1939310042d273c9fc55920861bd8e5100c8a923b3cda90d759e1a95e18334092da1c8f7b820084687770c83a1ccef04fb2c6908117c823 + version: 6.9.18 + resolution: "@types/qs@npm:6.9.18" + checksum: 790b9091348e06dde2c8e4118b5771ab386a8c22a952139a2eb0675360a2070d0b155663bf6f75b23f258fd0a1f7ffc0ba0f059d99a719332c03c40d9e9cd63b languageName: node linkType: hard @@ -6435,11 +6579,11 @@ __metadata: linkType: hard "@types/sinon@npm:*": - version: 17.0.3 - resolution: "@types/sinon@npm:17.0.3" + version: 17.0.4 + resolution: "@types/sinon@npm:17.0.4" dependencies: "@types/sinonjs__fake-timers": "npm:*" - checksum: 6fc3aa497fd87826375de3dbddc2bf01c281b517c32c05edf95b5ad906382dc221bca01ca9d44fc7d5cb4c768f996f268154e87633a45b3c0b5cddca7ef5e2be + checksum: 7c67ae1050d98a86d8dd771f0a764e97adb9d54812bf3b001195f8cfaa1e2bdfc725d5b970b91e7b0bb6b7c1ca209f47993f2c6f84f1f868313c37441313ca5b languageName: node linkType: hard @@ -6467,16 +6611,16 @@ __metadata: linkType: hard "@types/underscore@npm:*": - version: 1.11.15 - resolution: "@types/underscore@npm:1.11.15" - checksum: f1bbe78337a8b800b6cb96435c54c9428d00c64eabcb8ba690302cb76c4c068d69e663a048c6b05bc9154ba723b1bcb6bcf39f753f6a0eb8c477accde7bd6056 + version: 1.13.0 + resolution: "@types/underscore@npm:1.13.0" + checksum: 240d3f36f694e177b1896c464b1254249e64b51a2afc703a1dda61f0c544d6e3b081ac4d955fb057e873982a62a7ba78e3a0aaa252c9d766f6cbe5e85283bc04 languageName: node linkType: hard "@types/validator@npm:^13.7.1, @types/validator@npm:^13.7.17": - version: 13.11.10 - resolution: "@types/validator@npm:13.11.10" - checksum: fe63a20fa90d3e8c661d0ac5b5af162cdd387b9e8fd67f5a0a00ca308e4e2d7602467cc32ef3e2c979b737629fa9e2ff593d3946ee4f8667bbb80af0494b9c66 + version: 13.12.2 + resolution: "@types/validator@npm:13.12.2" + checksum: 64f1326c768947d756ab5bcd73f3f11a6f07dc76292aea83890d0390a9b9acb374f8df6b24af2c783271f276d3d613b78fc79491fe87edee62108d54be2e3c31 languageName: node linkType: hard @@ -6500,11 +6644,11 @@ __metadata: linkType: hard "@types/ws@npm:^8.0.0": - version: 8.5.10 - resolution: "@types/ws@npm:8.5.10" + version: 8.18.0 + resolution: "@types/ws@npm:8.18.0" dependencies: "@types/node": "npm:*" - checksum: e9af279b984c4a04ab53295a40aa95c3e9685f04888df5c6920860d1dd073fcc57c7bd33578a04b285b2c655a0b52258d34bee0a20569dca8defb8393e1e5d29 + checksum: a56d2e0d1da7411a1f3548ce02b51a50cbe9e23f025677d03df48f87e4a3c72e1342fbf1d12e487d7eafa8dc670c605152b61bbf9165891ec0e9694b0d3ea8d4 languageName: node linkType: hard @@ -6524,15 +6668,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.9.0" +"@typescript-eslint/eslint-plugin@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.9.0" - "@typescript-eslint/type-utils": "npm:7.9.0" - "@typescript-eslint/utils": "npm:7.9.0" - "@typescript-eslint/visitor-keys": "npm:7.9.0" + "@typescript-eslint/scope-manager": "npm:7.18.0" + "@typescript-eslint/type-utils": "npm:7.18.0" + "@typescript-eslint/utils": "npm:7.18.0" + "@typescript-eslint/visitor-keys": "npm:7.18.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -6543,7 +6687,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5c0ded9cb2210c141d236075f01a86447bf497a5061773c3c64a90756264776b4c4df100f7588e36d34f727eca55afd52fe6696a3cbe2d1f131250934254603a + checksum: 2b37948fa1b0dab77138909dabef242a4d49ab93e4019d4ef930626f0a7d96b03e696cd027fa0087881c20e73be7be77c942606b4a76fa599e6b37f6985304c3 languageName: node linkType: hard @@ -6572,21 +6716,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/parser@npm:7.9.0" +"@typescript-eslint/parser@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/parser@npm:7.18.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.9.0" - "@typescript-eslint/types": "npm:7.9.0" - "@typescript-eslint/typescript-estree": "npm:7.9.0" - "@typescript-eslint/visitor-keys": "npm:7.9.0" + "@typescript-eslint/scope-manager": "npm:7.18.0" + "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/typescript-estree": "npm:7.18.0" + "@typescript-eslint/visitor-keys": "npm:7.18.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 16ca04645429436d9b7986cddda979ef4d088f4223f4a69e04a369e0fd4852dd5ff3d4b99da2e43cddaa2b421b24ff42f275d87bd110ae2356bdd0e81c2534e7 + checksum: 370e73fca4278091bc1b657f85e7d74cd52b24257ea20c927a8e17546107ce04fbf313fec99aed0cc2a145ddbae1d3b12e9cc2c1320117636dc1281bcfd08059 languageName: node linkType: hard @@ -6618,13 +6762,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/scope-manager@npm:7.9.0" +"@typescript-eslint/scope-manager@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/scope-manager@npm:7.18.0" dependencies: - "@typescript-eslint/types": "npm:7.9.0" - "@typescript-eslint/visitor-keys": "npm:7.9.0" - checksum: 1ba6fc559a42a9b54e38c3ac2b6669efcff1a30292fb4e5fc8739c890a6c0f37d1a6aee1d115198f57c88e4f1776e95c1d7143de5cb5b970d5eb3023e97789dd + "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/visitor-keys": "npm:7.18.0" + checksum: 038cd58c2271de146b3a594afe2c99290034033326d57ff1f902976022c8b0138ffd3cb893ae439ae41003b5e4bcc00cabf6b244ce40e8668f9412cc96d97b8e languageName: node linkType: hard @@ -6645,12 +6789,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/type-utils@npm:7.9.0" +"@typescript-eslint/type-utils@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/type-utils@npm:7.18.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.9.0" - "@typescript-eslint/utils": "npm:7.9.0" + "@typescript-eslint/typescript-estree": "npm:7.18.0" + "@typescript-eslint/utils": "npm:7.18.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependencies: @@ -6658,7 +6802,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 775280fb179268f8bacd60e684d9d5a1c6a379646b082c7244bf2dfb7dd693053bd9efa473b71e10a86db69322b0a2cecf5598d019684930df50000bf3d70af0 + checksum: ad92a38007be620f3f7036f10e234abdc2fdc518787b5a7227e55fd12896dacf56e8b34578723fbf9bea8128df2510ba8eb6739439a3879eda9519476d5783fd languageName: node linkType: hard @@ -6669,10 +6813,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/types@npm:7.9.0" - checksum: d5f4a547dba4865ee2391bf06f2b3f8e8592a561976d2be35bb61ce340c7d1b7b4b25ac6ab5b9941813b465b9420bebb7b2179b1d71f6a83069feeb000b3558d +"@typescript-eslint/types@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/types@npm:7.18.0" + checksum: eb7371ac55ca77db8e59ba0310b41a74523f17e06f485a0ef819491bc3dd8909bb930120ff7d30aaf54e888167e0005aa1337011f3663dc90fb19203ce478054 languageName: node linkType: hard @@ -6695,12 +6839,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.9.0" +"@typescript-eslint/typescript-estree@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" dependencies: - "@typescript-eslint/types": "npm:7.9.0" - "@typescript-eslint/visitor-keys": "npm:7.9.0" + "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/visitor-keys": "npm:7.18.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -6710,7 +6854,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: cfc3d2b7a5433c9a2989c7289bc72b49786993782801ad8ca5a07c651df457a67fbce13b120c86c34c03d56570a90e5cf4f3b8806349f103a3658f2366ec28ea + checksum: 0c7f109a2e460ec8a1524339479cf78ff17814d23c83aa5112c77fb345e87b3642616291908dcddea1e671da63686403dfb712e4a4435104f92abdfddf9aba81 languageName: node linkType: hard @@ -6731,17 +6875,17 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/utils@npm:7.9.0" +"@typescript-eslint/utils@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/utils@npm:7.18.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.9.0" - "@typescript-eslint/types": "npm:7.9.0" - "@typescript-eslint/typescript-estree": "npm:7.9.0" + "@typescript-eslint/scope-manager": "npm:7.18.0" + "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/typescript-estree": "npm:7.18.0" peerDependencies: eslint: ^8.56.0 - checksum: cb99d6a950e7da0319bc7b923a82c52c0798a14e837afee51b2295cfbde02e0a2ac8e0b5904cd7bd01d1b376c7a6ad3739101b486feaf2517c8640024deb88c7 + checksum: a25a6d50eb45c514469a01ff01f215115a4725fb18401055a847ddf20d1b681409c4027f349033a95c4ff7138d28c3b0a70253dfe8262eb732df4b87c547bd1e languageName: node linkType: hard @@ -6755,20 +6899,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.9.0": - version: 7.9.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.9.0" +"@typescript-eslint/visitor-keys@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" dependencies: - "@typescript-eslint/types": "npm:7.9.0" + "@typescript-eslint/types": "npm:7.18.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 19181d8b9d2d7bc43d5c8884661cd9a86ac316392b8e590187cc507442093a1ba2bef0cc22181b8298d5dc9f455abb73cffa4663451bdf32b1b7fe12160c5c99 + checksum: 538b645f8ff1d9debf264865c69a317074eaff0255e63d7407046176b0f6a6beba34a6c51d511f12444bae12a98c69891eb6f403c9f54c6c2e2849d1c1cb73c0 languageName: node linkType: hard "@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a languageName: node linkType: hard @@ -6784,13 +6928,24 @@ __metadata: languageName: node linkType: hard -"@urql/core@npm:>=2.3.6": - version: 5.0.3 - resolution: "@urql/core@npm:5.0.3" +"@urql/core@npm:3.1.0": + version: 3.1.0 + resolution: "@urql/core@npm:3.1.0" + dependencies: + wonka: "npm:^6.1.2" + peerDependencies: + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: cd5419efcd51029837ff4a23ae4265258f3ad115962b172fbfaab7ad474789be35265a73198efeff3fb324b10d5416b136fed1c0ef3b26e0758750c0dcfc5cf3 + languageName: node + linkType: hard + +"@urql/core@npm:>=2.3.6, @urql/core@npm:>=3.1.0": + version: 5.1.1 + resolution: "@urql/core@npm:5.1.1" dependencies: "@0no-co/graphql.web": "npm:^1.0.5" wonka: "npm:^6.3.2" - checksum: 7ae9dfe4cbce949a0e2856f46e5c0f62a1bdb6eda6f24480468b62f886cc03131e77b578da4fbb9fe8c1622b7542fdd371b83e7883f01a296924b5dfbe738f10 + checksum: 2a66f58452bbf153c251dd6d127fc0bc0473b4cde47171ca360960059eb08fc019202aee16911168a800814a3b9748300bb88b87817b5d05cf92c16f5772447b languageName: node linkType: hard @@ -6818,6 +6973,18 @@ __metadata: languageName: node linkType: hard +"@urql/exchange-execute@npm:2.1.0": + version: 2.1.0 + resolution: "@urql/exchange-execute@npm:2.1.0" + dependencies: + "@urql/core": "npm:>=3.1.0" + wonka: "npm:^6.0.0" + peerDependencies: + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 2d5ec1a5648e7dd2016bac82ea6de2b58d09362abe9eb8f53b2a41db5f8bbfc07a55fd1a297009f4211a8320ae67d3eb7d69c00d856043d62250ffd34919f77a + languageName: node + linkType: hard + "@whatwg-node/cookie-store@npm:^0.0.1": version: 0.0.1 resolution: "@whatwg-node/cookie-store@npm:0.0.1" @@ -6918,23 +7085,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 - languageName: node - linkType: hard - -"abitype@npm:0.7.1": - version: 0.7.1 - resolution: "abitype@npm:0.7.1" - peerDependencies: - typescript: ">=4.9.4" - zod: ^3 >=3.19.1 - peerDependenciesMeta: - zod: - optional: true - checksum: c95386afc8438b29d09fcb6d7bc3a457958ab0a472483a363bdb9bf9f42e1b90ab5b05a16f04b653ad0bf79f4451233fe35fc6c7a04b66cb4eba9df7d8e49f12 +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 languageName: node linkType: hard @@ -6948,9 +7102,9 @@ __metadata: linkType: hard "abortcontroller-polyfill@npm:^1.7.3": - version: 1.7.5 - resolution: "abortcontroller-polyfill@npm:1.7.5" - checksum: d7a5ab6fda4f9a54f22ddeb233a2564d2f4f857ec17be25fee21a91bb5090bee57c630c454634b5c4b93fc06bd90d592d1f2fc69f77cd28791ac0fe361feb7d2 + version: 1.7.8 + resolution: "abortcontroller-polyfill@npm:1.7.8" + checksum: 604f01d78f1749e03b43fbdcbabd16466dee50404eb41920884187f993a1a6d96669424807f1ca1e1a4f3073261d7fd6c3f68452ad3c2d66be5c012d0f9e4eb3 languageName: node linkType: hard @@ -7025,18 +7179,20 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1": - version: 8.3.2 - resolution: "acorn-walk@npm:8.3.2" - checksum: 7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.9.0": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" +"acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" bin: acorn: bin/acorn - checksum: 3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + checksum: dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 languageName: node linkType: hard @@ -7084,12 +7240,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 languageName: node linkType: hard @@ -7142,27 +7296,27 @@ __metadata: linkType: hard "ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.11.0, ajv@npm:^8.12.0": - version: 8.13.0 - resolution: "ajv@npm:8.13.0" + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.4.1" - checksum: 14c6497b6f72843986d7344175a1aa0e2c35b1e7f7475e55bc582cddb765fca7e6bf950f465dc7846f817776d9541b706f4b5b3fbedd8dfdeb5fce6f22864264 + checksum: ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 languageName: node linkType: hard "amazon-cognito-identity-js@npm:^6.0.1": - version: 6.3.13 - resolution: "amazon-cognito-identity-js@npm:6.3.13" + version: 6.3.15 + resolution: "amazon-cognito-identity-js@npm:6.3.15" dependencies: "@aws-crypto/sha256-js": "npm:1.2.2" buffer: "npm:4.9.2" fast-base64-decode: "npm:^1.0.0" isomorphic-unfetch: "npm:^3.0.0" js-cookie: "npm:^2.2.1" - checksum: 274785ef26573969bcc12d8f36d1f529da7fd50068ee52c7e3213c61549ce319db7c477c8c11633fc7f6bfe114fd93071228720742c0b091bafe18e7c13536a8 + checksum: e42d30ce37c08cd1ee3e6632f30d9beac2db50f2633c2e777b22ff95185773545e4081c1981c92bc285212a61050c1d9d3b58e874bb8221f21714c5309439238 languageName: node linkType: hard @@ -7182,13 +7336,6 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:4.1.1": - version: 4.1.1 - resolution: "ansi-colors@npm:4.1.1" - checksum: 6086ade4336b4250b6b25e144b83e5623bcaf654d3df0c3546ce09c9c5ff999cb6a6f00c87e802d05cf98aef79d92dc76ade2670a2493b8dcb80220bec457838 - languageName: node - linkType: hard - "ansi-colors@npm:^4.1.0, ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" @@ -7205,10 +7352,12 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^6.2.0": - version: 6.2.1 - resolution: "ansi-escapes@npm:6.2.1" - checksum: a2c6f58b044be5f69662ee17073229b492daa2425a7fd99a665db6c22eab6e4ab42752807def7281c1c7acfed48f87f2362dda892f08c2c437f1b39c6b033103 +"ansi-escapes@npm:^7.0.0": + version: 7.0.0 + resolution: "ansi-escapes@npm:7.0.0" + dependencies: + environment: "npm:^1.0.0" + checksum: 86e51e36fabef18c9c004af0a280573e828900641cea35134a124d2715e0c5a473494ab4ce396614505da77638ae290ff72dd8002d9747d2ee53f5d6bbe336be languageName: node linkType: hard @@ -7241,9 +7390,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc languageName: node linkType: hard @@ -7280,9 +7429,9 @@ __metadata: linkType: hard "antlr4@npm:^4.11.0, antlr4@npm:^4.13.1-patch-1": - version: 4.13.1 - resolution: "antlr4@npm:4.13.1" - checksum: f92191677cf277e9c65806bcc40e0d844838203047e3d50cb2628cdda3052500dad0827f9308fc46283935786b0e6bc2986beb47cdd9b1ac88b5258d1b311294 + version: 4.13.2 + resolution: "antlr4@npm:4.13.2" + checksum: dfe7dcb24fe99ce103e1eac3ce30558a3df713cf5deeacd7e30686f5cca8206864e49b254af3bd5eff5904d31e5cd7902a7468c13dcb619da10caf3f703d03b4 languageName: node linkType: hard @@ -7418,13 +7567,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.4" - checksum: f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d languageName: node linkType: hard @@ -7470,60 +7619,34 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlast@npm:^1.2.2": - version: 1.2.5 - resolution: "array.prototype.findlast@npm:1.2.5" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-shim-unscopables: "npm:^1.0.2" - checksum: ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775 - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.2.3": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - es-shim-unscopables: "npm:^1.0.0" - checksum: a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b - languageName: node - linkType: hard - "array.prototype.reduce@npm:^1.0.6": - version: 1.0.7 - resolution: "array.prototype.reduce@npm:1.0.7" + version: 1.0.8 + resolution: "array.prototype.reduce@npm:1.0.8" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" + es-abstract: "npm:^1.23.9" es-array-method-boxes-properly: "npm:^1.0.0" es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - is-string: "npm:^1.0.7" - checksum: 97aac907d7b15088d5b991bad79de96f95ea0d47a701a034e2dc816e0aabaed2fb401d7fe65ab6fda05eafa58319aa2d1bac404f515e162b81b3b61a51224db2 + es-object-atoms: "npm:^1.1.1" + is-string: "npm:^1.1.1" + checksum: 0a4635f468e9161f51c4a87f80057b8b3c27b0ccc3e40ad7ea77cd1e147f1119f46977b0452f3fa325f543126200f2caf8c1390bd5303edf90d9c1dcd7d5a8a0 languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" dependencies: array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.3" - es-errors: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.3" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" is-array-buffer: "npm:^3.0.4" - is-shared-array-buffer: "npm:^1.0.2" - checksum: d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 + checksum: 2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 languageName: node linkType: hard @@ -7561,7 +7684,7 @@ __metadata: languageName: node linkType: hard -"asn1js@npm:^3.0.1, asn1js@npm:^3.0.5": +"asn1js@npm:^3.0.5": version: 3.0.5 resolution: "asn1js@npm:3.0.5" dependencies: @@ -7623,6 +7746,13 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -7674,9 +7804,9 @@ __metadata: linkType: hard "async@npm:^3.2.3": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 languageName: node linkType: hard @@ -7734,9 +7864,9 @@ __metadata: linkType: hard "aws4@npm:^1.8.0": - version: 1.12.0 - resolution: "aws4@npm:1.12.0" - checksum: 1e39c266f53b04daf88e112de93a6006375b386a1b7ab6197260886e39abd012aa90bdd87949c3bf9c30754846031f6d5d8ac4f8676628097c11065b5d39847a + version: 1.13.2 + resolution: "aws4@npm:1.13.2" + checksum: c993d0d186d699f685d73113733695d648ec7d4b301aba2e2a559d0cd9c1c902308cc52f4095e1396b23fddbc35113644e7f0a6a32753636306e41e3ed6f1e79 languageName: node linkType: hard @@ -7759,25 +7889,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.4.0, axios@npm:^1.5.1": - version: 1.7.1 - resolution: "axios@npm:1.7.1" +"axios@npm:^1.4.0, axios@npm:^1.5.1, axios@npm:^1.6.7": + version: 1.8.4 + resolution: "axios@npm:1.8.4" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 554395472f18f4ddb43b4be2900473bc1a4d589464a8ab16f6954c53d9cace4317d5c9e009d5bb05f098d9565b2fa45f152a5d4cecb87536c8f0c370c25a7770 - languageName: node - linkType: hard - -"axios@npm:^1.6.8": - version: 1.8.1 - resolution: "axios@npm:1.8.1" - dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: b2e1d5a61264502deee4b50f0a6df0aa3b174c546ccf68c0dff714a2b8863232e0bd8cb5b84f853303e97f242a98260f9bb9beabeafe451ad5af538e9eb7ac22 + checksum: 450993c2ba975ffccaf0d480b68839a3b2435a5469a71fa2fb0b8a55cdb2c2ae47e609360b9c1e2b2534b73dfd69e2733a1cf9f8215bee0bcd729b72f801b0ce languageName: node linkType: hard @@ -8478,18 +8597,18 @@ __metadata: linkType: hard "base-x@npm:^3.0.2, base-x@npm:^3.0.6, base-x@npm:^3.0.8": - version: 3.0.9 - resolution: "base-x@npm:3.0.9" + version: 3.0.11 + resolution: "base-x@npm:3.0.11" dependencies: safe-buffer: "npm:^5.0.1" - checksum: e6bbeae30b24f748b546005affb710c5fbc8b11a83f6cd0ca999bd1ab7ad3a22e42888addc40cd145adc4edfe62fcfab4ebc91da22e4259aae441f95a77aee1a + checksum: 4c5b8cd9cef285973b0460934be4fc890eedfd22a8aca527fac3527f041c5d1c912f7b9a6816f19e43e69dc7c29a5deabfa326bd3d6a57ee46af0ad46e3991d5 languageName: node linkType: hard "base-x@npm:^4.0.0": - version: 4.0.0 - resolution: "base-x@npm:4.0.0" - checksum: 0cb47c94535144ab138f70bb5aa7e6e03049ead88615316b62457f110fc204f2c3baff5c64a1c1b33aeb068d79a68092c08a765c7ccfa133eee1e70e4c6eb903 + version: 4.0.1 + resolution: "base-x@npm:4.0.1" + checksum: 26a5a24105b27d94f21fa0640d5345620d758ab5d9269cf11828c502094d4f2fc5e84f3bfee63e9af29e83e0d3c97129264f1ac9653620b9bdab3f81d6aca881 languageName: node linkType: hard @@ -8648,13 +8767,13 @@ __metadata: linkType: hard "bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.10.0, bn.js@npm:^4.11.0, bn.js@npm:^4.11.6, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9, bn.js@npm:^4.8.0": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 languageName: node linkType: hard -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.2, bn.js@npm:^5.1.3, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": +"bn.js@npm:^5.1.2, bn.js@npm:^5.1.3, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": version: 5.2.1 resolution: "bn.js@npm:5.2.1" checksum: bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa @@ -8717,7 +8836,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.2, body-parser@npm:^1.16.0": +"body-parser@npm:1.20.2": version: 1.20.2 resolution: "body-parser@npm:1.20.2" dependencies: @@ -8737,6 +8856,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.3, body-parser@npm:^1.16.0": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + "borc@npm:^2.1.2": version: 2.1.2 resolution: "borc@npm:2.1.2" @@ -8816,21 +8955,12 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: "npm:^7.0.1" - checksum: 321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 - languageName: node - linkType: hard - -"breakword@npm:^1.0.5": - version: 1.0.6 - resolution: "breakword@npm:1.0.6" +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - wcwidth: "npm:^1.0.1" - checksum: 8bb2e329ee911de098a59d955cb25fad0a16d4f810e3c5ceacfe43ce67cda9117e7e9eafc827234f5429cc0dcaa4d9387e3529cbdcdeb66d1b9e521e28c49bc1 + fill-range: "npm:^7.1.1" + checksum: 7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 languageName: node linkType: hard @@ -8867,7 +8997,7 @@ __metadata: languageName: node linkType: hard -"browser-stdout@npm:1.3.1, browser-stdout@npm:^1.3.1": +"browser-stdout@npm:^1.3.1": version: 1.3.1 resolution: "browser-stdout@npm:1.3.1" checksum: c40e482fd82be872b6ea7b9f7591beafbf6f5ba522fe3dade98ba1573a1c29a11101564993e4eb44e5488be8f44510af072df9a9637c739217eb155ceb639205 @@ -8912,12 +9042,13 @@ __metadata: linkType: hard "browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": - version: 4.1.0 - resolution: "browserify-rsa@npm:4.1.0" + version: 4.1.1 + resolution: "browserify-rsa@npm:4.1.1" dependencies: - bn.js: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - checksum: fb2b5a8279d8a567a28d8ee03fb62e448428a906bab5c3dc9e9c3253ace551b5ea271db15e566ac78f1b1d71b243559031446604168b9235c351a32cae99d02a + bn.js: "npm:^5.2.1" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: b650ee1192e3d7f3d779edc06dd96ed8720362e72ac310c367b9d7fe35f7e8dbb983c1829142b2b3215458be8bf17c38adc7224920843024ed8cf39e19c513c0 languageName: node linkType: hard @@ -8951,17 +9082,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" +"browserslist@npm:^4.24.0": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + checksum: db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 languageName: node linkType: hard @@ -9072,12 +9203,12 @@ __metadata: linkType: hard "bufferutil@npm:^4.0.1": - version: 4.0.8 - resolution: "bufferutil@npm:4.0.8" + version: 4.0.9 + resolution: "bufferutil@npm:4.0.9" dependencies: node-gyp: "npm:latest" node-gyp-build: "npm:^4.3.0" - checksum: 36cdc5b53a38d9f61f89fdbe62029a2ebcd020599862253fefebe31566155726df9ff961f41b8c97b02b4c12b391ef97faf94e2383392654cf8f0ed68f76e47c + checksum: f8a93279fc9bdcf32b42eba97edc672b39ca0fe5c55a8596099886cffc76ea9dd78e0f6f51ecee3b5ee06d2d564aa587036b5d4ea39b8b5ac797262a363cdf7d languageName: node linkType: hard @@ -9124,8 +9255,8 @@ __metadata: linkType: hard "cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" + version: 18.0.4 + resolution: "cacache@npm:18.0.4" dependencies: "@npmcli/fs": "npm:^3.1.0" fs-minipass: "npm:^3.0.0" @@ -9139,7 +9270,27 @@ __metadata: ssri: "npm:^10.0.0" tar: "npm:^6.1.11" unique-filename: "npm:^3.0.0" - checksum: dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7 + checksum: 6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c languageName: node linkType: hard @@ -9236,16 +9387,35 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7, call-bind@npm:~1.0.2": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: - es-define-property: "npm:^1.0.0" es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" + checksum: 47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8, call-bind@npm:~1.0.2": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + set-function-length: "npm:^1.2.2" + checksum: a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 languageName: node linkType: hard @@ -9305,10 +9475,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30000844, caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001620 - resolution: "caniuse-lite@npm:1.0.30001620" - checksum: 3783117143fbdc98c1b91a579d0f2a7bcee7008f322ba7a2bf56a6c3d105400772c7ed8026840b4ea909ec7bf254bcc36532f2ce1b1a1240b00d0335da39b7ec +"caniuse-lite@npm:^1.0.30000844, caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001707 + resolution: "caniuse-lite@npm:1.0.30001707" + checksum: a1beaf84bad4f6617bbc5616d6bc0c9cab73e73f7e9e09b6466af5195b1bc393e0f6f19643d7a1c88bd3f4bfa122d7bea81cf6225ec3ade57d5b1dd3478c1a1b languageName: node linkType: hard @@ -9344,6 +9514,15 @@ __metadata: languageName: node linkType: hard +"cbor@npm:^10.0.0": + version: 10.0.3 + resolution: "cbor@npm:10.0.3" + dependencies: + nofilter: "npm:^3.0.2" + checksum: d1657a24799ab35cb262aef91205431100def90c0200917e42eec4580726880c090d5a0a77620b665248447a36db8cc5ea6b7fd6eac8e083a64098c7179ea2d1 + languageName: node + linkType: hard + "cbor@npm:^8.1.0": version: 8.1.0 resolution: "cbor@npm:8.1.0" @@ -9373,24 +9552,23 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.0.0": - version: 4.5.0 - resolution: "chai@npm:4.5.0" +"chai@npm:4.3.4": + version: 4.3.4 + resolution: "chai@npm:4.3.4" dependencies: assertion-error: "npm:^1.1.0" - check-error: "npm:^1.0.3" - deep-eql: "npm:^4.1.3" - get-func-name: "npm:^2.0.2" - loupe: "npm:^2.3.6" + check-error: "npm:^1.0.2" + deep-eql: "npm:^3.0.1" + get-func-name: "npm:^2.0.0" pathval: "npm:^1.1.1" - type-detect: "npm:^4.1.0" - checksum: b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d + type-detect: "npm:^4.0.5" + checksum: e8be63a3ce412cc35f0209799c96b1f67397c4829489bd1604f9639f291b697f9a8c1ee129f5d502663332691950b278d2be7e8f19d753b86ea1876e99771a8e languageName: node linkType: hard -"chai@npm:^4.2.0, chai@npm:^4.3.10, chai@npm:^4.3.4": - version: 4.4.1 - resolution: "chai@npm:4.4.1" +"chai@npm:^4.0.0, chai@npm:^4.2.0, chai@npm:^4.3.10": + version: 4.5.0 + resolution: "chai@npm:4.5.0" dependencies: assertion-error: "npm:^1.1.0" check-error: "npm:^1.0.3" @@ -9398,15 +9576,8 @@ __metadata: get-func-name: "npm:^2.0.2" loupe: "npm:^2.3.6" pathval: "npm:^1.1.1" - type-detect: "npm:^4.0.8" - checksum: 91590a8fe18bd6235dece04ccb2d5b4ecec49984b50924499bdcd7a95c02cb1fd2a689407c19bb854497bde534ef57525cfad6c7fdd2507100fd802fbc2aefbd - languageName: node - linkType: hard - -"chalk@npm:5.3.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + type-detect: "npm:^4.1.0" + checksum: b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d languageName: node linkType: hard @@ -9423,7 +9594,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.1.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -9444,6 +9615,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.4.1": + version: 5.4.1 + resolution: "chalk@npm:5.4.1" + checksum: b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef + languageName: node + linkType: hard + "change-case-all@npm:1.0.14": version: 1.0.14 resolution: "change-case-all@npm:1.0.14" @@ -9524,30 +9702,11 @@ __metadata: linkType: hard "checkpoint-store@npm:^1.1.0": - version: 1.1.0 - resolution: "checkpoint-store@npm:1.1.0" - dependencies: - functional-red-black-tree: "npm:^1.0.1" - checksum: 257dea033983adbbfb50c54db0cb8045450aa00f260c95e75cad62574b467f5b1060b1e35d5d1c296c6923026827d8dc0e5cd450feddd74b15d8b6580075cd23 - languageName: node - linkType: hard - -"chokidar@npm:3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" + version: 1.1.0 + resolution: "checkpoint-store@npm:1.1.0" dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + functional-red-black-tree: "npm:^1.0.1" + checksum: 257dea033983adbbfb50c54db0cb8045450aa00f260c95e75cad62574b467f5b1060b1e35d5d1c296c6923026827d8dc0e5cd450feddd74b15d8b6580075cd23 languageName: node linkType: hard @@ -9591,11 +9750,11 @@ __metadata: linkType: hard "chokidar@npm:^4.0.0": - version: 4.0.1 - resolution: "chokidar@npm:4.0.1" + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" dependencies: readdirp: "npm:^4.0.1" - checksum: 4bb7a3adc304059810bb6c420c43261a15bb44f610d77c35547addc84faa0374265c3adc67f25d06f363d9a4571962b02679268c40de07676d260de1986efea9 + checksum: a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad languageName: node linkType: hard @@ -9613,6 +9772,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + "ci-info@npm:^2.0.0": version: 2.0.0 resolution: "ci-info@npm:2.0.0" @@ -9653,12 +9819,12 @@ __metadata: linkType: hard "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" + version: 1.0.6 + resolution: "cipher-base@npm:1.0.6" dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: d8d005f8b64d8a77b3d3ce531301ae7b45902c9cab4ec8b66bdbd2bf2a1d9fceb9a2133c293eb3c060b2d964da0f14c47fb740366081338aa3795dd1faa8984b + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + checksum: f73268e0ee6585800875d9748f2a2377ae7c2c3375cba346f75598ac6f6bc3a25dec56e984a168ced1a862529ffffe615363f750c40349039d96bd30fba0fca8 languageName: node linkType: hard @@ -9718,12 +9884,12 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-cursor@npm:4.0.0" +"cli-cursor@npm:^5.0.0": + version: 5.0.0 + resolution: "cli-cursor@npm:5.0.0" dependencies: - restore-cursor: "npm:^4.0.0" - checksum: e776e8c3c6727300d0539b0d25160b2bb56aed1a63942753ba1826b012f337a6f4b7ace3548402e4f2f13b5e16bfd751be672c44b203205e7eca8be94afec42c + restore-cursor: "npm:^5.0.0" + checksum: 7ec62f69b79f6734ab209a3e4dbdc8af7422d44d360a7cb1efa8a0887bbe466a6e625650c466fe4359aee44dbe2dc0b6994b583d40a05d0808a5cb193641d220 languageName: node linkType: hard @@ -10052,13 +10218,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:11.1.0, commander@npm:^11.1.0": - version: 11.1.0 - resolution: "commander@npm:11.1.0" - checksum: 13cc6ac875e48780250f723fb81c1c1178d35c5decb1abb1b628b3177af08a8554e76b2c0f29de72d69eef7c864d12613272a71fabef8047922bc622ab75a179 - languageName: node - linkType: hard - "commander@npm:2.11.0": version: 2.11.0 resolution: "commander@npm:2.11.0" @@ -10080,10 +10239,17 @@ __metadata: languageName: node linkType: hard -"commander@npm:^12.0.0": - version: 12.1.0 - resolution: "commander@npm:12.1.0" - checksum: 6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 +"commander@npm:^11.1.0": + version: 11.1.0 + resolution: "commander@npm:11.1.0" + checksum: 13cc6ac875e48780250f723fb81c1c1178d35c5decb1abb1b628b3177af08a8554e76b2c0f29de72d69eef7c864d12613272a71fabef8047922bc622ab75a179 + languageName: node + linkType: hard + +"commander@npm:^13.1.0": + version: 13.1.0 + resolution: "commander@npm:13.1.0" + checksum: 7b8c5544bba704fbe84b7cab2e043df8586d5c114a4c5b607f83ae5060708940ed0b5bd5838cf8ce27539cde265c1cbd59ce3c8c6b017ed3eec8943e3a415164 languageName: node linkType: hard @@ -10133,9 +10299,9 @@ __metadata: linkType: hard "compare-versions@npm:^6.0.0": - version: 6.1.0 - resolution: "compare-versions@npm:6.1.0" - checksum: 5378edc8a53ac98ed907da463e1d6c26f1ed2664006d6a0d54bbdf7f046a36c43e244740854fc0edfc1e09253b9a0b7c98d1282dfee9f6f1a87199599f611218 + version: 6.1.1 + resolution: "compare-versions@npm:6.1.1" + checksum: 415205c7627f9e4f358f571266422980c9fe2d99086be0c9a48008ef7c771f32b0fbe8e97a441ffedc3910872f917a0675fe0fe3c3b6d331cda6d8690be06338 languageName: node linkType: hard @@ -10183,11 +10349,11 @@ __metadata: linkType: hard "console-table-printer@npm:^2.11.1, console-table-printer@npm:^2.9.0": - version: 2.12.0 - resolution: "console-table-printer@npm:2.12.0" + version: 2.12.1 + resolution: "console-table-printer@npm:2.12.1" dependencies: simple-wcswidth: "npm:^1.0.1" - checksum: 122ac2c7be70b2554acb3be9f0b5c4224113307d30a28c20264eb65ae33ef5522986dd216422697297ee740f5ba293910d03dd969bdceee5a61aa0843fa6b201 + checksum: 8f28e9c0ae5df77f5d60da3da002ecd95ebe1812b0b9e0a6d2795c81b5121b39774f32506bccf68830a838ca4d8fbb2ab8824e729dba2c5e30cdeb9df4dd5f2b languageName: node linkType: hard @@ -10333,10 +10499,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde languageName: node linkType: hard @@ -10355,9 +10521,9 @@ __metadata: linkType: hard "core-js-pure@npm:^3.0.1": - version: 3.37.1 - resolution: "core-js-pure@npm:3.37.1" - checksum: 38200d08862b4ef2207af72a7525f7b9ac750f5e1d84ef27a3e314aefa69518179a9b732f51ebe35c3b38606d9fa4f686fcf6eff067615cc293a3b1c84041e74 + version: 3.41.0 + resolution: "core-js-pure@npm:3.41.0" + checksum: d5003e91f167dd5670174d27bf313407325d0915454f41337510b89ba420f1d0d1b22d3b1793eb329b28e9273e951fb895eb574ecfc1ccc77ed6ad14af1c763b languageName: node linkType: hard @@ -10407,15 +10573,15 @@ __metadata: linkType: hard "cosmiconfig-typescript-loader@npm:^5.0.0": - version: 5.0.0 - resolution: "cosmiconfig-typescript-loader@npm:5.0.0" + version: 5.1.0 + resolution: "cosmiconfig-typescript-loader@npm:5.1.0" dependencies: - jiti: "npm:^1.19.1" + jiti: "npm:^1.21.6" peerDependencies: "@types/node": "*" cosmiconfig: ">=8.2" typescript: ">=4" - checksum: 0eb1a767a589cf092e68729e184d5917ae0b167b6f5d908bc58cee221d66b937430fc58df64029795ef98bb8e85c575da6e3819c5f9679c721de7bdbb4bde719 + checksum: 9c87ade7b0960e6f15711e880df987237c20eabb3088c2bcc558e821f85aecee97c6340d428297a0241d3df4e3c6be66501468aef1e9a719722931a479865f3c languageName: node linkType: hard @@ -10539,7 +10705,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^5.0.1, cross-spawn@npm:^5.1.0": +"cross-spawn@npm:^5.0.1": version: 5.1.0 resolution: "cross-spawn@npm:5.1.0" dependencies: @@ -10551,26 +10717,26 @@ __metadata: linkType: hard "cross-spawn@npm:^6.0.5": - version: 6.0.5 - resolution: "cross-spawn@npm:6.0.5" + version: 6.0.6 + resolution: "cross-spawn@npm:6.0.6" dependencies: nice-try: "npm:^1.0.4" path-key: "npm:^2.0.1" semver: "npm:^5.5.0" shebang-command: "npm:^1.2.0" which: "npm:^1.2.9" - checksum: e05544722e9d7189b4292c66e42b7abeb21db0d07c91b785f4ae5fefceb1f89e626da2703744657b287e86dcd4af57b54567cef75159957ff7a8a761d9055012 + checksum: bf61fb890e8635102ea9bce050515cf915ff6a50ccaa0b37a17dc82fded0fb3ed7af5478b9367b86baee19127ad86af4be51d209f64fd6638c0862dca185fe1d languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + checksum: 053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 languageName: node linkType: hard @@ -10600,39 +10766,6 @@ __metadata: languageName: node linkType: hard -"csv-generate@npm:^3.4.3": - version: 3.4.3 - resolution: "csv-generate@npm:3.4.3" - checksum: 196afb16ec5e72f8a77a9742a9c5640868768e114ca5e0dcc22d4e6f9bfacb552432a2ca8658429b494d602d8fcc16f7efdad0ad45b7108fbd3f936074f43622 - languageName: node - linkType: hard - -"csv-parse@npm:^4.16.3": - version: 4.16.3 - resolution: "csv-parse@npm:4.16.3" - checksum: 40771fda105b10c3e44551fa4dbeab462315400deb572f2918c19d5848addd95ea3479aaaeaaf3bbd9235593a6d798dd90b9e6ba5c4ce570979bafc4bb1ba5f0 - languageName: node - linkType: hard - -"csv-stringify@npm:^5.6.5": - version: 5.6.5 - resolution: "csv-stringify@npm:5.6.5" - checksum: 125194dcf24a94e9c03eb53b3bc4b79cc6611747e73fe3c0e8a342a9f385caeb4e88c0827e89a4c508b45ea99bdc64a339b487f80048a50fabcbb3a7d87ea1a9 - languageName: node - linkType: hard - -"csv@npm:^5.5.3": - version: 5.5.3 - resolution: "csv@npm:5.5.3" - dependencies: - csv-generate: "npm:^3.4.3" - csv-parse: "npm:^4.16.3" - csv-stringify: "npm:^5.6.5" - stream-transform: "npm:^2.1.3" - checksum: 282720e1f9f1a332c0ff2c4d48d845eab2a60c23087c974eb6ffc4d907f40c053ae0f8458819d670ad2986ec25359e57dbccc0fa3370cd5d92e7d3143e345f95 - languageName: node - linkType: hard - "d@npm:1, d@npm:^1.0.1, d@npm:^1.0.2": version: 1.0.2 resolution: "d@npm:1.0.2" @@ -10659,46 +10792,53 @@ __metadata: languageName: node linkType: hard -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.6" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 + is-data-view: "npm:^1.0.2" + checksum: 7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c languageName: node linkType: hard -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 + is-data-view: "npm:^1.0.2" + checksum: f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 languageName: node linkType: hard -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" dependencies: - call-bind: "npm:^1.0.6" + call-bound: "npm:^1.0.2" es-errors: "npm:^1.3.0" is-data-view: "npm:^1.0.1" - checksum: 21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f + checksum: fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 languageName: node linkType: hard -"dataloader@npm:2.2.2, dataloader@npm:^2.2.2": +"dataloader@npm:2.2.2": version: 2.2.2 resolution: "dataloader@npm:2.2.2" checksum: 125ec69f821478cf7c6b4360095db6cab939fe57876a0d2060c428091a8deee7152345189923b71a6afa694aaec463779f34b585317164016fd6f54f52cd94ba languageName: node linkType: hard +"dataloader@npm:^2.2.2": + version: 2.2.3 + resolution: "dataloader@npm:2.2.3" + checksum: 9b9a056fbc863ca86da87d59e053e871e263b4966aa4d55e40d61a65e96815fae5530ca220629064ca5f8e3000c0c4ec93292e170c38ff393fb34256b4d7c1aa + languageName: node + linkType: hard + "dayjs@npm:1.11.7": version: 1.11.7 resolution: "dayjs@npm:1.11.7" @@ -10740,15 +10880,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.2.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.7, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + checksum: db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de languageName: node linkType: hard @@ -10761,18 +10901,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.5, debug@npm:^4.3.7": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b - languageName: node - linkType: hard - "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -10836,12 +10964,21 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^3.0.1": + version: 3.0.1 + resolution: "deep-eql@npm:3.0.1" + dependencies: + type-detect: "npm:^4.0.0" + checksum: 80b33c1c7713b3d5db89e6b5e9b22050f39c8a88e12a015616da8391e013988790d045a5c612b0c6dc43cc4bec51eadbe0fcf6075cc9717f8f56efdb305b6e6f + languageName: node + linkType: hard + "deep-eql@npm:^4.0.1, deep-eql@npm:^4.1.3": - version: 4.1.3 - resolution: "deep-eql@npm:4.1.3" + version: 4.1.4 + resolution: "deep-eql@npm:4.1.4" dependencies: type-detect: "npm:^4.0.0" - checksum: ff34e8605d8253e1bf9fe48056e02c6f347b81d9b5df1c6650a1b0f6f847b4a86453b16dc226b34f853ef14b626e85d04e081b022e20b00cd7d54f079ce9bbdd + checksum: 264e0613493b43552fc908f4ff87b8b445c0e6e075656649600e1b8a17a57ee03e960156fce7177646e4d2ddaf8e5ee616d76bd79929ff593e5c79e4e5e6c517 languageName: node linkType: hard @@ -10933,7 +11070,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -11095,13 +11232,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:5.0.0": - version: 5.0.0 - resolution: "diff@npm:5.0.0" - checksum: 08c5904779bbababcd31f1707657b1ad57f8a9b65e6f88d3fb501d09a965d5f8d73066898a7d3f35981f9e4101892c61d99175d421f3b759533213c253d91134 - languageName: node - linkType: hard - "diff@npm:^3.5.0": version: 3.5.0 resolution: "diff@npm:3.5.0" @@ -11208,10 +11338,10 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:*, dotenv@npm:^16.0.0, dotenv@npm:^16.0.3": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 48d92870076832af0418b13acd6e5a5a3e83bb00df690d9812e94b24aff62b88ade955ac99a05501305b8dc8f1b0ee7638b18493deb6fe93d680e5220936292f +"dotenv@npm:^16.0.0, dotenv@npm:^16.0.3, dotenv@npm:^16.4.5": + version: 16.4.7 + resolution: "dotenv@npm:16.4.7" + checksum: be9f597e36a8daf834452daa1f4cc30e5375a5968f98f46d89b16b983c567398a330580c88395069a77473943c06b877d1ca25b4afafcdd6d4adb549e8293462 languageName: node linkType: hard @@ -11241,9 +11371,20 @@ __metadata: linkType: hard "dset@npm:^3.1.1, dset@npm:^3.1.2": - version: 3.1.3 - resolution: "dset@npm:3.1.3" - checksum: b1ff68f1f42af373baa85b00b04d89094cd0d7f74f94bd11364cba575f2762ed52a0a0503bbfcc92eccd07c6d55426813c8a7a6cfa020338eaea1f4edfd332c2 + version: 3.1.4 + resolution: "dset@npm:3.1.4" + checksum: b67bbd28dd8a539e90c15ffb61100eb64ef995c5270a124d4f99bbb53f4d82f55a051b731ba81f3215dd9dce2b4c8d69927dc20b3be1c5fc88bab159467aa438 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 languageName: node linkType: hard @@ -11290,10 +11431,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.3.47, electron-to-chromium@npm:^1.4.668": - version: 1.4.774 - resolution: "electron-to-chromium@npm:1.4.774" - checksum: dc957ee574d14838abd16f48fb3e4bd069bf47807fe02144b850d4903265810e17abc5800a361941f787bd78692cf4f81eab70046a6757eb39e44c91ff520dd4 +"electron-to-chromium@npm:^1.3.47, electron-to-chromium@npm:^1.5.73": + version: 1.5.123 + resolution: "electron-to-chromium@npm:1.5.123" + checksum: ffaa65e9337f5ba0b51d5709795c3d1074e0cae8efda24116561feed6cedd281f523be50339d991c2fc65344e66e65e7308a157ff87047a8bb4e8008412e9eb1 languageName: node linkType: hard @@ -11312,9 +11453,9 @@ __metadata: languageName: node linkType: hard -"elliptic@npm:^6.4.0, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5": - version: 6.5.5 - resolution: "elliptic@npm:6.5.5" +"elliptic@npm:6.6.1, elliptic@npm:^6.4.0, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3, elliptic@npm:^6.5.5, elliptic@npm:^6.5.7": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" dependencies: bn.js: "npm:^4.11.9" brorand: "npm:^1.1.0" @@ -11323,14 +11464,14 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 3e591e93783a1b66f234ebf5bd3a8a9a8e063a75073a35a671e03e3b25253b6e33ac121f7efe9b8808890fffb17b40596cc19d01e6e8d1fa13b9a56ff65597c8 + checksum: 8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 languageName: node linkType: hard "emoji-regex@npm:^10.3.0": - version: 10.3.0 - resolution: "emoji-regex@npm:10.3.0" - checksum: b4838e8dcdceb44cf47f59abe352c25ff4fe7857acaf5fb51097c427f6f75b44d052eb907a7a3b86f86bc4eae3a93f5c2b7460abe79c407307e6212d65c91163 + version: 10.4.0 + resolution: "emoji-regex@npm:10.4.0" + checksum: a3fcedfc58bfcce21a05a5f36a529d81e88d602100145fcca3dc6f795e3c8acc4fc18fe773fbf9b6d6e9371205edb3afa2668ec3473fa2aa7fd47d2a9d46482d languageName: node linkType: hard @@ -11369,6 +11510,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encoding-down@npm:5.0.4, encoding-down@npm:~5.0.0": version: 5.0.4 resolution: "encoding-down@npm:5.0.4" @@ -11400,7 +11548,7 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": +"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6, enquirer@npm:^2.4.1": version: 2.4.1 resolution: "enquirer@npm:2.4.1" dependencies: @@ -11417,6 +11565,13 @@ __metadata: languageName: node linkType: hard +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: fb26434b0b581ab397039e51ff3c92b34924a98b2039dcb47e41b7bca577b9dbf134a8eadb364415c74464b682e2d3afe1a4c0eb9873dc44ea814c5d3103331d + languageName: node + linkType: hard + "eol@npm:^0.9.1": version: 0.9.1 resolution: "eol@npm:0.9.1" @@ -11458,57 +11613,62 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" dependencies: - array-buffer-byte-length: "npm:^1.0.1" - arraybuffer.prototype.slice: "npm:^1.0.3" + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - data-view-buffer: "npm:^1.0.1" - data-view-byte-length: "npm:^1.0.1" - data-view-byte-offset: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.0.3" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.4" - get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" - gopd: "npm:^1.0.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" - internal-slot: "npm:^1.0.7" - is-array-buffer: "npm:^3.0.4" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.1" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.3" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.13" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.0" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" - safe-array-concat: "npm:^1.1.2" - safe-regex-test: "npm:^1.0.3" - string.prototype.trim: "npm:^1.2.9" - string.prototype.trimend: "npm:^1.0.8" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.3" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.2" - typed-array-byte-length: "npm:^1.0.1" - typed-array-byte-offset: "npm:^1.0.2" - typed-array-length: "npm:^1.0.6" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.15" - checksum: d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b languageName: node linkType: hard @@ -11519,59 +11679,49 @@ __metadata: languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c languageName: node linkType: hard -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 languageName: node linkType: hard -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: es-errors: "npm:^1.3.0" - checksum: 1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + checksum: 65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" dependencies: - get-intrinsic: "npm:^1.2.4" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.1" - checksum: f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a - languageName: node - linkType: hard - -"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" - dependencies: - hasown: "npm:^2.0.0" - checksum: f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 + hasown: "npm:^2.0.2" + checksum: ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" dependencies: - is-callable: "npm:^1.1.4" - is-date-object: "npm:^1.0.1" - is-symbol: "npm:^1.0.2" - checksum: 0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b languageName: node linkType: hard @@ -11615,10 +11765,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1, escalade@npm:^3.1.2": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 languageName: node linkType: hard @@ -11636,7 +11786,7 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": +"escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" checksum: 9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 @@ -11691,9 +11841,9 @@ __metadata: linkType: soft "eslint-plugin-no-only-tests@npm:^3.1.0": - version: 3.1.0 - resolution: "eslint-plugin-no-only-tests@npm:3.1.0" - checksum: c710ae04094cfa4695c44efe8d5036eb881893157accf3564b96f3ee5626edef855c93ec1801557e888e390e1892775da79d9564e1a33b83941fba994725b9cd + version: 3.3.0 + resolution: "eslint-plugin-no-only-tests@npm:3.3.0" + checksum: a04425d9d3bcd745267168782eb12a3a712b8357264ddd4e204204318975c2c21e2c1efe68113181de908548a85762205b61d8f92ec9dc5e0a5ae54c0240a24d languageName: node linkType: hard @@ -11707,22 +11857,22 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.0.1": - version: 5.1.3 - resolution: "eslint-plugin-prettier@npm:5.1.3" + version: 5.2.5 + resolution: "eslint-plugin-prettier@npm:5.2.5" dependencies: prettier-linter-helpers: "npm:^1.0.0" - synckit: "npm:^0.8.6" + synckit: "npm:^0.10.2" peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" - eslint-config-prettier: "*" + eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" prettier: ">=3.0.0" peerDependenciesMeta: "@types/eslint": optional: true eslint-config-prettier: optional: true - checksum: f45d5fc1fcfec6b0cf038a7a65ddd10a25df4fe3f9e1f6b7f0d5100e66f046a26a2492e69ee765dddf461b93c114cf2e1eb18d4970aafa6f385448985c136e09 + checksum: b88d4ecfccfdea786aa8c2df8c6b52754070fec48ef5df0dcd325daf7cbe01730a96fb6a8c5ae0ddd173472b43704d6452169b058284e842dfee5894172f310b languageName: node linkType: hard @@ -11736,7 +11886,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 @@ -11744,14 +11894,14 @@ __metadata: linkType: hard "eslint@npm:^8.52.0, eslint@npm:^8.56.0, eslint@npm:^8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" + version: 8.57.1 + resolution: "eslint@npm:8.57.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" "@ungap/structured-clone": "npm:^1.2.0" @@ -11787,7 +11937,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + checksum: 1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 languageName: node linkType: hard @@ -11835,11 +11985,11 @@ __metadata: linkType: hard "esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + checksum: cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 languageName: node linkType: hard @@ -12054,11 +12204,11 @@ __metadata: linkType: hard "ethereum-bloom-filters@npm:^1.0.6": - version: 1.1.0 - resolution: "ethereum-bloom-filters@npm:1.1.0" + version: 1.2.0 + resolution: "ethereum-bloom-filters@npm:1.2.0" dependencies: "@noble/hashes": "npm:^1.4.0" - checksum: 54b0b7a1fdf12fe02fc8f605f213d11ea026111b9d2af79ff58e8319c904d9d6cee77c62fe70bee62c4d0c7952caf58ebaf47a889d9e4199cf4da1a361a87b53 + checksum: 7a0ed420cb2e85f621042d78576eb4ddea535a57f3186e314160604b29c37bcd0d3561b03695971e3a96e9c9db402b87de7248a1ac640cbc3dda1b8077cf841f languageName: node linkType: hard @@ -12112,14 +12262,14 @@ __metadata: linkType: hard "ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": - version: 2.1.3 - resolution: "ethereum-cryptography@npm:2.1.3" + version: 2.2.1 + resolution: "ethereum-cryptography@npm:2.2.1" dependencies: - "@noble/curves": "npm:1.3.0" - "@noble/hashes": "npm:1.3.3" - "@scure/bip32": "npm:1.3.3" - "@scure/bip39": "npm:1.2.2" - checksum: a2f25ad5ffa44b4364b1540a57969ee6f1dd820aa08a446f40f31203fef54a09442a6c099e70e7c1485922f6391c4c45b90f2c401e04d88ac9cc4611b05e606f + "@noble/curves": "npm:1.4.2" + "@noble/hashes": "npm:1.4.0" + "@scure/bip32": "npm:1.4.0" + "@scure/bip39": "npm:1.3.0" + checksum: c6c7626d393980577b57f709878b2eb91f270fe56116044b1d7afb70d5c519cddc0c072e8c05e4a335e05342eb64d9c3ab39d52f78bb75f76ad70817da9645ef languageName: node linkType: hard @@ -12476,47 +12626,47 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^5.0.1, ethers@npm:^5.0.18, ethers@npm:^5.0.2, ethers@npm:^5.1.0, ethers@npm:^5.1.3, ethers@npm:^5.5.2, ethers@npm:^5.6.0, ethers@npm:^5.6.1, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2": - version: 5.7.2 - resolution: "ethers@npm:5.7.2" - dependencies: - "@ethersproject/abi": "npm:5.7.0" - "@ethersproject/abstract-provider": "npm:5.7.0" - "@ethersproject/abstract-signer": "npm:5.7.0" - "@ethersproject/address": "npm:5.7.0" - "@ethersproject/base64": "npm:5.7.0" - "@ethersproject/basex": "npm:5.7.0" - "@ethersproject/bignumber": "npm:5.7.0" - "@ethersproject/bytes": "npm:5.7.0" - "@ethersproject/constants": "npm:5.7.0" - "@ethersproject/contracts": "npm:5.7.0" - "@ethersproject/hash": "npm:5.7.0" - "@ethersproject/hdnode": "npm:5.7.0" - "@ethersproject/json-wallets": "npm:5.7.0" - "@ethersproject/keccak256": "npm:5.7.0" - "@ethersproject/logger": "npm:5.7.0" - "@ethersproject/networks": "npm:5.7.1" - "@ethersproject/pbkdf2": "npm:5.7.0" - "@ethersproject/properties": "npm:5.7.0" - "@ethersproject/providers": "npm:5.7.2" - "@ethersproject/random": "npm:5.7.0" - "@ethersproject/rlp": "npm:5.7.0" - "@ethersproject/sha2": "npm:5.7.0" - "@ethersproject/signing-key": "npm:5.7.0" - "@ethersproject/solidity": "npm:5.7.0" - "@ethersproject/strings": "npm:5.7.0" - "@ethersproject/transactions": "npm:5.7.0" - "@ethersproject/units": "npm:5.7.0" - "@ethersproject/wallet": "npm:5.7.0" - "@ethersproject/web": "npm:5.7.1" - "@ethersproject/wordlists": "npm:5.7.0" - checksum: 90629a4cdb88cde7a7694f5610a83eb00d7fbbaea687446b15631397988f591c554dd68dfa752ddf00aabefd6285e5b298be44187e960f5e4962684e10b39962 - languageName: node - linkType: hard - -"ethers@npm:^6.13.4": - version: 6.13.4 - resolution: "ethers@npm:6.13.4" +"ethers@npm:^5.0.1, ethers@npm:^5.0.18, ethers@npm:^5.0.2, ethers@npm:^5.1.0, ethers@npm:^5.1.3, ethers@npm:^5.5.2, ethers@npm:^5.6.0, ethers@npm:^5.6.1, ethers@npm:^5.7.0, ethers@npm:^5.7.1, ethers@npm:^5.7.2, ethers@npm:^5.8.0": + version: 5.8.0 + resolution: "ethers@npm:5.8.0" + dependencies: + "@ethersproject/abi": "npm:5.8.0" + "@ethersproject/abstract-provider": "npm:5.8.0" + "@ethersproject/abstract-signer": "npm:5.8.0" + "@ethersproject/address": "npm:5.8.0" + "@ethersproject/base64": "npm:5.8.0" + "@ethersproject/basex": "npm:5.8.0" + "@ethersproject/bignumber": "npm:5.8.0" + "@ethersproject/bytes": "npm:5.8.0" + "@ethersproject/constants": "npm:5.8.0" + "@ethersproject/contracts": "npm:5.8.0" + "@ethersproject/hash": "npm:5.8.0" + "@ethersproject/hdnode": "npm:5.8.0" + "@ethersproject/json-wallets": "npm:5.8.0" + "@ethersproject/keccak256": "npm:5.8.0" + "@ethersproject/logger": "npm:5.8.0" + "@ethersproject/networks": "npm:5.8.0" + "@ethersproject/pbkdf2": "npm:5.8.0" + "@ethersproject/properties": "npm:5.8.0" + "@ethersproject/providers": "npm:5.8.0" + "@ethersproject/random": "npm:5.8.0" + "@ethersproject/rlp": "npm:5.8.0" + "@ethersproject/sha2": "npm:5.8.0" + "@ethersproject/signing-key": "npm:5.8.0" + "@ethersproject/solidity": "npm:5.8.0" + "@ethersproject/strings": "npm:5.8.0" + "@ethersproject/transactions": "npm:5.8.0" + "@ethersproject/units": "npm:5.8.0" + "@ethersproject/wallet": "npm:5.8.0" + "@ethersproject/web": "npm:5.8.0" + "@ethersproject/wordlists": "npm:5.8.0" + checksum: 8f187bb6af3736fbafcb613d8fb5be31fe7667a1bae480dd0a4c31b597ed47e0693d552adcababcb05111da39a059fac22e44840ce1671b1cc972de22d6d85d9 + languageName: node + linkType: hard + +"ethers@npm:^6.13.4, ethers@npm:^6.7.0": + version: 6.13.6 + resolution: "ethers@npm:6.13.6" dependencies: "@adraffy/ens-normalize": "npm:1.10.1" "@noble/curves": "npm:1.2.0" @@ -12525,22 +12675,7 @@ __metadata: aes-js: "npm:4.0.0-beta.5" tslib: "npm:2.7.0" ws: "npm:8.17.1" - checksum: efcf9f39f841e38af68ec23cdbd745432c239c256aac4929842d1af04e55d7be0ff65e462f1cf3e93586f43f7bdcc0098fd56f2f7234f36d73e466521a5766ce - languageName: node - linkType: hard - -"ethers@npm:^6.7.0": - version: 6.13.2 - resolution: "ethers@npm:6.13.2" - dependencies: - "@adraffy/ens-normalize": "npm:1.10.1" - "@noble/curves": "npm:1.2.0" - "@noble/hashes": "npm:1.3.2" - "@types/node": "npm:18.15.13" - aes-js: "npm:4.0.0-beta.5" - tslib: "npm:2.4.0" - ws: "npm:8.17.1" - checksum: 5956389a180992f8b6d90bc21b2e0f28619a098513d3aeb7a350a0b7c5852d635a9d7fd4ced1af50c985dd88398716f66dfd4a2de96c5c3a67150b93543d92af + checksum: e757b2995e1298396d120e9cb92a07c4308e93ea28eedb577d4e7a43b0b1cdf4be2460a6722294e42c1da9a9b1dddd9f2c885c9e6120fa845ccdd1b706e0ec04 languageName: node linkType: hard @@ -12643,23 +12778,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af - languageName: node - linkType: hard - "execa@npm:^0.7.0": version: 0.7.0 resolution: "execa@npm:0.7.0" @@ -12709,6 +12827,23 @@ __metadata: languageName: node linkType: hard +"execa@npm:^8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^8.0.1" + human-signals: "npm:^5.0.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^3.0.0" + checksum: 2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af + languageName: node + linkType: hard + "expand-brackets@npm:^0.1.4": version: 0.1.5 resolution: "expand-brackets@npm:0.1.5" @@ -12752,9 +12887,9 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 languageName: node linkType: hard @@ -12835,42 +12970,42 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.14.0, express@npm:^4.18.1": - version: 4.19.2 - resolution: "express@npm:4.19.2" +"express@npm:^4.14.0": + version: 4.21.1 + resolution: "express@npm:4.21.1" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" + body-parser: "npm:1.20.3" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.6.0" + cookie: "npm:0.7.1" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" + finalhandler: "npm:1.3.1" fresh: "npm:0.5.2" http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" + merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" + path-to-regexp: "npm:0.1.10" proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" + qs: "npm:6.13.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" setprototypeof: "npm:1.2.0" statuses: "npm:2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb + checksum: 0c287867e5f6129d3def1edd9b63103a53c40d4dc8628839d4b6827e35eb8f0de5a4656f9d85f4457eba584f9871ebb2ad26c750b36bd75d9bbb8bcebdc4892c languageName: node linkType: hard @@ -13024,16 +13159,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.3.2, fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + micromatch: "npm:^4.0.8" + checksum: f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe languageName: node linkType: hard @@ -13067,6 +13202,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.0.6 + resolution: "fast-uri@npm:3.0.6" + checksum: 74a513c2af0584448aee71ce56005185f81239eab7a2343110e5bad50c39ad4fb19c5a6f99783ead1cac7ccaf3461a6034fda89fffa2b30b6d99b9f21c2f9d29 + languageName: node + linkType: hard + "fast-url-parser@npm:^1.1.3": version: 1.1.3 resolution: "fast-url-parser@npm:1.1.3" @@ -13084,11 +13226,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: reusify: "npm:^1.0.4" - checksum: 1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + checksum: ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 languageName: node linkType: hard @@ -13123,15 +13265,15 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.2": - version: 6.4.2 - resolution: "fdir@npm:6.4.2" +"fdir@npm:^6.4.3": + version: 6.4.3 + resolution: "fdir@npm:6.4.3" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 34829886f34a3ca4170eca7c7180ec4de51a3abb4d380344063c0ae2e289b11d2ba8b724afee974598c83027fea363ff598caf2b51bc4e6b1e0d8b80cc530573 + checksum: d13c10120e9625adf21d8d80481586200759928c19405a816b77dd28eaeb80e7c59c5def3e2941508045eb06d34eb47fad865ccc8bf98e6ab988bb0ed160fb6f languageName: node linkType: hard @@ -13228,12 +13370,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + checksum: b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 languageName: node linkType: hard @@ -13252,6 +13394,21 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f + languageName: node + linkType: hard + "finalhandler@npm:~1.1.2": version: 1.1.2 resolution: "finalhandler@npm:1.1.2" @@ -13286,16 +13443,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:5.0.0, find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a - languageName: node - linkType: hard - "find-up@npm:^1.0.0": version: 1.1.2 resolution: "find-up@npm:1.1.2" @@ -13315,7 +13462,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": +"find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" dependencies: @@ -13325,13 +13472,13 @@ __metadata: languageName: node linkType: hard -"find-yarn-workspace-root2@npm:1.2.16": - version: 1.2.16 - resolution: "find-yarn-workspace-root2@npm:1.2.16" +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" dependencies: - micromatch: "npm:^4.0.2" - pkg-dir: "npm:^4.2.0" - checksum: d576067c7823de517d71831eafb5f6dc60554335c2d14445708f2698551b234f89c976a7f259d9355a44e417c49e7a93b369d0474579af02bbe2498f780c92d3 + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a languageName: node linkType: hard @@ -13387,9 +13534,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 languageName: node linkType: hard @@ -13417,21 +13564,21 @@ __metadata: linkType: hard "follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + checksum: 5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f languageName: node linkType: hard -"for-each@npm:^0.3.3, for-each@npm:~0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" +"for-each@npm:^0.3.3, for-each@npm:^0.3.5, for-each@npm:~0.3.3": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: "npm:^1.1.3" - checksum: 22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa + is-callable: "npm:^1.2.7" + checksum: 0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee languageName: node linkType: hard @@ -13459,12 +13606,12 @@ __metadata: linkType: hard "foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: "npm:^7.0.0" + cross-spawn: "npm:^7.0.6" signal-exit: "npm:^4.0.1" - checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + checksum: 8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 languageName: node linkType: hard @@ -13490,35 +13637,39 @@ __metadata: linkType: hard "form-data@npm:^2.2.0": - version: 2.5.1 - resolution: "form-data@npm:2.5.1" + version: 2.5.3 + resolution: "form-data@npm:2.5.3" dependencies: asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.6" - mime-types: "npm:^2.1.12" - checksum: 7e8fb913b84a7ac04074781a18d0f94735bbe82815ff35348803331f6480956ff0035db5bcf15826edee09fe01e665cfac664678f1526646a6374ee13f960e56 + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + mime-types: "npm:^2.1.35" + safe-buffer: "npm:^5.2.1" + checksum: 48b910745d4fcd403f3d6876e33082a334e712199b8c86c4eb82f6da330a59b859943999d793856758c5ff18ca5261ced4d1062235a14543022d986bd21faa7d languageName: node linkType: hard "form-data@npm:^3.0.0": - version: 3.0.1 - resolution: "form-data@npm:3.0.1" + version: 3.0.3 + resolution: "form-data@npm:3.0.3" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: 1ccc3ae064a080a799923f754d49fcebdd90515a8924f0f54de557540b50e7f1fe48ba5f2bd0435a5664aa2d49729107e6aaf2155a9abf52339474c5638b4485 + es-set-tostringtag: "npm:^2.1.0" + mime-types: "npm:^2.1.35" + checksum: a62b275f9736ff94f327c66d5f6c581391eafe07c912b12c3738e822aa3b1f27fb23d7138af5b48163497a278e2f84ec9f4a27e60dd511b7683fb76a835bb395 languageName: node linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.2 + resolution: "form-data@npm:4.0.2" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" mime-types: "npm:^2.1.12" - checksum: cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + checksum: e534b0cf025c831a0929bf4b9bbe1a9a6b03e273a8161f9947286b9b13bf8fb279c6944aae0070c4c311100c6d6dbb815cd955dc217728caf73fad8dc5b8ee9c languageName: node linkType: hard @@ -13738,15 +13889,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" functions-have-names: "npm:^1.2.3" - checksum: 9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 languageName: node linkType: hard @@ -13829,29 +13982,34 @@ __metadata: linkType: hard "get-east-asian-width@npm:^1.0.0": - version: 1.2.0 - resolution: "get-east-asian-width@npm:1.2.0" - checksum: 914b1e217cf38436c24b4c60b4c45289e39a45bf9e65ef9fd343c2815a1a02b8a0215aeec8bf9c07c516089004b6e3826332481f40a09529fcadbf6e579f286b + version: 1.3.0 + resolution: "get-east-asian-width@npm:1.3.0" + checksum: 1a049ba697e0f9a4d5514c4623781c5246982bdb61082da6b5ae6c33d838e52ce6726407df285cdbb27ec1908b333cf2820989bd3e986e37bb20979437fdf34b languageName: node linkType: hard -"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": +"get-func-name@npm:^2.0.0, get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": version: 2.0.2 resolution: "get-func-name@npm:2.0.2" checksum: 89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a languageName: node linkType: hard @@ -13876,6 +14034,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + "get-stream@npm:^3.0.0": version: 3.0.0 resolution: "get-stream@npm:3.0.0" @@ -13915,14 +14083,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.5" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - checksum: 867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc + get-intrinsic: "npm:^1.2.6" + checksum: d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b languageName: node linkType: hard @@ -14048,31 +14216,19 @@ __metadata: languageName: node linkType: hard -"glob@npm:8.1.0, glob@npm:^8.0.3, glob@npm:^8.1.0": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^5.0.1" - once: "npm:^1.3.0" - checksum: cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f - languageName: node - linkType: hard - "glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": - version: 10.3.15 - resolution: "glob@npm:10.3.15" + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.6" - minimatch: "npm:^9.0.1" - minipass: "npm:^7.0.4" - path-scurry: "npm:^1.11.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: cda748ddc181b31b3df9548c0991800406d5cc3b3f8110e37a8751ec1e39f37cdae7d7782d5422d7df92775121cdf00599992dff22f7ff1260344843af227c2b + checksum: 19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e languageName: node linkType: hard @@ -14119,6 +14275,19 @@ __metadata: languageName: node linkType: hard +"glob@npm:^8.0.3, glob@npm:^8.1.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^5.0.1" + once: "npm:^1.3.0" + checksum: cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f + languageName: node + linkType: hard + "global-dirs@npm:^0.1.1": version: 0.1.1 resolution: "global-dirs@npm:0.1.1" @@ -14205,7 +14374,7 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.3": +"globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -14245,12 +14414,10 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead languageName: node linkType: hard @@ -14346,13 +14513,6 @@ __metadata: languageName: node linkType: hard -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 108415fb07ac913f17040dc336607772fcea68c7f495ef91887edddb0b0f5ff7bc1d1ab181b125ecb2f0505669ef12c9a178a3bbd2dd8e042d8c5f1d7c90331a - languageName: node - linkType: hard - "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -14390,11 +14550,11 @@ __metadata: linkType: hard "graphql-ws@npm:^5.12.1": - version: 5.16.0 - resolution: "graphql-ws@npm:5.16.0" + version: 5.16.2 + resolution: "graphql-ws@npm:5.16.2" peerDependencies: graphql: ">=0.11 <=16" - checksum: 5e538c3460ca997a1634bd0f64236d8d7aa6ac75c58aba549b49953faf0dd2497f4fa43eedb0bc82cfff50426c7ce47682a670d2571fd7f3af5dcf00911c9e1b + checksum: ba373df11ea8c6349c9f67335a0dfb09050a09ecc6b724b64730d242675c41d9f4b4a114b190b8711d014f8491c2bb8249e0df8308d51c4b27c921f87c4f6c58 languageName: node linkType: hard @@ -14435,9 +14595,9 @@ __metadata: linkType: hard "graphql@npm:^16.5.0": - version: 16.8.1 - resolution: "graphql@npm:16.8.1" - checksum: 129c318156b466f440914de80dbf7bc67d17f776f2a088a40cb0da611d19a97c224b1c6d2b13cbcbc6e5776e45ed7468b8432f9c3536724e079b44f1a3d57a8a + version: 16.10.0 + resolution: "graphql@npm:16.10.0" + checksum: 303730675538c8bd6c76b447dc6f03e61242e2d2596b408c34759666ec4877409e5593a7a0467d590ac5407b8c663b093b599556a77f24f281abea69ddc53de6 languageName: node linkType: hard @@ -14515,7 +14675,7 @@ __metadata: languageName: node linkType: hard -"hardhat-deploy@npm:^0.11.14": +"hardhat-deploy@npm:^0.11.43": version: 0.11.45 resolution: "hardhat-deploy@npm:0.11.45" dependencies: @@ -14652,23 +14812,7 @@ __metadata: languageName: node linkType: hard -"hardhat-secure-accounts@npm:^1.0.4": - version: 1.0.4 - resolution: "hardhat-secure-accounts@npm:1.0.4" - dependencies: - debug: "npm:^4.3.4" - enquirer: "npm:^2.3.6" - lodash.clonedeep: "npm:^4.5.0" - prompt-sync: "npm:^4.2.0" - peerDependencies: - "@nomicfoundation/hardhat-ethers": ^3.0.0 - ethers: ^6.13.0 - hardhat: ^2.22.0 - checksum: 6406be693502234f342b9e27215bb3ecb3502a0d9f5299c5c1f5e1be28f08d26226cff511723e719639dc12fb2e4e329386a41e5c90f57b3bf3116656c45c2b5 - languageName: node - linkType: hard - -"hardhat-secure-accounts@npm:^1.0.5": +"hardhat-secure-accounts@npm:^1.0.4, hardhat-secure-accounts@npm:^1.0.5": version: 1.0.5 resolution: "hardhat-secure-accounts@npm:1.0.5" dependencies: @@ -14708,75 +14852,13 @@ __metadata: languageName: node linkType: hard -"hardhat@npm:^2.22.16": - version: 2.22.16 - resolution: "hardhat@npm:2.22.16" - dependencies: - "@ethersproject/abi": "npm:^5.1.2" - "@metamask/eth-sig-util": "npm:^4.0.0" - "@nomicfoundation/edr": "npm:^0.6.4" - "@nomicfoundation/ethereumjs-common": "npm:4.0.4" - "@nomicfoundation/ethereumjs-tx": "npm:5.0.4" - "@nomicfoundation/ethereumjs-util": "npm:9.0.4" - "@nomicfoundation/solidity-analyzer": "npm:^0.1.0" - "@sentry/node": "npm:^5.18.1" - "@types/bn.js": "npm:^5.1.0" - "@types/lru-cache": "npm:^5.1.0" - adm-zip: "npm:^0.4.16" - aggregate-error: "npm:^3.0.0" - ansi-escapes: "npm:^4.3.0" - boxen: "npm:^5.1.2" - chokidar: "npm:^4.0.0" - ci-info: "npm:^2.0.0" - debug: "npm:^4.1.1" - enquirer: "npm:^2.3.0" - env-paths: "npm:^2.2.0" - ethereum-cryptography: "npm:^1.0.3" - ethereumjs-abi: "npm:^0.6.8" - find-up: "npm:^5.0.0" - fp-ts: "npm:1.19.3" - fs-extra: "npm:^7.0.1" - immutable: "npm:^4.0.0-rc.12" - io-ts: "npm:1.10.4" - json-stream-stringify: "npm:^3.1.4" - keccak: "npm:^3.0.2" - lodash: "npm:^4.17.11" - mnemonist: "npm:^0.38.0" - mocha: "npm:^10.0.0" - p-map: "npm:^4.0.0" - picocolors: "npm:^1.1.0" - raw-body: "npm:^2.4.1" - resolve: "npm:1.17.0" - semver: "npm:^6.3.0" - solc: "npm:0.8.26" - source-map-support: "npm:^0.5.13" - stacktrace-parser: "npm:^0.1.10" - tinyglobby: "npm:^0.2.6" - tsort: "npm:0.0.1" - undici: "npm:^5.14.0" - uuid: "npm:^8.3.2" - ws: "npm:^7.4.6" - peerDependencies: - ts-node: "*" - typescript: "*" - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - bin: - hardhat: internal/cli/bootstrap.js - checksum: d193d8dbd02aba9875fc4df23c49fe8cf441afb63382c9e248c776c75aca6e081e9b7b75fb262739f20bff152f9e0e4112bb22e3609dfa63ed4469d3ea46c0ca - languageName: node - linkType: hard - -"hardhat@npm:^2.22.18": - version: 2.22.18 - resolution: "hardhat@npm:2.22.18" +"hardhat@npm:^2.22.16, hardhat@npm:^2.22.18, hardhat@npm:^2.6.1, hardhat@npm:^2.6.4": + version: 2.22.19 + resolution: "hardhat@npm:2.22.19" dependencies: "@ethersproject/abi": "npm:^5.1.2" "@metamask/eth-sig-util": "npm:^4.0.0" - "@nomicfoundation/edr": "npm:^0.7.0" + "@nomicfoundation/edr": "npm:^0.8.0" "@nomicfoundation/ethereumjs-common": "npm:4.0.4" "@nomicfoundation/ethereumjs-tx": "npm:5.0.4" "@nomicfoundation/ethereumjs-util": "npm:9.0.4" @@ -14828,68 +14910,7 @@ __metadata: optional: true bin: hardhat: internal/cli/bootstrap.js - checksum: cd2fd8972b24d13a342747129e88bfe8bad45432ad88c66c743e81615e1c5db7d656c3e9748c03e517c94f6f6df717c4a14685c82c9f843c9be7c1e0a5f76c49 - languageName: node - linkType: hard - -"hardhat@npm:^2.6.1, hardhat@npm:^2.6.4": - version: 2.22.4 - resolution: "hardhat@npm:2.22.4" - dependencies: - "@ethersproject/abi": "npm:^5.1.2" - "@metamask/eth-sig-util": "npm:^4.0.0" - "@nomicfoundation/edr": "npm:^0.3.7" - "@nomicfoundation/ethereumjs-common": "npm:4.0.4" - "@nomicfoundation/ethereumjs-tx": "npm:5.0.4" - "@nomicfoundation/ethereumjs-util": "npm:9.0.4" - "@nomicfoundation/solidity-analyzer": "npm:^0.1.0" - "@sentry/node": "npm:^5.18.1" - "@types/bn.js": "npm:^5.1.0" - "@types/lru-cache": "npm:^5.1.0" - adm-zip: "npm:^0.4.16" - aggregate-error: "npm:^3.0.0" - ansi-escapes: "npm:^4.3.0" - boxen: "npm:^5.1.2" - chalk: "npm:^2.4.2" - chokidar: "npm:^3.4.0" - ci-info: "npm:^2.0.0" - debug: "npm:^4.1.1" - enquirer: "npm:^2.3.0" - env-paths: "npm:^2.2.0" - ethereum-cryptography: "npm:^1.0.3" - ethereumjs-abi: "npm:^0.6.8" - find-up: "npm:^2.1.0" - fp-ts: "npm:1.19.3" - fs-extra: "npm:^7.0.1" - glob: "npm:7.2.0" - immutable: "npm:^4.0.0-rc.12" - io-ts: "npm:1.10.4" - keccak: "npm:^3.0.2" - lodash: "npm:^4.17.11" - mnemonist: "npm:^0.38.0" - mocha: "npm:^10.0.0" - p-map: "npm:^4.0.0" - raw-body: "npm:^2.4.1" - resolve: "npm:1.17.0" - semver: "npm:^6.3.0" - solc: "npm:0.7.3" - source-map-support: "npm:^0.5.13" - stacktrace-parser: "npm:^0.1.10" - tsort: "npm:0.0.1" - undici: "npm:^5.14.0" - uuid: "npm:^8.3.2" - ws: "npm:^7.4.6" - peerDependencies: - ts-node: "*" - typescript: "*" - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - bin: - hardhat: internal/cli/bootstrap.js - checksum: b9f51c40bc0d392dedb7fe866da30115a9c120b89eafe1f0afcda3cf1b379d7163e6a33a9b7a8ba78df795b477c2fd2d83ace8eb992668271b610786e320d5b7 + checksum: bd0024f322787abd62aad6847e06d9988f861fd9bf2620bddd04cfeafada6925e97cc210034d7d00ba6cd9463608467fbf1b98bef380940f2e5c8e8d63bfc8e5 languageName: node linkType: hard @@ -14970,10 +14991,10 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 languageName: node linkType: hard @@ -15014,17 +15035,19 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e languageName: node linkType: hard @@ -15095,12 +15118,12 @@ __metadata: linkType: hard "hash-base@npm:~3.0": - version: 3.0.4 - resolution: "hash-base@npm:3.0.4" + version: 3.0.5 + resolution: "hash-base@npm:3.0.5" dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: a13357dccb3827f0bb0b56bf928da85c428dc8670f6e4a1c7265e4f1653ce02d69030b40fd01b0f1d218a995a066eea279cded9cec72d207b593bcdfe309c2f0 + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + checksum: 6dc185b79bad9b6d525cd132a588e4215380fdc36fec6f7a8a58c5db8e3b642557d02ad9c367f5e476c7c3ad3ccffa3607f308b124e1ed80e3b80a1b254db61e languageName: node linkType: hard @@ -15131,7 +15154,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -15149,7 +15172,7 @@ __metadata: languageName: node linkType: hard -"he@npm:1.2.0, he@npm:^1.2.0": +"he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" bin: @@ -15242,6 +15265,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^7.0.0": + version: 7.0.2 + resolution: "hosted-git-info@npm:7.0.2" + dependencies: + lru-cache: "npm:^10.0.1" + checksum: b19dbd92d3c0b4b0f1513cf79b0fc189f54d6af2129eeb201de2e9baaa711f1936929c848b866d9c8667a0f956f34bf4f07418c12be1ee9ca74fd9246335ca1f + languageName: node + linkType: hard + "hotscript@npm:^1.0.11": version: 1.0.13 resolution: "hotscript@npm:1.0.13" @@ -15362,19 +15394,21 @@ __metadata: linkType: hard "https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: "npm:^7.0.2" + agent-base: "npm:^7.1.2" debug: "npm:4" - checksum: bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + checksum: f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac languageName: node linkType: hard -"human-id@npm:^1.0.2": - version: 1.0.2 - resolution: "human-id@npm:1.0.2" - checksum: e4c3be49b3927ff8ac54ae4a95ed77ad94fd793b57be51aff39aa81931c6efe56303ce1ec76a70c74f85748644207c89ccfa63d828def1313eff7526a14c3b3b +"human-id@npm:^4.1.1": + version: 4.1.1 + resolution: "human-id@npm:4.1.1" + bin: + human-id: dist/cli.js + checksum: 9a9a18130fb7d6bc707054bacc32cb328289be0de47ba5669fd04995435e7e59931b87c644a223d68473c450221d104175a5fefe93d77f3522822ead8945def8 languageName: node linkType: hard @@ -15417,13 +15451,6 @@ __metadata: languageName: node linkType: hard -"hyperlinker@npm:^1.0.0": - version: 1.0.0 - resolution: "hyperlinker@npm:1.0.0" - checksum: 7b980f51611fb5efb62ad5aa3a8af9305b7fb0c203eb9d8915e24e96cdb43c5a4121e2d461bfd74cf47d4e01e39ce473700ea0e2353cb1f71758f94be37a44b0 - languageName: node - linkType: hard - "iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -15459,9 +15486,9 @@ __metadata: linkType: hard "ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard @@ -15494,9 +15521,9 @@ __metadata: linkType: hard "immutable@npm:^4.0.0-rc.12": - version: 4.3.6 - resolution: "immutable@npm:4.3.6" - checksum: 7d0952a768b4fadcee47230ed86dc9505a4517095eceaf5a47e65288571c42400c6e4a2ae21eca4eda957cb7bc50720213135b62cf6a181639111f8acae128c3 + version: 4.3.7 + resolution: "immutable@npm:4.3.7" + checksum: 9b099197081b22f6433003e34929da8ecddbbdc1474cdc8aa3b7669dee4adda349c06143de22def36016d1b6de5322b043eccd7a11db1dad2ca85dad4fff5435 languageName: node linkType: hard @@ -15508,12 +15535,12 @@ __metadata: linkType: hard "import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + checksum: bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec languageName: node linkType: hard @@ -15620,14 +15647,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 languageName: node linkType: hard @@ -15833,22 +15860,23 @@ __metadata: linkType: hard "is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": - version: 1.1.1 - resolution: "is-arguments@npm:1.1.1" + version: 1.2.0 + resolution: "is-arguments@npm:1.2.0" dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 5ff1f341ee4475350adfc14b2328b38962564b7c2076be2f5bac7bd9b61779efba99b9f844a7b82ba7654adccf8e8eb19d1bb0cc6d1c1a085e498f6793d4328f + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 6377344b31e9fcb707c6751ee89b11f132f32338e6a782ec2eac9393b0cbd32235dad93052998cda778ee058754860738341d8114910d50ada5615912bb929fc languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - checksum: 42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d languageName: node linkType: hard @@ -15866,12 +15894,25 @@ __metadata: languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" dependencies: - has-bigints: "npm:^1.0.1" - checksum: eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 + has-bigints: "npm:^1.0.2" + checksum: f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 languageName: node linkType: hard @@ -15893,13 +15934,13 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e languageName: node linkType: hard @@ -15917,7 +15958,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f @@ -15943,11 +15984,11 @@ __metadata: linkType: hard "is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: - hasown: "npm:^2.0.0" - checksum: 2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 + hasown: "npm:^2.0.2" + checksum: 898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd languageName: node linkType: hard @@ -15960,21 +16001,24 @@ __metadata: languageName: node linkType: hard -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" is-typed-array: "npm:^1.1.13" - checksum: a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d + checksum: ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f languageName: node linkType: hard @@ -16060,6 +16104,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 + languageName: node + linkType: hard + "is-finite@npm:^1.0.0": version: 1.1.0 resolution: "is-finite@npm:1.1.0" @@ -16120,12 +16173,15 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" +"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a languageName: node linkType: hard @@ -16186,19 +16242,20 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.3": +"is-map@npm:^2.0.3": version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e + resolution: "is-map@npm:2.0.3" + checksum: 2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 languageName: node linkType: hard @@ -16292,7 +16349,19 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4, is-regex@npm:~1.1.4": +"is-regex@npm:^1.1.4, is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 + languageName: node + linkType: hard + +"is-regex@npm:~1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" dependencies: @@ -16318,12 +16387,19 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: "npm:^1.0.7" - checksum: adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 + call-bound: "npm:^1.0.3" + checksum: 65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db languageName: node linkType: hard @@ -16348,12 +16424,13 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d languageName: node linkType: hard @@ -16366,12 +16443,14 @@ __metadata: languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - has-symbols: "npm:^1.0.2" - checksum: 9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e languageName: node linkType: hard @@ -16393,12 +16472,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.3": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15, is-typed-array@npm:^1.1.3": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" dependencies: - which-typed-array: "npm:^1.1.14" - checksum: fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca + which-typed-array: "npm:^1.1.16" + checksum: 415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 languageName: node linkType: hard @@ -16448,12 +16527,29 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" dependencies: - call-bind: "npm:^1.0.2" - checksum: 1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + call-bound: "npm:^1.0.3" + checksum: 8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 languageName: node linkType: hard @@ -16667,34 +16763,34 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^2.3.6": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + checksum: 6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 languageName: node linkType: hard "jackspeak@npm:^4.0.1": - version: 4.0.2 - resolution: "jackspeak@npm:4.0.2" + version: 4.1.0 + resolution: "jackspeak@npm:4.1.0" dependencies: "@isaacs/cliui": "npm:^8.0.2" - checksum: b26039d11c0163a95b1e58851b9ac453cce64ad6d1eb98a00b303ad5eeb761b29d33c9419d1e16c016d3f7151c8edf7df223e6cf93a1907655fd95d6ce85c0de + checksum: 08a6a24a366c90b83aef3ad6ec41dcaaa65428ffab8d80bc7172add0fbb8b134a34f415ad288b2a6fbd406526e9a62abdb40ed4f399fbe00cb45c44056d4dce0 languageName: node linkType: hard -"jiti@npm:^1.19.1": - version: 1.21.0 - resolution: "jiti@npm:1.21.0" +"jiti@npm:^1.21.6": + version: 1.21.7 + resolution: "jiti@npm:1.21.7" bin: jiti: bin/jiti.js - checksum: 7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f + checksum: 77b61989c758ff32407cdae8ddc77f85e18e1a13fc4977110dbd2e05fc761842f5f71bce684d9a01316e1c4263971315a111385759951080bbfe17cbb5de8f7a languageName: node linkType: hard @@ -16747,7 +16843,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:3.x, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0, js-yaml@npm:^3.6.1": +"js-yaml@npm:3.x, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0, js-yaml@npm:^3.6.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -16759,7 +16855,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -16800,12 +16896,12 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + checksum: 531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 languageName: node linkType: hard @@ -16932,14 +17028,15 @@ __metadata: linkType: hard "json-stable-stringify@npm:^1.0.1": - version: 1.1.1 - resolution: "json-stable-stringify@npm:1.1.1" + version: 1.2.1 + resolution: "json-stable-stringify@npm:1.2.1" dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" isarray: "npm:^2.0.5" jsonify: "npm:^0.0.1" object-keys: "npm:^1.1.1" - checksum: 3801e3eeccbd030afb970f54bea690a079cfea7d9ed206a1b17ca9367f4b7772c764bf77a48f03e56b50e5f7ee7d11c52339fe20d8d7ccead003e4ca69e4cfde + checksum: e623e7ce89282f089d56454087edb717357e8572089b552fbc6980fb7814dc3943f7d0e4f1a19429a36ce9f4428b6c8ee6883357974457aaaa98daba5adebeea languageName: node linkType: hard @@ -17028,7 +17125,7 @@ __metadata: languageName: node linkType: hard -"jsonparse@npm:^1.2.0": +"jsonparse@npm:^1.2.0, jsonparse@npm:^1.3.1": version: 1.3.1 resolution: "jsonparse@npm:1.3.1" checksum: 89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 @@ -17036,9 +17133,9 @@ __metadata: linkType: hard "jsonschema@npm:^1.2.4": - version: 1.4.1 - resolution: "jsonschema@npm:1.4.1" - checksum: c3422d3fc7d33ff7234a806ffa909bb6fb5d1cd664bea229c64a1785dc04cbccd5fc76cf547c6ab6dd7881dbcaf3540a6a9f925a5956c61a9cd3e23a3c1796ef + version: 1.5.0 + resolution: "jsonschema@npm:1.5.0" + checksum: c24ddb8d741f02efc0da3ad9b597a275f6b595062903d3edbfaa535c3f9c4c98613df68da5cb6635ed9aeab30d658986fea61d7662fc5b2b92840d5a1e21235e languageName: node linkType: hard @@ -17148,13 +17245,6 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^4.1.5": - version: 4.1.5 - resolution: "kleur@npm:4.1.5" - checksum: e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a - languageName: node - linkType: hard - "kuler@npm:^2.0.0": version: 2.0.0 resolution: "kuler@npm:2.0.0" @@ -17416,10 +17506,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:3.0.0": - version: 3.0.0 - resolution: "lilconfig@npm:3.0.0" - checksum: 7f5ee7a658dc016cacf146815e8d88b06f06f4402823b8b0934e305a57a197f55ccc9c5cd4fb5ea1b2b821c8ccaf2d54abd59602a4931af06eabda332388d3e6 +"lilconfig@npm:^3.1.3": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc languageName: node linkType: hard @@ -17480,36 +17570,22 @@ __metadata: linkType: hard "lint-staged@npm:^15.2.2": - version: 15.2.2 - resolution: "lint-staged@npm:15.2.2" - dependencies: - chalk: "npm:5.3.0" - commander: "npm:11.1.0" - debug: "npm:4.3.4" - execa: "npm:8.0.1" - lilconfig: "npm:3.0.0" - listr2: "npm:8.0.1" - micromatch: "npm:4.0.5" - pidtree: "npm:0.6.0" - string-argv: "npm:0.3.2" - yaml: "npm:2.3.4" + version: 15.5.0 + resolution: "lint-staged@npm:15.5.0" + dependencies: + chalk: "npm:^5.4.1" + commander: "npm:^13.1.0" + debug: "npm:^4.4.0" + execa: "npm:^8.0.1" + lilconfig: "npm:^3.1.3" + listr2: "npm:^8.2.5" + micromatch: "npm:^4.0.8" + pidtree: "npm:^0.6.0" + string-argv: "npm:^0.3.2" + yaml: "npm:^2.7.0" bin: lint-staged: bin/lint-staged.js - checksum: a1ba6c7ee53e30a0f6ea9a351d95d3d0d2be916a41b561e22907e9ea513eb18cb3dbe65bff3ec13fad15777999efe56b2e2a95427e31d12a9b7e7948c3630ee2 - languageName: node - linkType: hard - -"listr2@npm:8.0.1": - version: 8.0.1 - resolution: "listr2@npm:8.0.1" - dependencies: - cli-truncate: "npm:^4.0.0" - colorette: "npm:^2.0.20" - eventemitter3: "npm:^5.0.1" - log-update: "npm:^6.0.0" - rfdc: "npm:^1.3.0" - wrap-ansi: "npm:^9.0.0" - checksum: b565d6ceb3a4c2dbe0c1735c0fd907afd0d6f89de21aced8e05187b2d88ca2f8f9ebc5d743885396a00f05f13146f6be744d098a56ce0402cf1cd131485a7ff1 + checksum: 393b24d85d705a36e6556dc9d9b710594163be60f7789a2ca71bbf8f31debc10f7fde9cd0e868466ac2b7c154661983602decd7abbb6c685b21007bc70dbbdd6 languageName: node linkType: hard @@ -17555,6 +17631,20 @@ __metadata: languageName: node linkType: hard +"listr2@npm:^8.2.5": + version: 8.2.5 + resolution: "listr2@npm:8.2.5" + dependencies: + cli-truncate: "npm:^4.0.0" + colorette: "npm:^2.0.20" + eventemitter3: "npm:^5.0.1" + log-update: "npm:^6.1.0" + rfdc: "npm:^1.4.1" + wrap-ansi: "npm:^9.0.0" + checksum: f5a9599514b00c27d7eb32d1117c83c61394b2a985ec20e542c798bf91cf42b19340215701522736f5b7b42f557e544afeadec47866e35e5d4f268f552729671 + languageName: node + linkType: hard + "load-json-file@npm:^1.0.0": version: 1.1.0 resolution: "load-json-file@npm:1.1.0" @@ -17568,18 +17658,6 @@ __metadata: languageName: node linkType: hard -"load-yaml-file@npm:^0.2.0": - version: 0.2.0 - resolution: "load-yaml-file@npm:0.2.0" - dependencies: - graceful-fs: "npm:^4.1.5" - js-yaml: "npm:^3.13.0" - pify: "npm:^4.0.1" - strip-bom: "npm:^3.0.0" - checksum: e00ed43048c0648dfef7639129b6d7e5c2272bc36d2a50dd983dd495f3341a02cd2c40765afa01345f798d0d894e5ba53212449933e72ddfa4d3f7a48f822d2f - languageName: node - linkType: hard - "localforage@npm:1.10.0": version: 1.10.0 resolution: "localforage@npm:1.10.0" @@ -17757,7 +17835,7 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:4.1.0, log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": +"log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -17779,22 +17857,22 @@ __metadata: languageName: node linkType: hard -"log-update@npm:^6.0.0": - version: 6.0.0 - resolution: "log-update@npm:6.0.0" +"log-update@npm:^6.1.0": + version: 6.1.0 + resolution: "log-update@npm:6.1.0" dependencies: - ansi-escapes: "npm:^6.2.0" - cli-cursor: "npm:^4.0.0" - slice-ansi: "npm:^7.0.0" + ansi-escapes: "npm:^7.0.0" + cli-cursor: "npm:^5.0.0" + slice-ansi: "npm:^7.1.0" strip-ansi: "npm:^7.1.0" wrap-ansi: "npm:^9.0.0" - checksum: e0b3c3401ef49ce3eb17e2f83d644765e4f7988498fc1344eaa4f31ab30e510dcc469a7fb64dc01bd1c8d9237d917598fa677a9818705fb3774c10f6e9d4b27c + checksum: 4b350c0a83d7753fea34dcac6cd797d1dc9603291565de009baa4aa91c0447eab0d3815a05c8ec9ac04fdfffb43c82adcdb03ec1fceafd8518e1a8c1cff4ff89 languageName: node linkType: hard -"logform@npm:^2.3.2, logform@npm:^2.4.0": - version: 2.6.0 - resolution: "logform@npm:2.6.0" +"logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" dependencies: "@colors/colors": "npm:1.6.0" "@types/triple-beam": "npm:^1.3.2" @@ -17802,7 +17880,7 @@ __metadata: ms: "npm:^2.1.1" safe-stable-stringify: "npm:^2.3.1" triple-beam: "npm:^1.3.0" - checksum: 6e02f8617a03155b2fce451bacf777a2c01da16d32c4c745b3ec85be6c3f2602f2a4953a8bd096441cb4c42c447b52318541d6b6bc335dce903cb9ad77a1749f + checksum: 4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f languageName: node linkType: hard @@ -17889,16 +17967,16 @@ __metadata: linkType: hard "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb languageName: node linkType: hard "lru-cache@npm:^11.0.0": - version: 11.0.2 - resolution: "lru-cache@npm:11.0.2" - checksum: c993b8e06ead0b24b969c1dbb5b301716aed66e320e9014a80012f5febe280b438f28ff50046b2c55ff404e889351ccb332ff91f8dd175a21f5eae80e3fb155f + version: 11.1.0 + resolution: "lru-cache@npm:11.1.0" + checksum: 85c312f7113f65fae6a62de7985348649937eb34fb3d212811acbf6704dc322a421788aca253b62838f1f07049a84cc513d88f494e373d3756514ad263670a64 languageName: node linkType: hard @@ -17985,6 +18063,25 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + languageName: node + linkType: hard + "map-cache@npm:^0.2.0, map-cache@npm:^0.2.2": version: 0.2.2 resolution: "map-cache@npm:0.2.2" @@ -18023,9 +18120,16 @@ __metadata: linkType: hard "match-all@npm:^1.2.6": - version: 1.2.6 - resolution: "match-all@npm:1.2.6" - checksum: 4e0344bf3c39fdedf212bc0e61ce970a40f7f5c1cbbf34de0992a47515d999dab3aa8600a2a09487afb5f561e59d267f0b5dd7a74dfaec203cec77c1f8c52d5a + version: 1.2.7 + resolution: "match-all@npm:1.2.7" + checksum: 3f4a57e02e1631ab2c79ea5c317cead6573817eff0ef6b33270d26707aa8cbfe464debff1c22babf48ca39511efee2172c362a8910c6c203cd25eba61b2ae64c + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f languageName: node linkType: hard @@ -18123,25 +18227,6 @@ __metadata: languageName: node linkType: hard -"meow@npm:^6.0.0": - version: 6.1.1 - resolution: "meow@npm:6.1.1" - dependencies: - "@types/minimist": "npm:^1.2.0" - camelcase-keys: "npm:^6.2.2" - decamelize-keys: "npm:^1.1.0" - hard-rejection: "npm:^2.1.0" - minimist-options: "npm:^4.0.2" - normalize-package-data: "npm:^2.5.0" - read-pkg-up: "npm:^7.0.1" - redent: "npm:^3.0.0" - trim-newlines: "npm:^3.0.0" - type-fest: "npm:^0.13.1" - yargs-parser: "npm:^18.1.3" - checksum: ceece1e5e09a53d7bf298ef137477e395a0dd30c8ed1a9980a52caad02eccffd6bce1a5cad4596cd694e7e924e949253f0cc1e7c22073c07ce7b06cfefbcf8be - languageName: node - linkType: hard - "meow@npm:^8.0.0": version: 8.1.2 resolution: "meow@npm:8.1.2" @@ -18168,6 +18253,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 + languageName: node + linkType: hard + "merge-options@npm:^2.0.0": version: 2.0.0 resolution: "merge-options@npm:2.0.0" @@ -18248,16 +18340,6 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:4.0.5, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: "npm:^3.0.2" - picomatch: "npm:^2.3.1" - checksum: 3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff - languageName: node - linkType: hard - "micromatch@npm:^2.1.5": version: 2.3.11 resolution: "micromatch@npm:2.3.11" @@ -18300,6 +18382,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + "miller-rabin@npm:^4.0.0": version: 4.0.1 resolution: "miller-rabin@npm:4.0.1" @@ -18319,7 +18411,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -18358,6 +18450,13 @@ __metadata: languageName: node linkType: hard +"mimic-function@npm:^5.0.0": + version: 5.0.1 + resolution: "mimic-function@npm:5.0.1" + checksum: f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d + languageName: node + linkType: hard + "mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -18409,12 +18508,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:*, minimatch@npm:^9.0.1, minimatch@npm:^9.0.4": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" +"minimatch@npm:*, minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + checksum: e6c29a81fe83e1877ad51348306be2e8aeca18c88fdee7a99df44322314279e15799e41d7cb274e4e8bb0b451a3bc622d6182e157dfa1717d6cda75e9cd8cd5d languageName: node linkType: hard @@ -18427,15 +18526,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:5.0.1": - version: 5.0.1 - resolution: "minimatch@npm:5.0.1" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: baa60fc5839205f13d6c266d8ad4d160ae37c33f66b130b5640acac66deff84b934ac6307f5dc5e4b30362c51284817c12df7c9746ffb600b9009c581e0b1634 - languageName: node - linkType: hard - "minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -18445,25 +18535,25 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.0.0": - version: 10.0.1 - resolution: "minimatch@npm:10.0.1" +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: "npm:^2.0.1" - checksum: e6c29a81fe83e1877ad51348306be2e8aeca18c88fdee7a99df44322314279e15799e41d7cb274e4e8bb0b451a3bc622d6182e157dfa1717d6cda75e9cd8cd5d + checksum: 3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 languageName: node linkType: hard -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 + checksum: de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed languageName: node linkType: hard -"minimist-options@npm:4.1.0, minimist-options@npm:^4.0.2": +"minimist-options@npm:4.1.0": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" dependencies: @@ -18512,6 +18602,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c + languageName: node + linkType: hard + "minipass-flush@npm:^1.0.5": version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" @@ -18565,14 +18670,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": - version: 7.1.1 - resolution: "minipass@npm:7.1.1" - checksum: fdccc2f99c31083f45f881fd1e6971d798e333e078ab3c8988fb818c470fbd5e935388ad9adb286397eba50baebf46ef8ff487c8d3f455a69c6f3efc327bdff9 - languageName: node - linkType: hard - -"minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 @@ -18598,6 +18696,16 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 + languageName: node + linkType: hard + "mixin-deep@npm:^1.2.0": version: 1.3.2 resolution: "mixin-deep@npm:1.3.2" @@ -18608,13 +18716,6 @@ __metadata: languageName: node linkType: hard -"mixme@npm:^0.5.1": - version: 0.5.10 - resolution: "mixme@npm:0.5.10" - checksum: 409b2124b75b5f489b1521bc470f6201d748499bf656db0aa43a07e654449f3bcc8a0277cd05ca3c3e305281a5934b6e75219866200b70a9e3e105f9cf08baf1 - languageName: node - linkType: hard - "mkdirp-promise@npm:^5.0.1": version: 5.0.1 resolution: "mkdirp-promise@npm:5.0.1" @@ -18624,7 +18725,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:*, mkdirp@npm:^3.0.0": +"mkdirp@npm:*, mkdirp@npm:^3.0.0, mkdirp@npm:^3.0.1": version: 3.0.1 resolution: "mkdirp@npm:3.0.1" bin: @@ -18673,38 +18774,7 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^10.0.0, mocha@npm:^10.2.0": - version: 10.4.0 - resolution: "mocha@npm:10.4.0" - dependencies: - ansi-colors: "npm:4.1.1" - browser-stdout: "npm:1.3.1" - chokidar: "npm:3.5.3" - debug: "npm:4.3.4" - diff: "npm:5.0.0" - escape-string-regexp: "npm:4.0.0" - find-up: "npm:5.0.0" - glob: "npm:8.1.0" - he: "npm:1.2.0" - js-yaml: "npm:4.1.0" - log-symbols: "npm:4.1.0" - minimatch: "npm:5.0.1" - ms: "npm:2.1.3" - serialize-javascript: "npm:6.0.0" - strip-json-comments: "npm:3.1.1" - supports-color: "npm:8.1.1" - workerpool: "npm:6.2.1" - yargs: "npm:16.2.0" - yargs-parser: "npm:20.2.4" - yargs-unparser: "npm:2.0.0" - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: e572e9d8c164e98f64de7e9498608de042fd841c6a7441f456a5e216e9aed2299e2c568d9dc27f2be2de06521e6b2d1dd774ab58a243b1c7697d14aec2f0f7f7 - languageName: node - linkType: hard - -"mocha@npm:^10.8.2": +"mocha@npm:^10.0.0, mocha@npm:^10.2.0, mocha@npm:^10.8.2": version: 10.8.2 resolution: "mocha@npm:10.8.2" dependencies: @@ -18785,11 +18855,11 @@ __metadata: linkType: hard "moment-timezone@npm:^0.5.34, moment-timezone@npm:^0.5.43": - version: 0.5.45 - resolution: "moment-timezone@npm:0.5.45" + version: 0.5.48 + resolution: "moment-timezone@npm:0.5.48" dependencies: moment: "npm:^2.29.4" - checksum: 7497f23c4b8c875dbf07c03f9a1253f79edaeedc29d5732e36bfd3c5577e25aed1924fbd84cbb713ce1920dbe822be0e21bd487851a7d13907226f289a5e568b + checksum: ab14ec9d94bc33f29ac18e5417b7f8aca0b17130b952c5cc9697b8fea839e5ece9313af5fd3c9703a05db472b1560ddbfc7ad2aa24aac9afd047d6da6c3c6033 languageName: node linkType: hard @@ -18813,6 +18883,13 @@ __metadata: languageName: node linkType: hard +"mri@npm:^1.2.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -18820,13 +18897,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - "ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" @@ -19017,11 +19087,11 @@ __metadata: linkType: hard "nan@npm:^2.12.1": - version: 2.19.0 - resolution: "nan@npm:2.19.0" + version: 2.22.2 + resolution: "nan@npm:2.22.2" dependencies: node-gyp: "npm:latest" - checksum: b8d05d75f92ee9d94affa50d0aa41b6c698254c848529452d7ab67c2e0d160a83f563bfe2cbd53e077944eceb48c757f83c93634c7c9ff404c9ec1ed4e5ced1a + checksum: 971f963b8120631880fa47a389c71b00cadc1c1b00ef8f147782a3f4387d4fc8195d0695911272d57438c11562fb27b24c4ae5f8c05d5e4eeb4478ba51bb73c5 languageName: node linkType: hard @@ -19033,11 +19103,11 @@ __metadata: linkType: hard "nanoid@npm:^3.0.2, nanoid@npm:^3.1.3": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + checksum: 40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b languageName: node linkType: hard @@ -19098,13 +19168,27 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 languageName: node linkType: hard +"negotiator@npm:^0.6.3": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -19148,7 +19232,16 @@ __metadata: resolution: "node-addon-api@npm:2.0.2" dependencies: node-gyp: "npm:latest" - checksum: ade6c097ba829fa4aee1ca340117bb7f8f29fdae7b777e343a9d5cbd548481d1f0894b7b907d23ce615c70d932e8f96154caed95c3fa935cfe8cf87546510f64 + checksum: ade6c097ba829fa4aee1ca340117bb7f8f29fdae7b777e343a9d5cbd548481d1f0894b7b907d23ce615c70d932e8f96154caed95c3fa935cfe8cf87546510f64 + languageName: node + linkType: hard + +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d languageName: node linkType: hard @@ -19200,33 +19293,33 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0": - version: 4.8.1 - resolution: "node-gyp-build@npm:4.8.1" + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: e36ca3d2adf2b9cca316695d7687207c19ac6ed326d6d7c68d7112cebe0de4f82d6733dff139132539fcc01cf5761f6c9082a21864ab9172edf84282bc849ce7 + checksum: 444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 languageName: node linkType: hard "node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" + version: 11.1.0 + resolution: "node-gyp@npm:11.1.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c + checksum: c38977ce502f1ea41ba2b8721bd5b49bc3d5b3f813eabfac8414082faf0620ccb5211e15c4daecc23ed9f5e3e9cc4da00e575a0bcfc2a95a069294f2afa1e0cd languageName: node linkType: hard @@ -19237,14 +19330,14 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa languageName: node linkType: hard -"nofilter@npm:^3.1.0": +"nofilter@npm:^3.0.2, nofilter@npm:^3.1.0": version: 3.1.0 resolution: "nofilter@npm:3.1.0" checksum: 92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 @@ -19262,14 +19355,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: "npm:^2.0.0" + abbrev: "npm:^3.0.0" bin: nopt: bin/nopt.js - checksum: a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + checksum: 62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef languageName: node linkType: hard @@ -19334,6 +19427,34 @@ __metadata: languageName: node linkType: hard +"npm-package-arg@npm:^11.0.0": + version: 11.0.3 + resolution: "npm-package-arg@npm:11.0.3" + dependencies: + hosted-git-info: "npm:^7.0.0" + proc-log: "npm:^4.0.0" + semver: "npm:^7.3.5" + validate-npm-package-name: "npm:^5.0.0" + checksum: e18333485e05c3a8774f4b5701ef74f4799533e650b70a68ca8dd697666c9a8d46932cb765fc593edce299521033bd4025a40323d5240cea8a393c784c0c285a + languageName: node + linkType: hard + +"npm-registry-fetch@npm:^17.1.0": + version: 17.1.0 + resolution: "npm-registry-fetch@npm:17.1.0" + dependencies: + "@npmcli/redact": "npm:^2.0.0" + jsonparse: "npm:^1.3.1" + make-fetch-happen: "npm:^13.0.0" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minizlib: "npm:^2.1.2" + npm-package-arg: "npm:^11.0.0" + proc-log: "npm:^4.0.0" + checksum: 3f66214e106609fd2e92704e62ac929cba1424d4013fec50f783afbb81168b0dc14457d35c1716a77e30fc482c3576bdc4e4bc5c84a714cac59cf98f96a17f47 + languageName: node + linkType: hard + "npm-run-path@npm:^2.0.0": version: 2.0.2 resolution: "npm-run-path@npm:2.0.2" @@ -19417,10 +19538,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 languageName: node linkType: hard @@ -19464,19 +19585,21 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" +"object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" object-keys: "npm:^1.1.1" - checksum: 60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 + checksum: 3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc languageName: node linkType: hard -"object.getownpropertydescriptors@npm:^2.1.6": +"object.getownpropertydescriptors@npm:^2.1.8": version: 2.1.8 resolution: "object.getownpropertydescriptors@npm:2.1.8" dependencies: @@ -19511,9 +19634,9 @@ __metadata: linkType: hard "obliterator@npm:^2.0.0": - version: 2.0.4 - resolution: "obliterator@npm:2.0.4" - checksum: ff2c10d4de7d62cd1d588b4d18dfc42f246c9e3a259f60d5716f7f88e5b3a3f79856b3207db96ec9a836a01d0958a21c15afa62a3f4e73a1e0b75f2c2f6bab40 + version: 2.0.5 + resolution: "obliterator@npm:2.0.5" + checksum: 36e67d88271c51aa6412a7d449d6c60ae6387176f94dbc557eea67456bf6ccedbcbcecdb1e56438aa4f4694f68f531b3bf2be87b019e2f69961b144bec124e70 languageName: node linkType: hard @@ -19603,6 +19726,15 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^7.0.0": + version: 7.0.0 + resolution: "onetime@npm:7.0.0" + dependencies: + mimic-function: "npm:^5.0.0" + checksum: 5cb9179d74b63f52a196a2e7037ba2b9a893245a5532d3f44360012005c9cadb60851d56716ebff18a6f47129dab7168022445df47c2aff3b276d92585ed1221 + languageName: node + linkType: hard + "open@npm:^7.4.2": version: 7.4.2 resolution: "open@npm:7.4.2" @@ -19724,6 +19856,17 @@ __metadata: languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a + languageName: node + linkType: hard + "p-cancelable@npm:^1.0.0": version: 1.1.0 resolution: "p-cancelable@npm:1.1.0" @@ -19848,6 +19991,13 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + "p-queue@npm:^6.6.1, p-queue@npm:^6.6.2": version: 6.6.2 resolution: "p-queue@npm:6.6.2" @@ -19900,6 +20050,15 @@ __metadata: languageName: node linkType: hard +"package-manager-detector@npm:^0.2.0": + version: 0.2.11 + resolution: "package-manager-detector@npm:0.2.11" + dependencies: + quansync: "npm:^0.2.7" + checksum: 247991de461b9e731f3463b7dae9ce187e53095b7b94d7d96eec039abf418b61ccf74464bec1d0c11d97311f33472e77baccd4c5898f77358da4b5b33395e0b1 + languageName: node + linkType: hard + "packet-reader@npm:1.0.0": version: 1.0.0 resolution: "packet-reader@npm:1.0.0" @@ -19978,9 +20137,9 @@ __metadata: linkType: hard "parse-headers@npm:^2.0.0": - version: 2.0.5 - resolution: "parse-headers@npm:2.0.5" - checksum: 950d75034f46be8b77c491754aefa61b32954e675200d9247ec60b2acaf85c0cc053c44e44b35feed9034a34cc696a5b6fda693b5a0b23daf3294959dd216124 + version: 2.0.6 + resolution: "parse-headers@npm:2.0.6" + checksum: 3040ca567f7ceb9b80ffb353401c91c35761365052e30b6795328e78ab549a5fab22be24cbdbb60243500175918fe40812c43b32f689ad775e1c67ba7ba303e9 languageName: node linkType: hard @@ -20173,7 +20332,7 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.11.0": +"path-scurry@npm:^1.11.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" dependencies: @@ -20200,6 +20359,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -20269,9 +20435,9 @@ __metadata: linkType: hard "pg-connection-string@npm:^2.5.0, pg-connection-string@npm:^2.6.1, pg-connection-string@npm:^2.6.2": - version: 2.6.4 - resolution: "pg-connection-string@npm:2.6.4" - checksum: 0d0b617df0fc6507bf6a94bdcd56c7a305788a1402d69bff9773350947c8f525d6d8136128065370749a3325e99658ae40fbdcce620fb8e60126181f0591a6a6 + version: 2.7.0 + resolution: "pg-connection-string@npm:2.7.0" + checksum: 50a1496a1c858f9495d78a2c7a66d93ef3602e718aff2953bb5738f3ea616d7f727f32fc20513c9bed127650cd14c1ddc7b458396f4000e689d4b64c65c5c51e languageName: node linkType: hard @@ -20292,18 +20458,18 @@ __metadata: linkType: hard "pg-pool@npm:^3.5.1, pg-pool@npm:^3.6.1": - version: 3.6.2 - resolution: "pg-pool@npm:3.6.2" + version: 3.8.0 + resolution: "pg-pool@npm:3.8.0" peerDependencies: pg: ">=8.0" - checksum: 14c524549490954b5e48457a4b808df8f619f6deeb3b395b0cd184a8f4ed65a9273fe0697ba0341a41d6745af197f1437eb1cf51fff0cbbf5b0fb3852ebe5392 + checksum: c05287b0caafeab43807e6ad22d153c09c473dbeb5b2cea13b83102376e9a56f46b91fa9adf9d53885ce198280c6a95555390987c42b3858d1936d3e0cdc83aa languageName: node linkType: hard "pg-protocol@npm:^1.5.0, pg-protocol@npm:^1.6.0": - version: 1.6.1 - resolution: "pg-protocol@npm:1.6.1" - checksum: 7eadef4010ac0a3925c460be7332ca4098a5c6d5181725a62193fcfa800000ae6632d98d814f3989b42cf5fdc3b45e34c714a1959d29174e81e30730e140ae5f + version: 1.8.0 + resolution: "pg-protocol@npm:1.8.0" + checksum: 2be784955599d84b564795952cee52cc2b8eab0be43f74fc1061506353801e282c1d52c9e0691a9b72092c1f3fde370e9b181e80fef6bb82a9b8d1618bfa91e6 languageName: node linkType: hard @@ -20373,14 +20539,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 - languageName: node - linkType: hard - -"picocolors@npm:^1.1.0": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 @@ -20401,21 +20560,21 @@ __metadata: languageName: node linkType: hard -"pidtree@npm:0.6.0": - version: 0.6.0 - resolution: "pidtree@npm:0.6.0" +"pidtree@npm:^0.5.0": + version: 0.5.0 + resolution: "pidtree@npm:0.5.0" bin: pidtree: bin/pidtree.js - checksum: 0829ec4e9209e230f74ebf4265f5ccc9ebfb488334b525cb13f86ff801dca44b362c41252cd43ae4d7653a10a5c6ab3be39d2c79064d6895e0d78dc50a5ed6e9 + checksum: 4004b1c7429d02be941ad7ca2eac3bd93afa5cd59119633113013a33de52d76887de09a06a81943475bc1de3efe0a639515a5fee314f5ba074e6d849499e4b4f languageName: node linkType: hard -"pidtree@npm:^0.5.0": - version: 0.5.0 - resolution: "pidtree@npm:0.5.0" +"pidtree@npm:^0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" bin: pidtree: bin/pidtree.js - checksum: 4004b1c7429d02be941ad7ca2eac3bd93afa5cd59119633113013a33de52d76887de09a06a81943475bc1de3efe0a639515a5fee314f5ba074e6d849499e4b4f + checksum: 0829ec4e9209e230f74ebf4265f5ccc9ebfb488334b525cb13f86ff801dca44b362c41252cd43ae4d7653a10a5c6ab3be39d2c79064d6895e0d78dc50a5ed6e9 languageName: node linkType: hard @@ -20516,15 +20675,6 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: "npm:^4.0.0" - checksum: c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 - languageName: node - linkType: hard - "please-upgrade-node@npm:^3.2.0": version: 3.2.0 resolution: "please-upgrade-node@npm:3.2.0" @@ -20549,9 +20699,9 @@ __metadata: linkType: hard "possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 languageName: node linkType: hard @@ -20599,18 +20749,6 @@ __metadata: languageName: node linkType: hard -"preferred-pm@npm:^3.0.0": - version: 3.1.3 - resolution: "preferred-pm@npm:3.1.3" - dependencies: - find-up: "npm:^5.0.0" - find-yarn-workspace-root2: "npm:1.2.16" - path-exists: "npm:^4.0.0" - which-pm: "npm:2.0.0" - checksum: 8eb9c35e4818d8e20b5b61a2117f5c77678649e1d20492fe4fdae054a9c4b930d04582b17e8a59b2dc923f2f788c7ded7fc99fd22c04631d836f7f52aeb79bde - languageName: node - linkType: hard - "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -20649,15 +20787,14 @@ __metadata: linkType: hard "prettier-plugin-solidity@npm:^1.0.0-alpha.56, prettier-plugin-solidity@npm:^1.3.1": - version: 1.3.1 - resolution: "prettier-plugin-solidity@npm:1.3.1" + version: 1.4.2 + resolution: "prettier-plugin-solidity@npm:1.4.2" dependencies: - "@solidity-parser/parser": "npm:^0.17.0" - semver: "npm:^7.5.4" - solidity-comments-extractor: "npm:^0.0.8" + "@solidity-parser/parser": "npm:^0.19.0" + semver: "npm:^7.6.3" peerDependencies: prettier: ">=2.3.0" - checksum: 6c83bec93a12a172aeae360bca571ffba5659a679d24d9a4905c4cae9f237a2a3c544a78f5efb7f2cd086733e114ed9e031d448799ca7b9f574e8fc07b94323a + checksum: 318bbdd2c461a604c156c457b7e7b9685c5c507466f7ef4154820b79f25150cbddd57c030641da9c940eb7ef19e3ca550b41912f737f49e375f906e9da81c5a7 languageName: node linkType: hard @@ -20671,11 +20808,11 @@ __metadata: linkType: hard "prettier@npm:^3.0.3, prettier@npm:^3.2.5": - version: 3.2.5 - resolution: "prettier@npm:3.2.5" + version: 3.5.3 + resolution: "prettier@npm:3.5.3" bin: prettier: bin/prettier.cjs - checksum: ea327f37a7d46f2324a34ad35292af2ad4c4c3c3355da07313339d7e554320f66f65f91e856add8530157a733c6c4a897dc41b577056be5c24c40f739f5ee8c6 + checksum: 3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 languageName: node linkType: hard @@ -20686,20 +20823,20 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc - languageName: node - linkType: hard - -"proc-log@npm:^4.2.0": +"proc-log@npm:^4.0.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" checksum: 17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 languageName: node linkType: hard +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -20865,9 +21002,11 @@ __metadata: linkType: hard "psl@npm:^1.1.28": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 6a3f805fdab9442f44de4ba23880c4eba26b20c8e8e0830eff1cb31007f6825dace61d17203c58bfe36946842140c97a1ba7f67bc63ca2d88a7ee052b65d97ab + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: d8d45a99e4ca62ca12ac3c373e63d80d2368d38892daa40cfddaa1eb908be98cd549ac059783ef3a56cfd96d57ae8e2fd9ae53d1378d90d42bc661ff924e102a languageName: node linkType: hard @@ -20948,12 +21087,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.2 + resolution: "pump@npm:3.0.2" dependencies: end-of-stream: "npm:^1.1.0" once: "npm:^1.3.1" - checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + checksum: 5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f languageName: node linkType: hard @@ -20982,19 +21121,19 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard -"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5": - version: 1.3.5 - resolution: "pvtsutils@npm:1.3.5" +"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5, pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" dependencies: - tslib: "npm:^2.6.1" - checksum: d425aed316907e0b447a459bfb97c55d22270c3cfdba5a07ec90da0737b0e40f4f1771a444636f85bb6a453de90ff8c6b5f4f6ddba7597977166af49974b4534 + tslib: "npm:^2.8.1" + checksum: b1b42646370505ccae536dcffa662303b2c553995211330c8e39dec9ab8c197585d7751c2c5b9ab2f186feda0219d9bb23c34ee1e565573be96450f79d89a13c languageName: node linkType: hard @@ -21021,6 +21160,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + "qs@npm:6.9.6": version: 6.9.6 resolution: "qs@npm:6.9.6" @@ -21035,12 +21183,12 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.11.2, qs@npm:^6.4.0, qs@npm:^6.7.0, qs@npm:^6.9.4": - version: 6.12.1 - resolution: "qs@npm:6.12.1" +"qs@npm:^6.12.3, qs@npm:^6.4.0, qs@npm:^6.7.0, qs@npm:^6.9.4": + version: 6.14.0 + resolution: "qs@npm:6.14.0" dependencies: - side-channel: "npm:^1.0.6" - checksum: 439e6d7c6583e7c69f2cab2c39c55b97db7ce576e4c7c469082b938b7fc8746e8d547baacb69b4cd2b6666484776c3f4840ad7163a4c5326300b0afa0acdd84b + side-channel: "npm:^1.1.0" + checksum: 8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c languageName: node linkType: hard @@ -21051,6 +21199,13 @@ __metadata: languageName: node linkType: hard +"quansync@npm:^0.2.7": + version: 0.2.10 + resolution: "quansync@npm:0.2.10" + checksum: f86f1d644f812a3a7c42de79eb401c47a5a67af82a9adff8a8afb159325e03e00f77cebbf42af6340a0bd47bd0c1fbe999e7caf7e1bbb30d7acb00c8729b7530 + languageName: node + linkType: hard + "query-string@npm:^5.0.1": version: 5.1.1 resolution: "query-string@npm:5.1.1" @@ -21268,7 +21423,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -21330,9 +21485,9 @@ __metadata: linkType: hard "readdirp@npm:^4.0.1": - version: 4.0.2 - resolution: "readdirp@npm:4.0.2" - checksum: a16ecd8ef3286dcd90648c3b103e3826db2b766cdb4a988752c43a83f683d01c7059158d623cbcd8bdfb39e65d302d285be2d208e7d9f34d022d912b929217dd + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 languageName: node linkType: hard @@ -21396,6 +21551,22 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac + languageName: node + linkType: hard + "regenerate@npm:^1.2.1": version: 1.4.2 resolution: "regenerate@npm:1.4.2" @@ -21447,15 +21618,17 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: "npm:^1.0.6" + call-bind: "npm:^1.0.8" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 languageName: node linkType: hard @@ -21471,11 +21644,11 @@ __metadata: linkType: hard "registry-auth-token@npm:^5.0.1": - version: 5.0.2 - resolution: "registry-auth-token@npm:5.0.2" + version: 5.1.0 + resolution: "registry-auth-token@npm:5.1.0" dependencies: "@pnpm/npm-conf": "npm:^2.1.0" - checksum: 20fc2225681cc54ae7304b31ebad5a708063b1949593f02dfe5fb402bc1fc28890cecec6497ea396ba86d6cca8a8480715926dfef8cf1f2f11e6f6cc0a1b4bde + checksum: 316229bd8a4acc29a362a7a3862ff809e608256f0fd9e0b133412b43d6a9ea18743756a0ec5ee1467a5384e1023602b85461b3d88d1336b11879e42f7cf02c12 languageName: node linkType: hard @@ -21784,13 +21957,13 @@ __metadata: languageName: node linkType: hard -"restore-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "restore-cursor@npm:4.0.0" +"restore-cursor@npm:^5.0.0": + version: 5.1.0 + resolution: "restore-cursor@npm:5.1.0" dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 6f7da8c5e422ac26aa38354870b1afac09963572cf2879443540449068cb43476e9cbccf6f8de3e0171e0d6f7f533c2bc1a0a008003c9a525bbc098e89041318 + onetime: "npm:^7.0.0" + signal-exit: "npm:^4.1.0" + checksum: c2ba89131eea791d1b25205bdfdc86699767e2b88dee2a590b1a6caa51737deac8bad0260a5ded2f7c074b7db2f3a626bcf1fcf3cdf35974cbeea5e2e6764f60 languageName: node linkType: hard @@ -21809,9 +21982,9 @@ __metadata: linkType: hard "retry-as-promised@npm:^7.0.4": - version: 7.0.4 - resolution: "retry-as-promised@npm:7.0.4" - checksum: 3cfe4924c80cfc0a55b3af10010941a76832ec949f01c732cb6678b9411919a3eeff0586199fb274d3c3082e215065c6555268c8345cb22e432753b62eb65bd8 + version: 7.1.1 + resolution: "retry-as-promised@npm:7.1.1" + checksum: d0f8477d0e5e3c979947824ea415ea622c4a9f423d6f2d2c421182243085c8aaf4686efcaccb4573a7f6bf4b094d9ee39d239f20b9e31ed601dd489ea3713198 languageName: node linkType: hard @@ -21830,16 +22003,16 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa languageName: node linkType: hard -"rfdc@npm:^1.2.0, rfdc@npm:^1.3.0": - version: 1.3.1 - resolution: "rfdc@npm:1.3.1" - checksum: 69f65e3ed30970f8055fac9fbbef9ce578800ca19554eab1dcbffe73a4b8aef536bc4248313889cf25e3b4e38b212c721eabe30856575bf2b2bc3d90f8ba93ef +"rfdc@npm:^1.2.0, rfdc@npm:^1.3.0, rfdc@npm:^1.4.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 languageName: node linkType: hard @@ -21865,14 +22038,14 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^5.0.0": - version: 5.0.7 - resolution: "rimraf@npm:5.0.7" +"rimraf@npm:^5.0.0, rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" dependencies: glob: "npm:^10.3.7" bin: rimraf: dist/esm/bin.mjs - checksum: bd6dbfaa98ae34ce1e54d1e06045d2d63e8859d9a1979bb4a4628b652b459a2d17b17dc20ee072b034bd2d09bd691e801d24c4d9cfe94e16fdbcc8470a1d4807 + checksum: 7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc languageName: node linkType: hard @@ -21950,23 +22123,24 @@ __metadata: linkType: hard "rxjs@npm:^7.2.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" dependencies: tslib: "npm:^2.1.0" - checksum: 3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + checksum: 1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 languageName: node linkType: hard -"safe-array-concat@npm:^1.0.0, safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" +"safe-array-concat@npm:^1.1.2, safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - has-symbols: "npm:^1.0.3" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" isarray: "npm:^2.0.5" - checksum: 12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 + checksum: 43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d languageName: node linkType: hard @@ -21993,14 +22167,24 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.6" es-errors: "npm:^1.3.0" - is-regex: "npm:^1.1.4" - checksum: 900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 + isarray: "npm:^2.0.5" + checksum: 831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 languageName: node linkType: hard @@ -22014,9 +22198,9 @@ __metadata: linkType: hard "safe-stable-stringify@npm:^2.1.0, safe-stable-stringify@npm:^2.3.1": - version: 2.4.3 - resolution: "safe-stable-stringify@npm:2.4.3" - checksum: 81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 languageName: node linkType: hard @@ -22075,14 +22259,14 @@ __metadata: linkType: hard "secp256k1@npm:^4.0.1": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" + version: 4.0.4 + resolution: "secp256k1@npm:4.0.4" dependencies: - elliptic: "npm:^6.5.4" - node-addon-api: "npm:^2.0.0" + elliptic: "npm:^6.5.7" + node-addon-api: "npm:^5.0.0" node-gyp: "npm:latest" node-gyp-build: "npm:^4.2.0" - checksum: de0a0e525a6f8eb2daf199b338f0797dbfe5392874285a145bb005a72cabacb9d42c0197d0de129a1a0f6094d2cc4504d1f87acb6a8bbfb7770d4293f252c401 + checksum: cf7a74343566d4774c64332c07fc2caf983c80507f63be5c653ff2205242143d6320c50ee4d793e2b714a56540a79e65a8f0056e343b25b0cdfed878bc473fd8 languageName: node linkType: hard @@ -22147,12 +22331,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": - version: 7.6.2 - resolution: "semver@npm:7.6.2" +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.7.1 + resolution: "semver@npm:7.7.1" bin: semver: bin/semver.js - checksum: 97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c + checksum: fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 languageName: node linkType: hard @@ -22207,6 +22391,27 @@ __metadata: languageName: node linkType: hard +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + "sentence-case@npm:^3.0.4": version: 3.0.4 resolution: "sentence-case@npm:3.0.4" @@ -22309,15 +22514,6 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:6.0.0": - version: 6.0.0 - resolution: "serialize-javascript@npm:6.0.0" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 73104922ef0a919064346eea21caab99de1a019a1f5fb54a7daa7fcabc39e83b387a2a363e52a889598c3b1bcf507c4b2a7b26df76e991a310657af20eea2e7c - languageName: node - linkType: hard - "serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" @@ -22351,6 +22547,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f + languageName: node + linkType: hard + "servify@npm:^0.1.12": version: 0.1.12 resolution: "servify@npm:0.1.12" @@ -22371,7 +22579,7 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": +"set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -22385,7 +22593,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -22404,6 +22612,17 @@ __metadata: languageName: node linkType: hard +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + "set-value@npm:^2.0.0, set-value@npm:^2.0.1": version: 2.0.1 resolution: "set-value@npm:2.0.1" @@ -22504,15 +22723,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.7" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + object-inspect: "npm:^1.13.3" + checksum: 644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 languageName: node linkType: hard @@ -22640,7 +22895,7 @@ __metadata: languageName: node linkType: hard -"slice-ansi@npm:^7.0.0": +"slice-ansi@npm:^7.1.0": version: 7.1.0 resolution: "slice-ansi@npm:7.1.0" dependencies: @@ -22657,22 +22912,6 @@ __metadata: languageName: node linkType: hard -"smartwrap@npm:^2.0.2": - version: 2.0.2 - resolution: "smartwrap@npm:2.0.2" - dependencies: - array.prototype.flat: "npm:^1.2.3" - breakword: "npm:^1.0.5" - grapheme-splitter: "npm:^1.0.4" - strip-ansi: "npm:^6.0.0" - wcwidth: "npm:^1.0.1" - yargs: "npm:^15.1.0" - bin: - smartwrap: src/terminal-adapter.js - checksum: ea104632a832967a04cb739253dbd7d2e194c62bae1c3366d03bb5827870b83842a3e25a7f80287a4b04484ea4f64b51a0657389fc6a6fe701db3b25319ed56f - languageName: node - linkType: hard - "snake-case@npm:^3.0.4": version: 3.0.4 resolution: "snake-case@npm:3.0.4" @@ -22720,23 +22959,23 @@ __metadata: linkType: hard "socks-proxy-agent@npm:^8.0.3": - version: 8.0.3 - resolution: "socks-proxy-agent@npm:8.0.3" + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^7.1.1" + agent-base: "npm:^7.1.2" debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d + socks: "npm:^2.8.3" + checksum: 5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 languageName: node linkType: hard -"socks@npm:^2.7.1": - version: 2.8.3 - resolution: "socks@npm:2.8.3" +"socks@npm:^2.8.3": + version: 2.8.4 + resolution: "socks@npm:2.8.4" dependencies: ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + checksum: 00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 languageName: node linkType: hard @@ -22955,18 +23194,9 @@ __metadata: linkType: hard "solidity-ast@npm:^0.4.38, solidity-ast@npm:^0.4.51": - version: 0.4.56 - resolution: "solidity-ast@npm:0.4.56" - dependencies: - array.prototype.findlast: "npm:^1.2.2" - checksum: 6e10e58ddae8c7a9e53551bc61b673963c6671cac12050fa77575caff1ecc6a58440af8b7d85755fdda7e02d0516e2dcd3a5a976bd91a865375274163281d160 - languageName: node - linkType: hard - -"solidity-comments-extractor@npm:^0.0.8": - version: 0.0.8 - resolution: "solidity-comments-extractor@npm:0.0.8" - checksum: 86e56bdfc90b3af3a5e244a2b5e215db78b12b6045d68699ecb2304326edb906c1b083c0e1a074cde77e9e8cdeb978ae5ef8666d821bef83db89c2708a8b6192 + version: 0.4.60 + resolution: "solidity-ast@npm:0.4.60" + checksum: 941475435e7da7696b1e8cbbc42c515f21ba614dd2fe8b5f7c180b0e3de4acb24361b57925cfa112d273a4763986a7efd092f2123e83fd198f2e1eff31d10538 languageName: node linkType: hard @@ -22999,11 +23229,11 @@ __metadata: linkType: hard "solidity-coverage@npm:^0.8.0": - version: 0.8.12 - resolution: "solidity-coverage@npm:0.8.12" + version: 0.8.14 + resolution: "solidity-coverage@npm:0.8.14" dependencies: "@ethersproject/abi": "npm:^5.0.9" - "@solidity-parser/parser": "npm:^0.18.0" + "@solidity-parser/parser": "npm:^0.19.0" chalk: "npm:^2.4.2" death: "npm:^1.1.0" difflib: "npm:^0.2.4" @@ -23025,7 +23255,7 @@ __metadata: hardhat: ^2.11.0 bin: solidity-coverage: plugins/bin.js - checksum: 500de00ca5d0ff9531bcfc54040591e90bb281714c5ad810bc6aa77bb6ab696f15a141f6bcb1a47547dca68d10e717e1705741d4cf660d7dce8700fa97e6bfaf + checksum: 7a971d3c5bee6aff341188720a72c7544521c1afbde36593e4933ba230d46530ece1db8e6394d6283a13918fd7f05ab37a0d75e6a0a52d965a2fdff672d3a7a6 languageName: node linkType: hard @@ -23144,13 +23374,13 @@ __metadata: languageName: node linkType: hard -"spawndamnit@npm:^2.0.0": - version: 2.0.0 - resolution: "spawndamnit@npm:2.0.0" +"spawndamnit@npm:^3.0.1": + version: 3.0.1 + resolution: "spawndamnit@npm:3.0.1" dependencies: - cross-spawn: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 3d3aa1b750130a78cad591828c203e706cb132fbd7dccab8ae5354984117cd1464c7f9ef6c4756e6590fec16bab77fe2c85d1eb8e59006d303836007922d359c + cross-spawn: "npm:^7.0.5" + signal-exit: "npm:^4.0.1" + checksum: a9821a59bc78a665bd44718dea8f4f4010bb1a374972b0a6a1633b9186cda6d6fd93f22d1e49d9944d6bb175ba23ce29036a4bd624884fb157d981842c3682f3 languageName: node linkType: hard @@ -23182,9 +23412,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.17 - resolution: "spdx-license-ids@npm:3.0.17" - checksum: ddf9477b5afc70f1a7d3bf91f0b8e8a1c1b0fa65d2d9a8b5c991b1a2ba91b693d8b9749700119d5ce7f3fbf307ac421087ff43d321db472605e98a5804f80eac + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 languageName: node linkType: hard @@ -23273,6 +23503,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + "stable@npm:^0.1.8": version: 0.1.8 resolution: "stable@npm:0.1.8" @@ -23288,11 +23527,11 @@ __metadata: linkType: hard "stacktrace-parser@npm:^0.1.10": - version: 0.1.10 - resolution: "stacktrace-parser@npm:0.1.10" + version: 0.1.11 + resolution: "stacktrace-parser@npm:0.1.11" dependencies: type-fest: "npm:^0.7.1" - checksum: f9c9cd55b0642a546e5f0516a87124fc496dcc2c082b96b156ed094c51e423314795cd1839cd4c59026349cf392d3414f54fc42165255602728588a58a9f72d3 + checksum: 4633d9afe8cd2f6c7fb2cebdee3cc8de7fd5f6f9736645fd08c0f66872a303061ce9cc0ccf46f4216dc94a7941b56e331012398dc0024dc25e46b5eb5d4ff018 languageName: node linkType: hard @@ -23340,18 +23579,9 @@ __metadata: version: 1.7.3 resolution: "stream-to-pull-stream@npm:1.7.3" dependencies: - looper: "npm:^3.0.0" - pull-stream: "npm:^3.2.3" - checksum: 7deab5bdf3d352a2c1b5e0515a579a27d1e9e0f1791194126efaa84162dcb731ed9b5dcdf3d84717700e9de7fae9b7503539881eb87fab9263387b3a5ed08256 - languageName: node - linkType: hard - -"stream-transform@npm:^2.1.3": - version: 2.1.3 - resolution: "stream-transform@npm:2.1.3" - dependencies: - mixme: "npm:^0.5.1" - checksum: 8a4b40e1ee952869358c12bbb3da3aa9ca30c8964f8f8eef2058a3b6b2202d7a856657ef458a5f2402a464310d177f92d2e4a119667854fce4b17c05e3c180bd + looper: "npm:^3.0.0" + pull-stream: "npm:^3.2.3" + checksum: 7deab5bdf3d352a2c1b5e0515a579a27d1e9e0f1791194126efaa84162dcb731ed9b5dcdf3d84717700e9de7fae9b7503539881eb87fab9263387b3a5ed08256 languageName: node linkType: hard @@ -23376,7 +23606,7 @@ __metadata: languageName: node linkType: hard -"string-argv@npm:0.3.2, string-argv@npm:^0.3.1": +"string-argv@npm:^0.3.1, string-argv@npm:^0.3.2": version: 0.3.2 resolution: "string-argv@npm:0.3.2" checksum: 75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 @@ -23434,36 +23664,40 @@ __metadata: linkType: hard "string-width@npm:^7.0.0": - version: 7.1.0 - resolution: "string-width@npm:7.1.0" + version: 7.2.0 + resolution: "string-width@npm:7.2.0" dependencies: emoji-regex: "npm:^10.3.0" get-east-asian-width: "npm:^1.0.0" strip-ansi: "npm:^7.1.0" - checksum: 68a99fbc3bd3d8eb42886ff38dce819767dee55f606f74dfa4687a07dfd21262745d9683df0aa53bf81a5dd47c13da921a501925b974bec66a7ddd634fef0634 + checksum: eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.9, string.prototype.trim@npm:~1.2.8": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" +"string.prototype.trim@npm:^1.2.10, string.prototype.trim@npm:~1.2.8": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.0" + es-abstract: "npm:^1.23.5" es-object-atoms: "npm:^1.0.0" - checksum: dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 + has-property-descriptors: "npm:^1.0.2" + checksum: 8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" define-properties: "npm:^1.2.1" es-object-atoms: "npm:^1.0.0" - checksum: 0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c + checksum: 59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 languageName: node linkType: hard @@ -23614,7 +23848,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd @@ -23637,15 +23871,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:8.1.1, supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 - languageName: node - linkType: hard - "supports-color@npm:^2.0.0": version: 2.0.0 resolution: "supports-color@npm:2.0.0" @@ -23680,6 +23905,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + "supports-color@npm:^9.2.2": version: 9.4.0 resolution: "supports-color@npm:9.4.0" @@ -23742,13 +23976,13 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.8.6": - version: 0.8.8 - resolution: "synckit@npm:0.8.8" +"synckit@npm:^0.10.2": + version: 0.10.3 + resolution: "synckit@npm:0.10.3" dependencies: - "@pkgr/core": "npm:^0.1.0" - tslib: "npm:^2.6.2" - checksum: c3d3aa8e284f3f84f2f868b960c9f49239b364e35f6d20825a448449a3e9c8f49fe36cdd5196b30615682f007830d46f2ea354003954c7336723cb821e4b6519 + "@pkgr/core": "npm:^0.2.0" + tslib: "npm:^2.8.1" + checksum: 9855d10231ae9b69c3aa08d46c96bd4befdcac33da44e29fb80e5c1430e453b5a33b8c073cdd25cfe9578f1d625c7d60c394ece1e202237116c1484def614041 languageName: node linkType: hard @@ -23765,15 +23999,15 @@ __metadata: linkType: hard "table@npm:^6.8.0, table@npm:^6.8.1": - version: 6.8.2 - resolution: "table@npm:6.8.2" + version: 6.9.0 + resolution: "table@npm:6.9.0" dependencies: ajv: "npm:^8.0.1" lodash.truncate: "npm:^4.4.2" slice-ansi: "npm:^4.0.0" string-width: "npm:^4.2.3" strip-ansi: "npm:^6.0.1" - checksum: f8b348af38ee34e419d8ce7306ba00671ce6f20e861ccff22555f491ba264e8416086063ce278a8d81abfa8d23b736ec2cca7ac4029b5472f63daa4b4688b803 + checksum: 35646185712bb65985fbae5975dda46696325844b78735f95faefae83e86df0a265277819a3e67d189de6e858c509b54e66ca3958ffd51bde56ef1118d455bf4 languageName: node linkType: hard @@ -23818,7 +24052,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": +"tar@npm:^6.1.11": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -23832,6 +24066,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + "tdigest@npm:^0.1.1": version: 0.1.2 resolution: "tdigest@npm:0.1.2" @@ -23841,31 +24089,6 @@ __metadata: languageName: node linkType: hard -"tenderly@npm:^0.6.0": - version: 0.6.0 - resolution: "tenderly@npm:0.6.0" - dependencies: - axios: "npm:^0.27.2" - cli-table3: "npm:^0.6.2" - commander: "npm:^9.4.0" - express: "npm:^4.18.1" - hyperlinker: "npm:^1.0.0" - js-yaml: "npm:^4.1.0" - open: "npm:^8.4.0" - prompts: "npm:^2.4.2" - tslog: "npm:^4.4.0" - peerDependencies: - ts-node: "*" - typescript: "*" - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - checksum: bfd3166be0598e4073e6b3fae046a2397b7177210ea6320ee94e0ca2742e3e4f20fb855c381fa9ecdcc7bed9307d7fe5885d72be1b8056c9fb79dbc0c186bb7e - languageName: node - linkType: hard - "term-size@npm:^2.1.0": version: 2.2.1 resolution: "term-size@npm:2.2.1" @@ -24006,12 +24229,12 @@ __metadata: linkType: hard "tinyglobby@npm:^0.2.6": - version: 0.2.10 - resolution: "tinyglobby@npm:0.2.10" + version: 0.2.12 + resolution: "tinyglobby@npm:0.2.12" dependencies: - fdir: "npm:^6.4.2" + fdir: "npm:^6.4.3" picomatch: "npm:^4.0.2" - checksum: ce946135d39b8c0e394e488ad59f4092e8c4ecd675ef1bcd4585c47de1b325e61ec6adfbfbe20c3c2bfa6fd674c5b06de2a2e65c433f752ae170aff11793e5ef + checksum: 7c9be4fd3625630e262dcb19015302aad3b4ba7fc620f269313e688f2161ea8724d6cb4444baab5ef2826eb6bed72647b169a33ec8eea37501832a2526ff540f languageName: node linkType: hard @@ -24049,13 +24272,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - "to-object-path@npm:^0.3.0": version: 0.3.0 resolution: "to-object-path@npm:0.3.0" @@ -24178,11 +24394,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" + version: 1.4.3 + resolution: "ts-api-utils@npm:1.4.3" peerDependencies: typescript: ">=4.2.0" - checksum: f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c + checksum: e65dc6e7e8141140c23e1dc94984bf995d4f6801919c71d6dc27cf0cd51b100a91ffcfe5217626193e5bea9d46831e8586febdc7e172df3f1091a7384299e23a languageName: node linkType: hard @@ -24313,13 +24529,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.4.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: eb19bda3ae545b03caea6a244b34593468e23d53b26bf8649fbc20fce43e9b21a71127fd6d2b9662c0fe48ee6ff668ead48fd00d3b88b2b716b1c12edae25b5d - languageName: node - linkType: hard - "tslib@npm:2.7.0": version: 2.7.0 resolution: "tslib@npm:2.7.0" @@ -24334,10 +24543,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.2, tslib@npm:^2.7.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 languageName: node linkType: hard @@ -24356,9 +24565,9 @@ __metadata: linkType: hard "tslog@npm:^4.3.1, tslog@npm:^4.4.0": - version: 4.9.2 - resolution: "tslog@npm:4.9.2" - checksum: e53f139c140d0a5a8b9e10356e04451a07f7af20e7c02f71cdf6b490cde1b07d241ed4f12ed667e2c2a9c4599f90e3770135c3fd7edd0cc6554944be2785dca2 + version: 4.9.3 + resolution: "tslog@npm:4.9.3" + checksum: 9db2c02b01be44a97e447061958565ceb8faf33a241cf9c030d5f1ebefff74434b66090985f5a75189a514aae2267999851c281b8cd8dc8cd93dd158b1033319 languageName: node linkType: hard @@ -24369,23 +24578,6 @@ __metadata: languageName: node linkType: hard -"tty-table@npm:^4.1.5": - version: 4.2.3 - resolution: "tty-table@npm:4.2.3" - dependencies: - chalk: "npm:^4.1.2" - csv: "npm:^5.5.3" - kleur: "npm:^4.1.5" - smartwrap: "npm:^2.0.2" - strip-ansi: "npm:^6.0.1" - wcwidth: "npm:^1.0.1" - yargs: "npm:^17.7.1" - bin: - tty-table: adapters/terminal-adapter.js - checksum: 408b75693a2b0bae8cd27940c42d9cd29539deb01d90314e708f34f49c80697a3bf55bf5573f02a8aa6dc3ddee78b9e1bcf9ae986d1ec77896ae1d0bd5efb071 - languageName: node - linkType: hard - "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -24434,27 +24626,13 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd - languageName: node - linkType: hard - -"type-detect@npm:^4.1.0": +"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5, type-detect@npm:^4.1.0": version: 4.1.0 resolution: "type-detect@npm:4.1.0" checksum: df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a languageName: node linkType: hard -"type-fest@npm:^0.13.1": - version: 0.13.1 - resolution: "type-fest@npm:0.13.1" - checksum: 0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b - languageName: node - linkType: hard - "type-fest@npm:^0.18.0": version: 0.18.1 resolution: "type-fest@npm:0.18.1" @@ -24508,9 +24686,9 @@ __metadata: linkType: hard "type@npm:^2.7.2": - version: 2.7.2 - resolution: "type@npm:2.7.2" - checksum: 84c2382788fe24e0bc3d64c0c181820048f672b0f06316aa9c7bdb373f8a09f8b5404f4e856bc4539fb931f2f08f2adc4c53f6c08c9c0314505d70c29a1289e1 + version: 2.7.3 + resolution: "type@npm:2.7.3" + checksum: dec6902c2c42fcb86e3adf8cdabdf80e5ef9de280872b5fd547351e9cca2fe58dd2aa6d2547626ddff174145db272f62d95c7aa7038e27c11315657d781a688d languageName: node linkType: hard @@ -24597,55 +24775,56 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.7" + call-bound: "npm:^1.0.3" es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.13" - checksum: 9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da + is-typed-array: "npm:^1.1.14" + checksum: 1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: fcebeffb2436c9f355e91bd19e2368273b88c11d1acc0948a2a306792f1ab672bce4cfe524ab9f51a0505c9d7cd1c98eff4235c4f6bfef6a198f6cfc4ff3d4f3 + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 languageName: node linkType: hard -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" dependencies: call-bind: "npm:^1.0.7" for-each: "npm:^0.3.3" gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" is-typed-array: "npm:^1.1.13" possible-typed-array-names: "npm:^1.0.0" - checksum: 74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 + reflect.getprototypeof: "npm:^1.0.6" + checksum: e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 languageName: node linkType: hard @@ -24666,18 +24845,18 @@ __metadata: linkType: hard "typescript-eslint@npm:^7.0.2": - version: 7.9.0 - resolution: "typescript-eslint@npm:7.9.0" + version: 7.18.0 + resolution: "typescript-eslint@npm:7.18.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:7.9.0" - "@typescript-eslint/parser": "npm:7.9.0" - "@typescript-eslint/utils": "npm:7.9.0" + "@typescript-eslint/eslint-plugin": "npm:7.18.0" + "@typescript-eslint/parser": "npm:7.18.0" + "@typescript-eslint/utils": "npm:7.18.0" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: dacdd8b278d519eea1d980c71dd301a0b68fe1100aa8eaa9e3b80acd7089765ef50bdf369b7c11ddc5f4be6ac6d90cc9283db549003c3df8cfabbe4f44a36b53 + checksum: 610c0faa70b9be89255086378c7ef69e979115c89be69851fb4d69e76907b3520450b162a8adee56b32dbf368f8c14c1fac88065539012140c1319851f2676da languageName: node linkType: hard @@ -24691,23 +24870,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.0.4, typescript@npm:^5.1.6, typescript@npm:^5.2.2, typescript@npm:^5.3.3": - version: 5.4.5 - resolution: "typescript@npm:5.4.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e - languageName: node - linkType: hard - -"typescript@npm:^5.6.3": - version: 5.6.3 - resolution: "typescript@npm:5.6.3" +"typescript@npm:^5.0.4, typescript@npm:^5.1.6, typescript@npm:^5.2.2, typescript@npm:^5.3.3, typescript@npm:^5.5.4, typescript@npm:^5.6.3": + version: 5.8.2 + resolution: "typescript@npm:5.8.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799 + checksum: 5c4f6fbf1c6389b6928fe7b8fcd5dc73bb2d58cd4e3883f1d774ed5bd83b151cbac6b7ecf11723de56d4676daeba8713894b1e9af56174f2f9780ae7848ec3c6 languageName: node linkType: hard @@ -24721,23 +24890,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.1.6#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": - version: 5.4.5 - resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=e012d7" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 9cf4c053893bcf327d101b6c024a55baf05430dc30263f9adb1bf354aeffc11306fe1f23ba2f9a0209674359f16219b5b7d229e923477b94831d07d5a33a4217 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": - version: 5.6.3 - resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=e012d7" +"typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.1.6#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin, typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": + version: 5.8.2 + resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=e012d7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: ac8307bb06bbfd08ae7137da740769b7d8c3ee5943188743bb622c621f8ad61d244767480f90fbd840277fbf152d8932aa20c33f867dea1bb5e79b187ca1a92f + checksum: 8a6cd29dfb59bd5a978407b93ae0edb530ee9376a5b95a42ad057a6f80ffb0c410489ccd6fe48d1d0dfad6e8adf5d62d3874bbd251f488ae30e11a1ce6dabd28 languageName: node linkType: hard @@ -24786,18 +24945,20 @@ __metadata: linkType: hard "ua-parser-js@npm:^1.0.35": - version: 1.0.37 - resolution: "ua-parser-js@npm:1.0.37" - checksum: dac8cf82a55b2e097bd2286954e01454c4cfcf23c9d9b56961ce94bda3cec5a38ca536e6e84c20a4000a9d4b4a4abcbd98ec634ccebe21be36595ea3069126e4 + version: 1.0.40 + resolution: "ua-parser-js@npm:1.0.40" + bin: + ua-parser-js: script/cli.js + checksum: 2b6ac642c74323957dae142c31f72287f2420c12dced9603d989b96c132b80232779c429b296d7de4012ef8b64e0d8fadc53c639ef06633ce13d785a78b5be6c languageName: node linkType: hard "uglify-js@npm:^3.1.4": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" bin: uglifyjs: bin/uglifyjs - checksum: 8b7fcdca69deb284fed7d2025b73eb747ce37f9aca6af53422844f46427152d5440601b6e2a033e77856a2f0591e4167153d5a21b68674ad11f662034ec13ced + checksum: 83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 languageName: node linkType: hard @@ -24836,15 +24997,15 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: "npm:^1.0.2" + call-bound: "npm:^1.0.3" has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.0.3" - which-boxed-primitive: "npm:^1.0.2" - checksum: 81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 languageName: node linkType: hard @@ -24863,16 +25024,9 @@ __metadata: linkType: hard "underscore@npm:^1.13.1": - version: 1.13.6 - resolution: "underscore@npm:1.13.6" - checksum: 5f57047f47273044c045fddeb8b141dafa703aa487afd84b319c2495de2e685cecd0b74abec098292320d518b267c0c4598e45aa47d4c3628d0d4020966ba521 - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + version: 1.13.7 + resolution: "underscore@npm:1.13.7" + checksum: fad2b4aac48847674aaf3c30558f383399d4fdafad6dd02dd60e4e1b8103b52c5a9e5937e0cc05dacfd26d6a0132ed0410ab4258241240757e4a4424507471cd languageName: node linkType: hard @@ -24883,12 +25037,19 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: 68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf + languageName: node + linkType: hard + "undici@npm:^5.14.0": - version: 5.28.4 - resolution: "undici@npm:5.28.4" + version: 5.29.0 + resolution: "undici@npm:5.29.0" dependencies: "@fastify/busboy": "npm:^2.0.0" - checksum: 08d0f2596553aa0a54ca6e8e9c7f45aef7d042c60918564e3a142d449eda165a80196f6ef19ea2ef2e6446959e293095d8e40af1236f0d67223b06afac5ecad7 + checksum: e4e4d631ca54ee0ad82d2e90e7798fa00a106e27e6c880687e445cc2f13b4bc87c5eba2a88c266c3eecffb18f26e227b778412da74a23acc374fca7caccec49b languageName: node linkType: hard @@ -24920,6 +25081,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + "unique-slug@npm:^4.0.0": version: 4.0.0 resolution: "unique-slug@npm:4.0.0" @@ -24929,6 +25099,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + "universalify@npm:^0.1.0": version: 0.1.2 resolution: "universalify@npm:0.1.2" @@ -24976,17 +25155,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.16 - resolution: "update-browserslist-db@npm:1.0.16" +"update-browserslist-db@npm:^1.1.1": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" dependencies: - escalade: "npm:^3.1.2" - picocolors: "npm:^1.0.1" + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 5995399fc202adbb51567e4810e146cdf7af630a92cc969365a099150cb00597e425cc14987ca7080b09a4d0cfd2a3de53fbe72eebff171aed7f9bb81f9bf405 + checksum: 682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 languageName: node linkType: hard @@ -25008,7 +25187,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": +"uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -25041,12 +25220,12 @@ __metadata: linkType: hard "url@npm:^0.11.0": - version: 0.11.3 - resolution: "url@npm:0.11.3" + version: 0.11.4 + resolution: "url@npm:0.11.4" dependencies: punycode: "npm:^1.4.1" - qs: "npm:^6.11.2" - checksum: 7546b878ee7927cfc62ca21dbe2dc395cf70e889c3488b2815bf2c63355cb3c7db555128176a01b0af6cccf265667b6fd0b4806de00cb71c143c53986c08c602 + qs: "npm:^6.12.3" + checksum: cc93405ae4a9b97a2aa60ca67f1cb1481c0221cb4725a7341d149be5e2f9cfda26fd432d64dbbec693d16593b68b8a46aad8e5eab21f814932134c9d8620c662 languageName: node linkType: hard @@ -25089,17 +25268,22 @@ __metadata: linkType: hard "util.promisify@npm:^1.0.0": - version: 1.1.2 - resolution: "util.promisify@npm:1.1.2" + version: 1.1.3 + resolution: "util.promisify@npm:1.1.3" dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" for-each: "npm:^0.3.3" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - object.getownpropertydescriptors: "npm:^2.1.6" - safe-array-concat: "npm:^1.0.0" - checksum: cc9bf4912b89ea8e095b5746d945607884b4635d219cb1935c028259e86be6af92d7b7b1e702776805d81f7d387ffa436037299e9bf01ce076267e217b54ae3e + get-intrinsic: "npm:^1.2.6" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + object.getownpropertydescriptors: "npm:^2.1.8" + safe-array-concat: "npm:^1.1.3" + checksum: b7a2f721222ffc26f8a12a1cdc44a81b16a614b81f2d6f71f50c8b214a20afe8324d5f0700f04759d6ea33446ba0730e4ef0b4e2c4f4ef5adca16dabd502fa2b languageName: node linkType: hard @@ -25183,10 +25367,17 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-name@npm:^5.0.0": + version: 5.0.1 + resolution: "validate-npm-package-name@npm:5.0.1" + checksum: 903e738f7387404bb72f7ac34e45d7010c877abd2803dc2d614612527927a40a6d024420033132e667b1bade94544b8a1f65c9431a4eb30d0ce0d80093cd1f74 + languageName: node + linkType: hard + "validator@npm:^13.7.0, validator@npm:^13.9.0": - version: 13.12.0 - resolution: "validator@npm:13.12.0" - checksum: 21d48a7947c9e8498790550f56cd7971e0e3d724c73388226b109c1bac2728f4f88caddfc2f7ed4b076f9b0d004316263ac786a17e9c4edf075741200718cd32 + version: 13.15.0 + resolution: "validator@npm:13.15.0" + checksum: 0f13fd7031ac575e8d7828431da8ef5859bac6a38ee65e1d7fdd367dbf1c3d94d95182aecc3183f7fa7a30ff4474bf864d1aff54707620227a2cdbfd36d894c2 languageName: node linkType: hard @@ -26179,16 +26370,16 @@ __metadata: languageName: node linkType: hard -"webcrypto-core@npm:^1.7.9": - version: 1.7.9 - resolution: "webcrypto-core@npm:1.7.9" +"webcrypto-core@npm:^1.8.0": + version: 1.8.1 + resolution: "webcrypto-core@npm:1.8.1" dependencies: - "@peculiar/asn1-schema": "npm:^2.3.8" + "@peculiar/asn1-schema": "npm:^2.3.13" "@peculiar/json-schema": "npm:^1.1.12" - asn1js: "npm:^3.0.1" + asn1js: "npm:^3.0.5" pvtsutils: "npm:^1.3.5" - tslib: "npm:^2.6.2" - checksum: 29075c0fd6afdd11473dcf98623b929fae6a0861a54725af109df824e3c55c00580103a2f934baabff52d588e9c6c3892db80346061fd835c55e0a83264c19f5 + tslib: "npm:^2.7.0" + checksum: b85a986b4f73e8505ec5eaafe8e4f1ff02574a3b655793aca91f913d02822c8b79168ad6961eaab86ae00fec00bf780ec4cef7535f64879fb866649bc2a723fa languageName: node linkType: hard @@ -26251,16 +26442,49 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" + resolution: "which-collection@npm:1.0.2" dependencies: - is-bigint: "npm:^1.0.1" - is-boolean-object: "npm:^1.1.0" - is-number-object: "npm:^1.0.4" - is-string: "npm:^1.0.5" - is-symbol: "npm:^1.0.3" - checksum: 0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 languageName: node linkType: hard @@ -26278,26 +26502,18 @@ __metadata: languageName: node linkType: hard -"which-pm@npm:2.0.0": - version: 2.0.0 - resolution: "which-pm@npm:2.0.0" - dependencies: - load-yaml-file: "npm:^0.2.0" - path-exists: "npm:^4.0.0" - checksum: 499fdf18fb259ea7dd58aab0df5f44240685364746596d0d08d9d68ac3a7205bde710ec1023dbc9148b901e755decb1891aa6790ceffdb81c603b6123ec7b5e4 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" dependencies: available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" has-tostringtag: "npm:^1.0.2" - checksum: 4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 + checksum: 702b5dc878addafe6c6300c3d0af5983b175c75fcb4f2a72dfc3dd38d93cf9e89581e4b29c854b16ea37e50a7d7fca5ae42ece5c273d8060dcd603b2404bbb3f languageName: node linkType: hard @@ -26323,14 +26539,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: isexe: "npm:^3.1.1" bin: node-which: bin/which.js - checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + checksum: e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b languageName: node linkType: hard @@ -26352,33 +26568,33 @@ __metadata: languageName: node linkType: hard -"winston-transport@npm:^4.7.0": - version: 4.7.0 - resolution: "winston-transport@npm:4.7.0" +"winston-transport@npm:^4.9.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" dependencies: - logform: "npm:^2.3.2" - readable-stream: "npm:^3.6.0" + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" triple-beam: "npm:^1.3.0" - checksum: cd16f3d0ab56697f93c4899e0eb5f89690f291bb6cf309194819789326a7c7ed943ef00f0b2fab513b114d371314368bde1a7ae6252ad1516181a79f90199cd2 + checksum: e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 languageName: node linkType: hard "winston@npm:*, winston@npm:^3.3.3": - version: 3.13.0 - resolution: "winston@npm:3.13.0" + version: 3.17.0 + resolution: "winston@npm:3.17.0" dependencies: "@colors/colors": "npm:^1.6.0" "@dabh/diagnostics": "npm:^2.0.2" async: "npm:^3.2.3" is-stream: "npm:^2.0.0" - logform: "npm:^2.4.0" + logform: "npm:^2.7.0" one-time: "npm:^1.0.0" readable-stream: "npm:^3.4.0" safe-stable-stringify: "npm:^2.3.1" stack-trace: "npm:0.0.x" triple-beam: "npm:^1.3.0" - winston-transport: "npm:^4.7.0" - checksum: 2c3cc7389a691e1638edcb0d4bfea72caa82d87d5681ec6131ac9bae780d94d06fb7b112edcd4ec37c8b947a1b64943941b761e34d67c6b0dac6e9c31ae4b25b + winston-transport: "npm:^4.9.0" + checksum: ec8eaeac9a72b2598aedbff50b7dac82ce374a400ed92e7e705d7274426b48edcb25507d78cff318187c4fb27d642a0e2a39c57b6badc9af8e09d4a40636a5f7 languageName: node linkType: hard @@ -26398,10 +26614,10 @@ __metadata: languageName: node linkType: hard -"wonka@npm:^6.3.2": - version: 6.3.4 - resolution: "wonka@npm:6.3.4" - checksum: 77329eea673da07717476e1b8f1a22f1e1a4f261bb9a58fa446c03d3da13dbd5b254664f8aded5928d953f33ee5b399a17a4f70336e8b236e478209c0e78cda4 +"wonka@npm:^6.0.0, wonka@npm:^6.1.2, wonka@npm:^6.3.2": + version: 6.3.5 + resolution: "wonka@npm:6.3.5" + checksum: 044fe5ae26c0a32b0a1603cc0ed71ede8c9febe5bb3adab4fad5e088ceee600a84a08d0deb95a72189bbaf0d510282d183b6fb7b6e9837e7a1c9b209f788dd07 languageName: node linkType: hard @@ -26429,13 +26645,6 @@ __metadata: languageName: node linkType: hard -"workerpool@npm:6.2.1": - version: 6.2.1 - resolution: "workerpool@npm:6.2.1" - checksum: f0efd2d74eafd58eaeb36d7d85837d080f75c52b64893cff317b66257dd308e5c9f85ef0b12904f6c7f24ed2365bc3cfeba1f1d16aa736d84d6ef8156ae37c80 - languageName: node - linkType: hard - "workerpool@npm:^6.5.1": version: 6.5.1 resolution: "workerpool@npm:6.5.1" @@ -26549,6 +26758,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + languageName: node + linkType: hard + "ws@npm:^3.0.0": version: 3.3.3 resolution: "ws@npm:3.3.3" @@ -26561,17 +26785,17 @@ __metadata: linkType: hard "ws@npm:^5.1.1": - version: 5.2.3 - resolution: "ws@npm:5.2.3" + version: 5.2.4 + resolution: "ws@npm:5.2.4" dependencies: async-limiter: "npm:~1.0.0" - checksum: 3f329b29a893c660b01be81654c9bca422a0de3396e644aae165e4e998e74b2b713adcbba876f183cd74a4f488376cbb7442d1c87455084d69fce1e2f25ef088 + checksum: 14e84e4209f86ab68b01b9ebf42c88f81f26a64ff4886ef65d27c734c9b90b8d7e84712da3c3f7a922a4ab58bf0b96544d32ae28ebbd620fcda3027dd5bc7604 languageName: node linkType: hard "ws@npm:^7.4.6": - version: 7.5.9 - resolution: "ws@npm:7.5.9" + version: 7.5.10 + resolution: "ws@npm:7.5.10" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -26580,13 +26804,13 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: aec4ef4eb65821a7dde7b44790f8699cfafb7978c9b080f6d7a98a7f8fc0ce674c027073a78574c94786ba7112cc90fa2cc94fc224ceba4d4b1030cff9662494 + checksum: bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d languageName: node linkType: hard "ws@npm:^8.12.0, ws@npm:^8.13.0": - version: 8.17.0 - resolution: "ws@npm:8.17.0" + version: 8.18.1 + resolution: "ws@npm:8.18.1" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -26595,7 +26819,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 55241ec93a66fdfc4bf4f8bc66c8eb038fda2c7a4ee8f6f157f2ca7dc7aa76aea0c0da0bf3adb2af390074a70a0e45456a2eaf80e581e630b75df10a64b0a990 + checksum: e498965d6938c63058c4310ffb6967f07d4fa06789d3364829028af380d299fe05762961742971c764973dce3d1f6a2633fe8b2d9410c9b52e534b4b882a99fa languageName: node linkType: hard @@ -26716,10 +26940,10 @@ __metadata: languageName: node linkType: hard -"yaml@npm:2.3.4": - version: 2.3.4 - resolution: "yaml@npm:2.3.4" - checksum: cf03b68f8fef5e8516b0f0b54edaf2459f1648317fc6210391cf606d247e678b449382f4bd01f77392538429e306c7cba8ff46ff6b37cac4de9a76aff33bd9e1 +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 languageName: node linkType: hard @@ -26730,14 +26954,16 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:20.2.4": - version: 20.2.4 - resolution: "yargs-parser@npm:20.2.4" - checksum: 08dc341f0b9f940c2fffc1d1decf3be00e28cabd2b578a694901eccc7dcd10577f10c6aa1b040fdd9a68b2042515a60f18476543bccacf9f3ce2c8534cd87435 +"yaml@npm:^2.7.0": + version: 2.7.0 + resolution: "yaml@npm:2.7.0" + bin: + yaml: bin.mjs + checksum: 886a7d2abbd70704b79f1d2d05fe9fb0aa63aefb86e1cb9991837dced65193d300f5554747a872b4b10ae9a12bc5d5327e4d04205f70336e863e35e89d8f4ea9 languageName: node linkType: hard -"yargs-parser@npm:^18.1.2, yargs-parser@npm:^18.1.3": +"yargs-parser@npm:^18.1.2": version: 18.1.3 resolution: "yargs-parser@npm:18.1.3" dependencies: @@ -26780,7 +27006,7 @@ __metadata: languageName: node linkType: hard -"yargs-unparser@npm:2.0.0, yargs-unparser@npm:^2.0.0": +"yargs-unparser@npm:^2.0.0": version: 2.0.0 resolution: "yargs-unparser@npm:2.0.0" dependencies: @@ -26792,36 +27018,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:16.2.0, yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: "npm:^7.0.2" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 - languageName: node - linkType: hard - -"yargs@npm:17.7.2, yargs@npm:^17.0.0, yargs@npm:^17.7.1": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - "yargs@npm:^10.0.3": version: 10.1.2 resolution: "yargs@npm:10.1.2" @@ -26842,7 +27038,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^15.1.0, yargs@npm:^15.3.1": +"yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" dependencies: @@ -26861,6 +27057,36 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 + languageName: node + linkType: hard + +"yargs@npm:^17.0.0, yargs@npm:^17.7.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + "yargs@npm:^4.7.1": version: 4.8.1 resolution: "yargs@npm:4.8.1" @@ -26907,17 +27133,17 @@ __metadata: linkType: hard "zod-to-json-schema@npm:^3.20.5": - version: 3.23.0 - resolution: "zod-to-json-schema@npm:3.23.0" + version: 3.24.5 + resolution: "zod-to-json-schema@npm:3.24.5" peerDependencies: - zod: ^3.23.3 - checksum: bcd966fa040765d7170a89c0c5f1717575e7d8823b84cbbb606689d494ae308c9eaadd4b71a74752e3170deef64c1f1bb2985f4663c44a0ed2e7854ff6fda724 + zod: ^3.24.1 + checksum: 0745b94ba53e652d39f262641cdeb2f75d24339fb6076a38ce55bcf53d82dfaea63adf524ebc5f658681005401687f8e9551c4feca7c4c882e123e66091dfb90 languageName: node linkType: hard "zod@npm:^3.21.4": - version: 3.23.8 - resolution: "zod@npm:3.23.8" - checksum: 8f14c87d6b1b53c944c25ce7a28616896319d95bc46a9660fe441adc0ed0a81253b02b5abdaeffedbeb23bdd25a0bf1c29d2c12dd919aef6447652dd295e3e69 + version: 3.24.2 + resolution: "zod@npm:3.24.2" + checksum: c638c7220150847f13ad90635b3e7d0321b36cce36f3fc6050ed960689594c949c326dfe2c6fa87c14b126ee5d370ccdebd6efb304f41ef5557a4aaca2824565 languageName: node linkType: hard From 420c23678afffa825e86343ce2fc4775be1b7f29 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 26 Mar 2025 15:09:17 -0300 Subject: [PATCH 16/23] chore: moving actions to SDK --- .../deployments/horizon/actions/staking.ts | 24 +++---- .../horizon/actions}/stakingExtension.ts | 10 ++- .../hardhat-graph-protocol/src/sdk/index.ts | 14 ++++- .../src/sdk/utils/banner.ts} | 9 ++- packages/horizon/tasks/test/integration.ts | 8 +-- packages/horizon/tasks/test/pre-upgrade.ts | 9 +-- .../horizon/tasks/test/transfer-onwership.ts | 8 +-- packages/horizon/tasks/test/transitions.ts | 9 +-- .../add-to-delegation-pool.test.ts | 32 ++++------ .../slasher.test.ts | 30 ++++----- .../add-to-delegation-pool.test.ts | 26 +++----- .../after-transition-period/delegator.test.ts | 58 ++++++++--------- .../after-transition-period/operator.test.ts | 30 +++++---- .../service-provider.test.ts | 62 ++++++++----------- .../after-transition-period/slasher.test.ts | 33 ++++------ .../delegator.test.ts | 6 +- .../service-provider.test.ts | 26 ++++---- .../during-transition-period/slasher.test.ts | 6 +- 18 files changed, 183 insertions(+), 217 deletions(-) rename packages/{horizon/test/integration/shared => hardhat-graph-protocol/src/sdk/deployments/horizon/actions}/stakingExtension.ts (80%) rename packages/{horizon/utils/banners.ts => hardhat-graph-protocol/src/sdk/utils/banner.ts} (85%) diff --git a/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts index ad7f926d0..58db1ad0d 100644 --- a/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts +++ b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts @@ -11,7 +11,7 @@ import { ThawRequestType } from '../utils/types' EXPORTS ////////////////////////////////////////////////////////////// */ -export const HorizonHelper = { +export const HorizonStakingActions = { addToDelegationPool, delegate, deprovision, @@ -155,17 +155,8 @@ interface ProvisionParams { } interface CreateProvisionParams extends ProvisionParams { - maxVerifierCut: number - thawingPeriod: number -} - -interface DeprovisionParams extends Omit { - nThawRequests: bigint -} - -interface ReprovisionParams extends Omit { - newVerifier: string - nThawRequests: bigint + maxVerifierCut: bigint + thawingPeriod: bigint } async function createProvision({ @@ -257,6 +248,10 @@ async function thaw({ expect(thawRequest.shares).to.equal(expectedThawRequestShares, 'Thaw request shares were not set') } +interface DeprovisionParams extends Omit { + nThawRequests: bigint +} + async function deprovision({ horizonStaking, serviceProvider, @@ -273,6 +268,11 @@ async function deprovision({ await deprovisionTx.wait() } +interface ReprovisionParams extends Omit { + newVerifier: string + nThawRequests: bigint +} + async function reprovision({ horizonStaking, serviceProvider, diff --git a/packages/horizon/test/integration/shared/stakingExtension.ts b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/stakingExtension.ts similarity index 80% rename from packages/horizon/test/integration/shared/stakingExtension.ts rename to packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/stakingExtension.ts index 082ce0f4f..f5814733c 100644 --- a/packages/horizon/test/integration/shared/stakingExtension.ts +++ b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/stakingExtension.ts @@ -1,6 +1,14 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' -import { IGraphToken, IHorizonStaking } from '../../../typechain-types' +import { IGraphToken, IHorizonStaking } from '@graphprotocol/horizon' + +/* ////////////////////////////////////////////////////////////// + EXPORTS +////////////////////////////////////////////////////////////// */ + +export const HorizonStakingExtensionActions = { + collect, +} /* //////////////////////////////////////////////////////////// STAKING EXTENSION diff --git a/packages/hardhat-graph-protocol/src/sdk/index.ts b/packages/hardhat-graph-protocol/src/sdk/index.ts index af7734506..f3717bd10 100644 --- a/packages/hardhat-graph-protocol/src/sdk/index.ts +++ b/packages/hardhat-graph-protocol/src/sdk/index.ts @@ -1,10 +1,20 @@ import { loadConfig, patchConfig, saveToAddressBook } from './ignition/ignition' import { PaymentTypes, ThawRequestType } from './deployments/horizon/utils/types' import { hardhatBaseConfig } from './hardhat.base.config' -import { HorizonHelper } from './deployments/horizon/actions/staking' +import { HorizonStakingActions } from './deployments/horizon/actions/staking' +import { HorizonStakingExtensionActions } from './deployments/horizon/actions/stakingExtension' import { mergeABIs } from './utils/abi' +import { printBanner } from './utils/banner' const IgnitionHelper = { saveToAddressBook, loadConfig, patchConfig } const HorizonTypes = { PaymentTypes, ThawRequestType } -export { hardhatBaseConfig, IgnitionHelper, mergeABIs, HorizonTypes, HorizonHelper } +export { + hardhatBaseConfig, + HorizonStakingActions, + HorizonStakingExtensionActions, + HorizonTypes, + IgnitionHelper, + mergeABIs, + printBanner, +} diff --git a/packages/horizon/utils/banners.ts b/packages/hardhat-graph-protocol/src/sdk/utils/banner.ts similarity index 85% rename from packages/horizon/utils/banners.ts rename to packages/hardhat-graph-protocol/src/sdk/utils/banner.ts index 7cdcdc3b3..f7eb4e79e 100644 --- a/packages/horizon/utils/banners.ts +++ b/packages/hardhat-graph-protocol/src/sdk/utils/banner.ts @@ -1,11 +1,10 @@ /** - * Creates a box-style banner with centered text + * Creates and prints a box-style banner with centered text to the console * @param title The main title text to display * @param prefix Optional prefix text that appears before the title (default: '') * @param minWidth Minimum width of the banner (default: 47) - * @returns A string containing the formatted banner */ -export function createBanner(title: string, prefix = '', minWidth = 47): string { +export function printBanner(title: string, prefix = '', minWidth = 47): void { // Format title with capitalized words if it contains hyphens const formattedTitle = title.includes('-') ? title @@ -31,11 +30,11 @@ export function createBanner(title: string, prefix = '', minWidth = 47): string // Create border with correct width const border = '+' + '-'.repeat(bannerWidth) + '+' - return ` + console.log(` ${border} ${emptyLine} ${centeredLine} ${emptyLine} ${border} -` +`) } diff --git a/packages/horizon/tasks/test/integration.ts b/packages/horizon/tasks/test/integration.ts index 23a49620f..f44cd0aec 100644 --- a/packages/horizon/tasks/test/integration.ts +++ b/packages/horizon/tasks/test/integration.ts @@ -2,7 +2,7 @@ import { glob } from 'glob' import { task } from 'hardhat/config' import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' -import { createBanner } from '../../utils/banners' +import { printBanner } from 'hardhat-graph-protocol/sdk' task('test:integration', 'Runs all integration tests') .addParam( @@ -16,7 +16,7 @@ task('test:integration', 'Runs all integration tests') const afterDelegationSlashingEnabledFiles = await glob('test/integration/after-delegation-slashing-enabled/**/*.{js,ts}') // Display banner for the current test phase - console.log(getTestPhaseBanner(taskArgs.phase)) + printBanner(taskArgs.phase, 'INTEGRATION TESTS: ') switch (taskArgs.phase) { case 'during-transition-period': @@ -34,7 +34,3 @@ task('test:integration', 'Runs all integration tests') ) } }) - -function getTestPhaseBanner(phase: string): string { - return createBanner(phase, 'INTEGRATION TESTS: ') -} diff --git a/packages/horizon/tasks/test/pre-upgrade.ts b/packages/horizon/tasks/test/pre-upgrade.ts index ad5f0cc51..36d19b056 100644 --- a/packages/horizon/tasks/test/pre-upgrade.ts +++ b/packages/horizon/tasks/test/pre-upgrade.ts @@ -3,13 +3,14 @@ import { task } from 'hardhat/config' import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' -import { IGraphToken, IStaking } from '@graphprotocol/contracts' import L2GraphTokenABI from '@graphprotocol/contracts/build/abis/L2GraphToken.json' import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' -import { mergeABIs } from 'hardhat-graph-protocol/sdk' import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' -import { createBanner } from '../../utils/banners' +import { IGraphToken, IStaking } from '@graphprotocol/contracts' +import { mergeABIs } from 'hardhat-graph-protocol/sdk' +import { printBanner } from 'hardhat-graph-protocol/sdk' + import { delegators } from './fixtures/delegators' import { indexers } from './fixtures/indexers' @@ -22,7 +23,7 @@ const graphTokenABI = L2GraphTokenABI task('test:integration:pre-upgrade', 'Sets up the pre-upgrade state for testing') .setAction(async (_, hre) => { - console.log(createBanner('PRE-HORIZON UPGRADE SETUP')) + printBanner('PRE-HORIZON UPGRADE SETUP') console.log('\n--- STEP 0: Setup ---') diff --git a/packages/horizon/tasks/test/transfer-onwership.ts b/packages/horizon/tasks/test/transfer-onwership.ts index 6f279f2d7..d5add9761 100644 --- a/packages/horizon/tasks/test/transfer-onwership.ts +++ b/packages/horizon/tasks/test/transfer-onwership.ts @@ -1,19 +1,19 @@ import { task, types } from 'hardhat/config' import { Contract } from 'ethers' -import { IStaking } from '@graphprotocol/contracts' import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' -import { mergeABIs } from 'hardhat-graph-protocol/sdk' import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' -import { createBanner } from '../../utils/banners' +import { IStaking } from '@graphprotocol/contracts' +import { mergeABIs } from 'hardhat-graph-protocol/sdk' +import { printBanner } from 'hardhat-graph-protocol/sdk' task('test:integration:transfer-ownership', 'Transfer ownership of protocol contracts to a new governor') .addOptionalParam('governorIndex', 'Index of the new governor account in getSigners array', 1, types.int) .addOptionalParam('slasherIndex', 'Index of the new slasher account in getSigners array', 2, types.int) .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') .setAction(async (taskArgs, hre) => { - console.log(createBanner('TRANSFER OWNERSHIP')) + printBanner('TRANSFER OWNERSHIP') // Check that we're on a local network if (!taskArgs.skipNetworkCheck && hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { diff --git a/packages/horizon/tasks/test/transitions.ts b/packages/horizon/tasks/test/transitions.ts index 36934b5fe..994c9e6e1 100644 --- a/packages/horizon/tasks/test/transitions.ts +++ b/packages/horizon/tasks/test/transitions.ts @@ -1,11 +1,12 @@ import { task, types } from 'hardhat/config' -import { createBanner } from '../../utils/banners' import { ethers } from 'ethers' +import { printBanner } from 'hardhat-graph-protocol/sdk' + task('transition:unset-subgraph-service', 'Unsets the subgraph service in HorizonStaking') .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { - console.log(createBanner('UNSETTING SUBGRAPH SERVICE')) + printBanner('UNSETTING SUBGRAPH SERVICE') const signers = await hre.ethers.getSigners() // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -21,7 +22,7 @@ task('transition:unset-subgraph-service', 'Unsets the subgraph service in Horizo task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { - console.log(createBanner('CLEARING THAWING PERIOD')) + printBanner('CLEARING THAWING PERIOD') const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] @@ -36,7 +37,7 @@ task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') task('transition:enable-delegation-slashing', 'Enables delegation slashing in HorizonStaking') .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) .setAction(async (taskArgs, hre) => { - console.log(createBanner('ENABLING DELEGATION SLASHING')) + printBanner('ENABLING DELEGATION SLASHING') const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts index d48b01901..eb48e16ce 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts @@ -5,15 +5,7 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' - -import { - addToDelegationPool, - createProvision, - delegate, - slash, - stake, -} from '../shared/staking' - +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' describe('Add to delegation pool', () => { let horizonStaking: IHorizonStaking let graphToken: IGraphToken @@ -22,8 +14,8 @@ describe('Add to delegation pool', () => { let signer: SignerWithAddress let verifier: string - const maxVerifierCut = 1000000 - const thawingPeriod = 2419200 // 28 days + const maxVerifierCut = 1000000n + const thawingPeriod = 2419200n // 28 days const tokens = ethers.parseEther('100000') const delegationTokens = ethers.parseEther('1000') @@ -40,7 +32,7 @@ describe('Add to delegation pool', () => { verifier = await ethers.Wallet.createRandom().getAddress() // Service provider stake - await stake({ + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, @@ -49,7 +41,7 @@ describe('Add to delegation pool', () => { // Create provision const provisionTokens = ethers.parseEther('1000') - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier, @@ -59,7 +51,7 @@ describe('Add to delegation pool', () => { }) // Initialize delegation pool - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -81,7 +73,7 @@ describe('Add to delegation pool', () => { // Create a provision for the new verifier const newVerifierProvisionTokens = ethers.parseEther('1000') - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier: newVerifier.address, @@ -92,7 +84,7 @@ describe('Add to delegation pool', () => { // Initialize delegation pool const initialDelegation = ethers.parseEther('1000') - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -107,7 +99,7 @@ describe('Add to delegation pool', () => { // Slash entire provision (service provider tokens + delegation pool tokens) const slashTokens = newVerifierProvisionTokens + initialDelegation const tokensVerifier = newVerifierProvisionTokens / 2n - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier: newVerifier, serviceProvider: serviceProvider.address, @@ -119,7 +111,7 @@ describe('Add to delegation pool', () => { // Delegating should revert since pool.tokens == 0 and pool.shares != 0 const delegateTokens = ethers.parseEther('500') await expect( - delegate({ + HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -132,7 +124,7 @@ describe('Add to delegation pool', () => { // Add tokens to the delegation pool to recover the pool const recoverPoolTokens = ethers.parseEther('500') - await addToDelegationPool({ + await HorizonStakingActions.addToDelegationPool({ horizonStaking, graphToken, signer, @@ -147,7 +139,7 @@ describe('Add to delegation pool', () => { expect(poolAfter.shares).to.equal(poolBefore.shares, 'Pool shares should remain the same') // Delegation should now succeed - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts index 812f93141..563dc5aae 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts @@ -6,15 +6,7 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' - -import { - createProvision, - delegate, - slash, - stake, - undelegate, - withdrawDelegated, -} from '../shared/staking' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' describe('Slasher', () => { let horizonStaking: IHorizonStaking @@ -24,8 +16,8 @@ describe('Slasher', () => { let verifier: HDNodeWallet let verifierDestination: string - const maxVerifierCut = 1000000 // 100% - const thawingPeriod = 2419200 // 28 days + const maxVerifierCut = 1000000n // 100% + const thawingPeriod = 2419200n // 28 days const provisionTokens = ethers.parseEther('10000') const delegationTokens = ethers.parseEther('1000') @@ -50,8 +42,8 @@ describe('Slasher', () => { verifierDestination = await ethers.Wallet.createRandom().getAddress() // Create provision - await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) - await createProvision({ + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier: verifier.address, @@ -61,7 +53,7 @@ describe('Slasher', () => { }) // Initialize delegation pool if it does not exist - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -85,7 +77,7 @@ describe('Slasher', () => { const tokensVerifier = slashTokens / 2n // Slash the provision for all service provider and half of the delegation pool tokens - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier, serviceProvider: serviceProvider.address, @@ -111,7 +103,7 @@ describe('Slasher', () => { const tokensVerifier = slashTokens / 2n // Slash the provision for all service provider and delegation pool tokens - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier, serviceProvider: serviceProvider.address, @@ -125,7 +117,7 @@ describe('Slasher', () => { // Try to delegate to slashed pool await expect( - delegate({ + HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -138,7 +130,7 @@ describe('Slasher', () => { // Try to undelegate from slashed pool await expect( - undelegate({ + HorizonStakingActions.undelegate({ horizonStaking, delegator, serviceProvider, @@ -149,7 +141,7 @@ describe('Slasher', () => { // Try to withdraw from slashed pool await expect( - withdrawDelegated({ + HorizonStakingActions.withdrawDelegated({ horizonStaking, delegator, serviceProvider, diff --git a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts index 077cb9690..8f4379c7b 100644 --- a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts @@ -5,13 +5,7 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' - -import { - addToDelegationPool, - createProvision, - delegate, - stake, -} from '../shared/staking' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' describe('Add to delegation pool', () => { let horizonStaking: IHorizonStaking @@ -21,8 +15,8 @@ describe('Add to delegation pool', () => { let signer: SignerWithAddress let verifier: string - const maxVerifierCut = 1000000 - const thawingPeriod = 2419200 // 28 days + const maxVerifierCut = 1000000n + const thawingPeriod = 2419200n // 28 days const tokens = ethers.parseEther('100000') const delegationTokens = ethers.parseEther('1000') @@ -36,7 +30,7 @@ describe('Add to delegation pool', () => { verifier = await ethers.Wallet.createRandom().getAddress() // Service provider stake - await stake({ + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, @@ -45,7 +39,7 @@ describe('Add to delegation pool', () => { // Create provision const provisionTokens = ethers.parseEther('1000') - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier, @@ -59,7 +53,7 @@ describe('Add to delegation pool', () => { await graphToken.connect(serviceProvider).transfer(signer.address, tokens) // Initialize delegation pool - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -75,7 +69,7 @@ describe('Add to delegation pool', () => { const addTokens = ethers.parseEther('500') // Add tokens to the delegation pool - await addToDelegationPool({ + await HorizonStakingActions.addToDelegationPool({ horizonStaking, graphToken, signer, @@ -96,7 +90,7 @@ describe('Add to delegation pool', () => { // Attempt to add tokens to a non-existent provision await expect( - addToDelegationPool({ + HorizonStakingActions.addToDelegationPool({ horizonStaking, graphToken, signer, @@ -111,7 +105,7 @@ describe('Add to delegation pool', () => { // Create new provision without any delegations const newVerifier = await ethers.Wallet.createRandom().getAddress() const newVerifierProvisionTokens = ethers.parseEther('1000') - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier: newVerifier, @@ -123,7 +117,7 @@ describe('Add to delegation pool', () => { // Attempt to add tokens to the new provision const addTokens = ethers.parseEther('500') await expect( - addToDelegationPool({ + HorizonStakingActions.addToDelegationPool({ horizonStaking, graphToken, signer, diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts index 492f06afc..47fc5a93c 100644 --- a/packages/horizon/test/integration/after-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -5,15 +5,7 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' - -import { - createProvision, - delegate, - redelegate, - stake, - undelegate, - withdrawDelegated, -} from '../shared/staking' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' describe('Delegator', () => { let horizonStaking: IHorizonStaking @@ -24,8 +16,8 @@ describe('Delegator', () => { let verifier: string let newVerifier: string - const maxVerifierCut = 1000000 - const thawingPeriod = 2419200 // 28 days + const maxVerifierCut = 1000000n + const thawingPeriod = 2419200n // 28 days const tokens = ethers.parseEther('100000') before(async () => { @@ -40,10 +32,10 @@ describe('Delegator', () => { newVerifier = await ethers.Wallet.createRandom().getAddress() // Servide provider stake - await stake({ horizonStaking, graphToken, serviceProvider, tokens }) + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens }) // Create provision - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier, @@ -72,7 +64,7 @@ describe('Delegator', () => { const delegationTokens = ethers.parseEther('1000') // Delegate tokens to the service provider and verifier - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -99,7 +91,7 @@ describe('Delegator', () => { expect(delegation.shares).to.equal(delegationTokens, 'Delegation shares were not minted correctly') // Undelegate tokens - await undelegate({ + await HorizonStakingActions.undelegate({ horizonStaking, delegator, serviceProvider, @@ -108,11 +100,11 @@ describe('Delegator', () => { }) // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Withdraw tokens - await withdrawDelegated({ + await HorizonStakingActions.withdrawDelegated({ horizonStaking, delegator, serviceProvider, @@ -129,7 +121,7 @@ describe('Delegator', () => { const invalidVerifier = await ethers.Wallet.createRandom().getAddress() await expect( - delegate({ + HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -145,7 +137,7 @@ describe('Delegator', () => { const minDelegation = ethers.parseEther('1') await expect( - delegate({ + HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -163,7 +155,7 @@ describe('Delegator', () => { before(async () => { // Delegate tokens to initialize the delegation pool - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -174,13 +166,13 @@ describe('Delegator', () => { }) // Create new provision for a new service provider and verifier combo - await stake({ + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider: newServiceProvider, tokens: newProvisionTokens, }) - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider: newServiceProvider, verifier: newVerifier, @@ -199,7 +191,7 @@ describe('Delegator', () => { ) const undelegateShares = delegation.shares / 5n - await undelegate({ + await HorizonStakingActions.undelegate({ horizonStaking, delegator, serviceProvider, @@ -208,10 +200,10 @@ describe('Delegator', () => { }) // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) - await redelegate({ + await HorizonStakingActions.redelegate({ horizonStaking, delegator, serviceProvider, @@ -260,7 +252,7 @@ describe('Delegator', () => { const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares totalExpectedTokens += tokensOut - await undelegate({ + await HorizonStakingActions.undelegate({ horizonStaking, delegator, serviceProvider, @@ -273,11 +265,11 @@ describe('Delegator', () => { } // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Withdraw all thaw requests - await withdrawDelegated({ + await HorizonStakingActions.withdrawDelegated({ horizonStaking, delegator, serviceProvider, @@ -313,7 +305,7 @@ describe('Delegator', () => { const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares totalExpectedTokens += tokensOut - await undelegate({ + await HorizonStakingActions.undelegate({ horizonStaking, delegator, serviceProvider, @@ -326,12 +318,12 @@ describe('Delegator', () => { } // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Withdraw each thaw request individually for (let i = 0; i < 3; i++) { - await withdrawDelegated({ + await HorizonStakingActions.withdrawDelegated({ horizonStaking, delegator, serviceProvider, @@ -354,7 +346,7 @@ describe('Delegator', () => { ) const undelegateShares = delegation.shares / 10n - await undelegate({ + await HorizonStakingActions.undelegate({ horizonStaking, delegator, serviceProvider, @@ -363,7 +355,7 @@ describe('Delegator', () => { }) await expect( - withdrawDelegated({ + HorizonStakingActions.withdrawDelegated({ horizonStaking, delegator, serviceProvider, diff --git a/packages/horizon/test/integration/after-transition-period/operator.test.ts b/packages/horizon/test/integration/after-transition-period/operator.test.ts index 2683de894..656442f11 100644 --- a/packages/horizon/test/integration/after-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/operator.test.ts @@ -5,9 +5,7 @@ import hre from 'hardhat' import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' - -// import { createProvision, deprovision, reprovision, stakeTo, thaw, unstake } from '../shared/staking' -import { HorizonHelper } from 'hardhat-graph-protocol/sdk' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' import { HorizonTypes } from 'hardhat-graph-protocol/sdk' describe('Operator', () => { @@ -18,8 +16,8 @@ describe('Operator', () => { let operator: HardhatEthersSigner const tokens = ethers.parseEther('100000') - const maxVerifierCut = 1000000 // 100% - const thawingPeriod = 2419200 + const maxVerifierCut = 1000000n // 100% + const thawingPeriod = 2419200n before(async () => { const graph = hre.graph() @@ -44,7 +42,7 @@ describe('Operator', () => { const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) // Operator stakes on behalf of service provider - await HorizonHelper.stakeTo({ + await HorizonStakingActions.stakeTo({ horizonStaking, graphToken, signer: operator, @@ -53,7 +51,7 @@ describe('Operator', () => { }) // Service provider unstakes - await HorizonHelper.unstake({ horizonStaking, serviceProvider, tokens: stakeTokens }) + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: stakeTokens }) // Verify tokens were removed from operator's address const operatorBalanceAfter = await graphToken.balanceOf(operator.address) @@ -89,7 +87,7 @@ describe('Operator', () => { before(async () => { const provisionTokens = ethers.parseEther('10000') // Operator stakes tokens to service provider - await HorizonHelper.stakeTo({ + await HorizonStakingActions.stakeTo({ horizonStaking, graphToken, signer: operator, @@ -98,7 +96,7 @@ describe('Operator', () => { }) // Operator creates provision - await HorizonHelper.createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier, @@ -119,7 +117,7 @@ describe('Operator', () => { const provisionTokensBefore = (await horizonStaking.getProvision(serviceProvider.address, verifier)).tokens // Operator thaws tokens - await HorizonHelper.thaw({ + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier, @@ -128,11 +126,11 @@ describe('Operator', () => { }) // Increase time - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Operator deprovisions - await HorizonHelper.deprovision({ + await HorizonStakingActions.deprovision({ horizonStaking, serviceProvider, verifier, @@ -153,7 +151,7 @@ describe('Operator', () => { const thawTokens = ethers.parseEther('100') // Operator thaws tokens - await HorizonHelper.thaw({ + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier, @@ -162,7 +160,7 @@ describe('Operator', () => { }) // Increase time - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Create new verifier and authorize operator @@ -170,7 +168,7 @@ describe('Operator', () => { await horizonStaking.connect(serviceProvider).setOperator(newVerifier, operator.address, true) // Operator creates a provision for the new verifier - await HorizonHelper.createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier: newVerifier, @@ -181,7 +179,7 @@ describe('Operator', () => { }) // Operator reprovisions - await HorizonHelper.reprovision({ + await HorizonStakingActions.reprovision({ horizonStaking, serviceProvider, verifier, diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index e97997802..d8c8309f8 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -5,17 +5,7 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' - -import { - addToProvision, - createProvision, - deprovision, - reprovision, - stake, - stakeToProvision, - thaw, - unstake, -} from '../shared/staking' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' import { HorizonTypes } from 'hardhat-graph-protocol/sdk' describe('Service provider', () => { @@ -23,7 +13,7 @@ describe('Service provider', () => { let graphToken: IGraphToken let verifier: string let serviceProvider: SignerWithAddress - const thawingPeriod = 2419200 + const thawingPeriod = 2419200n before(async () => { const graph = hre.graph() @@ -41,8 +31,8 @@ describe('Service provider', () => { it('should allow staking tokens and unstake right after', async () => { const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) - await stake({ horizonStaking, graphToken, serviceProvider, tokens: stakeAmount }) - await unstake({ horizonStaking, serviceProvider, tokens: stakeAmount }) + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: stakeAmount }) + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: stakeAmount }) const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) expect(serviceProviderBalanceAfter).to.equal(serviceProviderBalanceBefore, 'Service provider balance should not change') }) @@ -93,18 +83,18 @@ describe('Service provider', () => { }) describe('Provision', () => { - let maxVerifierCut: number + let maxVerifierCut: bigint before(async () => { const tokensToStake = ethers.parseEther('100000') - maxVerifierCut = 50_000 // 50% + maxVerifierCut = 50_000n // 50% const createProvisionTokens = ethers.parseEther('10000') // Add idle stake - await stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) // Create provision - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier, @@ -120,7 +110,7 @@ describe('Service provider', () => { // Add stake and provision on the same transaction const stakeToProvisionTokens = ethers.parseEther('100') - await stakeToProvision({ + await HorizonStakingActions.stakeToProvision({ horizonStaking, graphToken, serviceProvider, @@ -139,7 +129,7 @@ describe('Service provider', () => { // Add to provision using idle stake const addToProvisionTokens = ethers.parseEther('100') - await addToProvision({ horizonStaking, serviceProvider, verifier, tokens: addToProvisionTokens }) + await HorizonStakingActions.addToProvision({ horizonStaking, serviceProvider, verifier, tokens: addToProvisionTokens }) // Verify provision tokens were updated provision = await horizonStaking.getProvision(serviceProvider.address, verifier) @@ -168,17 +158,17 @@ describe('Service provider', () => { it('should be able to thaw tokens, wait for thawing period, deprovision and unstake', async () => { const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) const tokensToThaw = ethers.parseEther('100') - await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Deprovision the single thaw request - await deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 1n }) + await HorizonStakingActions.deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 1n }) // Unstake - await unstake({ horizonStaking, serviceProvider, tokens: tokensToThaw }) + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: tokensToThaw }) // Verify service provider balance increased by the unstake tokens const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) @@ -190,15 +180,15 @@ describe('Service provider', () => { const tokensToThaw = ethers.parseEther('100') // Create 10 thaw requests for 100 GRT each for (let i = 0; i < 10; i++) { - await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) } // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Deprovision all thaw requests - await deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 10n }) + await HorizonStakingActions.deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 10n }) // Verify service provider idle stake increased by the deprovisioned tokens const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) @@ -210,16 +200,16 @@ describe('Service provider', () => { const tokensToThaw = ethers.parseEther('100') // Create 3 thaw requests for 100 GRT each for (let i = 0; i < 3; i++) { - await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) } // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Deprovision one by one for (let i = 0; i < 3; i++) { - await deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 1n }) + await HorizonStakingActions.deprovision({ horizonStaking, serviceProvider, verifier, nThawRequests: 1n }) } // Verify service provider idle stake increased by the deprovisioned tokens @@ -233,7 +223,7 @@ describe('Service provider', () => { before(async () => { newVerifier = await ethers.Wallet.createRandom().getAddress() - await createProvision({ + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier: newVerifier, @@ -249,14 +239,14 @@ describe('Service provider', () => { const tokensToThaw = ethers.parseEther('100') // Thaw tokens - await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [thawingPeriod]) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) // Reprovision - await reprovision({ + await HorizonStakingActions.reprovision({ horizonStaking, serviceProvider, verifier, @@ -275,9 +265,9 @@ describe('Service provider', () => { it('should revert if thawing period is not over', async () => { const tokensToThaw = ethers.parseEther('100') - await thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier, tokens: tokensToThaw }) - await expect(reprovision({ + await expect(HorizonStakingActions.reprovision({ horizonStaking, serviceProvider, verifier, diff --git a/packages/horizon/test/integration/after-transition-period/slasher.test.ts b/packages/horizon/test/integration/after-transition-period/slasher.test.ts index 25625feeb..d775be178 100644 --- a/packages/horizon/test/integration/after-transition-period/slasher.test.ts +++ b/packages/horizon/test/integration/after-transition-period/slasher.test.ts @@ -6,14 +6,7 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' - -import { - createProvision, - delegate, - slash, - stake, - thaw, -} from '../shared/staking' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' describe('Slasher', () => { let horizonStaking: IHorizonStaking @@ -23,8 +16,8 @@ describe('Slasher', () => { let verifier: HDNodeWallet let verifierDestination: string - const maxVerifierCut = 1000000 // 100% - const thawingPeriod = 2419200 // 28 days + const maxVerifierCut = 1000000n // 100% + const thawingPeriod = 2419200n // 28 days const provisionTokens = ethers.parseEther('10000') const delegationTokens = ethers.parseEther('1000') @@ -39,8 +32,8 @@ describe('Slasher', () => { verifierDestination = await ethers.Wallet.createRandom().getAddress() // Create provision - await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) - await createProvision({ + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier: verifier.address, @@ -53,7 +46,7 @@ describe('Slasher', () => { await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens * 3n) // Initialize delegation pool if it does not exist - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -77,7 +70,7 @@ describe('Slasher', () => { const verifierDestinationBalanceBefore = await graphToken.balanceOf(verifierDestination) // Slash provision - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier, serviceProvider: serviceProvider.address, @@ -98,7 +91,7 @@ describe('Slasher', () => { it('should slash service provider tokens when tokens are thawing', async () => { // Start thawing const thawTokens = ethers.parseEther('1000') - await thaw({ + await HorizonStakingActions.thaw({ horizonStaking, serviceProvider, verifier: verifier.address, @@ -111,7 +104,7 @@ describe('Slasher', () => { const verifierDestinationBalanceBefore = await graphToken.balanceOf(verifierDestination) // Slash provision - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier, serviceProvider: serviceProvider.address, @@ -141,8 +134,8 @@ describe('Slasher', () => { }) // Create provision for slashing verifier - await stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) - await createProvision({ + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: provisionTokens }) + await HorizonStakingActions.createProvision({ horizonStaking, serviceProvider, verifier: slashingVerifier.address, @@ -152,7 +145,7 @@ describe('Slasher', () => { }) // Initialize delegation pool for slashing verifier - await delegate({ + await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, @@ -166,7 +159,7 @@ describe('Slasher', () => { const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) // Slash the provision for all service provider and delegation pool tokens - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier: slashingVerifier, serviceProvider: serviceProvider.address, diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts index 1340569cf..869b1a3f5 100644 --- a/packages/horizon/test/integration/during-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/delegator.test.ts @@ -5,9 +5,9 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' import { delegators } from '../../../tasks/test/fixtures/delegators' -import { withdrawDelegatedLegacy } from '../shared/staking' describe('Delegator', () => { let horizonStaking: IHorizonStaking @@ -65,7 +65,7 @@ describe('Delegator', () => { const balanceBefore = await graphToken.balanceOf(delegator.address) // Withdraw tokens - await withdrawDelegatedLegacy({ + await HorizonStakingActions.withdrawDelegatedLegacy({ horizonStaking, delegator, serviceProvider: indexer, @@ -83,7 +83,7 @@ describe('Delegator', () => { it('should revert if the thawing period has not passed', async () => { // Withdraw tokens - await expect(withdrawDelegatedLegacy({ + await expect(HorizonStakingActions.withdrawDelegatedLegacy({ horizonStaking, delegator, serviceProvider: indexer, diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index 311c705c5..b8e9c087d 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -6,9 +6,9 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking, IRewardsManager } from '../../../typechain-types' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' +import { HorizonStakingExtensionActions } from 'hardhat-graph-protocol/sdk' -import { stake, unstake, withdraw } from '../shared/staking' -import { collect } from '../shared/stakingExtension' import { indexers } from '../../../tasks/test/fixtures/indexers' describe('Service Provider', () => { @@ -48,7 +48,7 @@ describe('Service Provider', () => { serviceProvider = signers[7] // Stake tokens to service provider - await stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) }) it('should allow service provider to unstake and withdraw after thawing period', async () => { @@ -56,7 +56,7 @@ describe('Service Provider', () => { const balanceBefore = await graphToken.balanceOf(serviceProvider.address) // First unstake request - await unstake({ horizonStaking, serviceProvider, tokens: tokensToUnstake }) + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: tokensToUnstake }) // During transition period, tokens are locked by thawing period const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() @@ -67,7 +67,7 @@ describe('Service Provider', () => { } // Now we can withdraw - await withdraw({ horizonStaking, serviceProvider }) + await HorizonStakingActions.withdraw({ horizonStaking, serviceProvider }) const balanceAfter = await graphToken.balanceOf(serviceProvider.address) expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') @@ -81,7 +81,7 @@ describe('Service Provider', () => { const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() // First unstake request - await unstake({ horizonStaking, serviceProvider, tokens: request1 }) + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: request1 }) // Mine half of thawing period blocks const halfThawingPeriod = Number(thawingPeriod) / 2 @@ -90,7 +90,7 @@ describe('Service Provider', () => { } // Second unstake request - await unstake({ horizonStaking, serviceProvider, tokens: request2 }) + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: request2 }) // Mine remaining blocks to complete first unstake thawing period for (let i = 0; i < halfThawingPeriod; i++) { @@ -99,7 +99,7 @@ describe('Service Provider', () => { // Check that withdraw reverts since thawing period is not complete await expect( - withdraw({ horizonStaking, serviceProvider }), + HorizonStakingActions.withdraw({ horizonStaking, serviceProvider }), ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingStillThawing') // Mine remaining blocks to complete thawing period @@ -111,7 +111,7 @@ describe('Service Provider', () => { const balanceBefore = await graphToken.balanceOf(serviceProvider.address) // Withdraw all thawed tokens - await withdraw({ horizonStaking, serviceProvider }) + await HorizonStakingActions.withdraw({ horizonStaking, serviceProvider }) // Verify all tokens are withdrawn and transferred back to service provider const balanceAfter = await graphToken.balanceOf(serviceProvider.address) @@ -142,7 +142,7 @@ describe('Service Provider', () => { } // Withdraw tokens - await withdraw({ horizonStaking, serviceProvider: indexer }) + await HorizonStakingActions.withdraw({ horizonStaking, serviceProvider: indexer }) // Verify tokens are transferred back to service provider const balanceAfter = await graphToken.balanceOf(indexer.address) @@ -216,7 +216,7 @@ describe('Service Provider', () => { const delegationPoolTokensBefore = delegationPoolBefore.tokens // Collect query fees - await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) + await HorizonStakingExtensionActions.collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) // Get idle stake after collecting const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) @@ -262,7 +262,7 @@ describe('Service Provider', () => { const delegationPoolTokensBefore = delegationPoolBefore.tokens // Collect query fees - await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) + await HorizonStakingExtensionActions.collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) // Get idle stake after collecting const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) @@ -350,7 +350,7 @@ describe('Service Provider', () => { const delegationPoolTokensBefore = delegationPoolBefore.tokens // Collect query fees - await collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) + await HorizonStakingExtensionActions.collect({ horizonStaking, graphToken, gateway, allocationID, tokens: tokensToCollect }) // Get rewards destination balance after collecting const balanceAfter = await graphToken.balanceOf(rewardsDestination) diff --git a/packages/horizon/test/integration/during-transition-period/slasher.test.ts b/packages/horizon/test/integration/during-transition-period/slasher.test.ts index b4d3d12d8..918b7b4fb 100644 --- a/packages/horizon/test/integration/during-transition-period/slasher.test.ts +++ b/packages/horizon/test/integration/during-transition-period/slasher.test.ts @@ -5,9 +5,9 @@ import hre from 'hardhat' import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' +import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' import { indexers } from '../../../tasks/test/fixtures/indexers' -import { slash } from '../shared/staking' describe('Slasher', () => { let horizonStaking: IHorizonStaking @@ -51,7 +51,7 @@ describe('Slasher', () => { const slasherBeforeBalance = await graphToken.balanceOf(slasher.address) // Slash tokens - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier: slasher, serviceProvider: indexer, @@ -83,7 +83,7 @@ describe('Slasher', () => { const slasherBeforeBalance = await graphToken.balanceOf(slasher.address) // Slash tokens - await slash({ + await HorizonStakingActions.slash({ horizonStaking, verifier: slasher, serviceProvider: indexer, From 59c78fd6f4649fd0588ed026ae4f1cc08def6bcd Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 26 Mar 2025 15:31:32 -0300 Subject: [PATCH 17/23] fix: renamed signerIndex to accountIndex --- packages/horizon/scripts/test/integration | 8 +++---- packages/horizon/tasks/deploy.ts | 8 +++---- .../horizon/tasks/test/transfer-onwership.ts | 4 ++-- packages/horizon/tasks/test/transitions.ts | 24 ++++++++++++++++--- .../permissionless.test.ts | 2 +- .../service-provider.test.ts | 2 +- 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/packages/horizon/scripts/test/integration b/packages/horizon/scripts/test/integration index 8648ea993..f5bfdf720 100755 --- a/packages/horizon/scripts/test/integration +++ b/packages/horizon/scripts/test/integration @@ -63,16 +63,16 @@ npx hardhat test:integration:pre-upgrade --network localhost npx hardhat test:integration:transfer-ownership --network localhost # Step 1 - Deployer -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 1 --signer-index 0 +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 1 --account-index 0 # Step 2 - Governor -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 2 --patch-config --signer-index 1 --hide-banner +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 2 --patch-config --account-index 1 --hide-banner # Step 3 - Deployer -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 3 --patch-config --signer-index 0 --hide-banner +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 3 --patch-config --account-index 0 --hide-banner # Step 4 - Governor -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 4 --patch-config --signer-index 1 --hide-banner +npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 4 --patch-config --account-index 1 --hide-banner # Unset subgraph service npx hardhat transition:unset-subgraph-service --network localhost --governor-index 1 diff --git a/packages/horizon/tasks/deploy.ts b/packages/horizon/tasks/deploy.ts index eeb7ee155..97cced326 100644 --- a/packages/horizon/tasks/deploy.ts +++ b/packages/horizon/tasks/deploy.ts @@ -9,7 +9,7 @@ import DeployModule from '../ignition/modules/deploy' task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon contracts - no data services deployed') .addOptionalParam('horizonConfig', 'Name of the Horizon configuration file to use. Format is "protocol..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', undefined, types.string) - .addOptionalParam('signerIndex', 'Index of the signer account in getSigners array', 0, types.int) + .addOptionalParam('accountIndex', 'Derivation path index for the account to use', 0, types.int) .setAction(async (args, hre: HardhatRuntimeEnvironment) => { const graph = hre.graph() @@ -21,7 +21,7 @@ task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon cont // Display the deployer -- this also triggers the secure accounts prompt if being used console.log('\n========== πŸ”‘ Deployer account ==========') const signers = await hre.ethers.getSigners() - const deployer = signers[args.signerIndex] + const deployer = signers[args.accountIndex] console.log('Using deployer account:', deployer.address) const balance = await hre.ethers.provider.getBalance(deployer.address) console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') @@ -49,7 +49,7 @@ task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon cont task('deploy:migrate', 'Upgrade an existing version of the Graph Protocol v1 to Horizon - no data services deployed') .addOptionalParam('horizonConfig', 'Name of the Horizon configuration file to use. Format is "migrate..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', undefined, types.string) .addOptionalParam('step', 'Migration step to run (1, 2, 3 or 4)', undefined, types.int) - .addOptionalParam('signerIndex', 'Index of the signer account in getSigners array', 0, types.int) + .addOptionalParam('accountIndex', 'Derivation path index for the account to use', 0, types.int) .addFlag('patchConfig', 'Patch configuration file using address book values - does not save changes') .addFlag('hideBanner', 'Hide the banner display') .setAction(async (args, hre: HardhatRuntimeEnvironment) => { @@ -80,7 +80,7 @@ task('deploy:migrate', 'Upgrade an existing version of the Graph Protocol v1 to // Display the deployer -- this also triggers the secure accounts prompt if being used console.log('\n========== πŸ”‘ Deployer account ==========') const signers = await hre.ethers.getSigners() - const deployer = signers[args.signerIndex] + const deployer = signers[args.accountIndex] console.log('Using deployer account:', deployer.address) const balance = await hre.ethers.provider.getBalance(deployer.address) console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') diff --git a/packages/horizon/tasks/test/transfer-onwership.ts b/packages/horizon/tasks/test/transfer-onwership.ts index d5add9761..5cf43481f 100644 --- a/packages/horizon/tasks/test/transfer-onwership.ts +++ b/packages/horizon/tasks/test/transfer-onwership.ts @@ -9,8 +9,8 @@ import { mergeABIs } from 'hardhat-graph-protocol/sdk' import { printBanner } from 'hardhat-graph-protocol/sdk' task('test:integration:transfer-ownership', 'Transfer ownership of protocol contracts to a new governor') - .addOptionalParam('governorIndex', 'Index of the new governor account in getSigners array', 1, types.int) - .addOptionalParam('slasherIndex', 'Index of the new slasher account in getSigners array', 2, types.int) + .addOptionalParam('governorIndex', 'Derivation path index for the new governor account', 1, types.int) + .addOptionalParam('slasherIndex', 'Derivation path index for the new slasher account', 2, types.int) .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') .setAction(async (taskArgs, hre) => { printBanner('TRANSFER OWNERSHIP') diff --git a/packages/horizon/tasks/test/transitions.ts b/packages/horizon/tasks/test/transitions.ts index 994c9e6e1..f2f9bf81d 100644 --- a/packages/horizon/tasks/test/transitions.ts +++ b/packages/horizon/tasks/test/transitions.ts @@ -4,10 +4,16 @@ import { ethers } from 'ethers' import { printBanner } from 'hardhat-graph-protocol/sdk' task('transition:unset-subgraph-service', 'Unsets the subgraph service in HorizonStaking') - .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) + .addOptionalParam('governorIndex', 'Derivation path index for the governor account', 0, types.int) + .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') .setAction(async (taskArgs, hre) => { printBanner('UNSETTING SUBGRAPH SERVICE') + // Check that we're on a local network + if (!taskArgs.skipNetworkCheck && hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { + throw new Error('This task can only be run on localhost or hardhat network. Use --skip-network-check to override (use with caution)') + } + const signers = await hre.ethers.getSigners() // eslint-disable-next-line @typescript-eslint/no-explicit-any const governor = signers[taskArgs.governorIndex] as any @@ -20,10 +26,16 @@ task('transition:unset-subgraph-service', 'Unsets the subgraph service in Horizo }) task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') - .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) + .addOptionalParam('governorIndex', 'Derivation path index for the governor account', 0, types.int) + .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') .setAction(async (taskArgs, hre) => { printBanner('CLEARING THAWING PERIOD') + // Check that we're on a local network + if (!taskArgs.skipNetworkCheck && hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { + throw new Error('This task can only be run on localhost or hardhat network. Use --skip-network-check to override (use with caution)') + } + const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking @@ -35,10 +47,16 @@ task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') }) task('transition:enable-delegation-slashing', 'Enables delegation slashing in HorizonStaking') - .addOptionalParam('governorIndex', 'Index of the governor account in getSigners array', 0, types.int) + .addOptionalParam('governorIndex', 'Derivation path index for the governor account', 0, types.int) + .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') .setAction(async (taskArgs, hre) => { printBanner('ENABLING DELEGATION SLASHING') + // Check that we're on a local network + if (!taskArgs.skipNetworkCheck && hre.network.name !== 'localhost' && hre.network.name !== 'hardhat') { + throw new Error('This task can only be run on localhost or hardhat network. Use --skip-network-check to override (use with caution)') + } + const signers = await hre.ethers.getSigners() const governor = signers[taskArgs.governorIndex] const horizonStaking = hre.graph().horizon!.contracts.HorizonStaking diff --git a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts index c319a5a04..dfe9465ae 100644 --- a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts +++ b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts @@ -49,7 +49,7 @@ describe('Permissionless', () => { allocationTokens = indexers[0].allocations[0].tokens }) - it('should allow any user to close an allocation with zero POI', async () => { + it('should allow any user to close an allocation with zero POI after 28 epochs', async () => { // Get indexer's idle stake before closing allocation const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index b8e9c087d..9d79e8ef0 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -284,7 +284,7 @@ describe('Service Provider', () => { }) }) - describe('With beneficiary', () => { + describe('With rewardsDestination set', () => { let delegationIndexingCut: number let delegationQueryFeeCut: number let rewardsDestination: string From a375b3abfb58cda2a9f70a25dd68b1b68226864e Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Wed, 26 Mar 2025 16:27:02 -0300 Subject: [PATCH 18/23] fix: added comments, change GRT asset holder for a minting account --- packages/horizon/tasks/test/pre-upgrade.ts | 51 +++++++++++-------- .../horizon/tasks/test/transfer-onwership.ts | 1 + 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/horizon/tasks/test/pre-upgrade.ts b/packages/horizon/tasks/test/pre-upgrade.ts index 36d19b056..fbfa04eed 100644 --- a/packages/horizon/tasks/test/pre-upgrade.ts +++ b/packages/horizon/tasks/test/pre-upgrade.ts @@ -3,23 +3,22 @@ import { task } from 'hardhat/config' import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import ControllerABI from '@graphprotocol/contracts/build/abis/Controller.json' import L2GraphTokenABI from '@graphprotocol/contracts/build/abis/L2GraphToken.json' import L2StakingABI from '@graphprotocol/contracts/build/abis/L2Staking.json' import StakingExtensionABI from '@graphprotocol/contracts/build/abis/StakingExtension.json' -import { IGraphToken, IStaking } from '@graphprotocol/contracts' +import { IController, IGraphToken, IStaking } from '@graphprotocol/contracts' import { mergeABIs } from 'hardhat-graph-protocol/sdk' import { printBanner } from 'hardhat-graph-protocol/sdk' import { delegators } from './fixtures/delegators' import { indexers } from './fixtures/indexers' -// The account on Arbitrum Sepolia that has GRT tokens -const GRT_HOLDER_ADDRESS = process.env.GRT_HOLDER_ADDRESS || '0xadE6B8EB69a49B56929C1d4F4b428d791861dB6f' - // Load ABIs const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) const graphTokenABI = L2GraphTokenABI +const controllerABI = ControllerABI task('test:integration:pre-upgrade', 'Sets up the pre-upgrade state for testing') .setAction(async (_, hre) => { @@ -50,37 +49,49 @@ task('test:integration:pre-upgrade', 'Sets up the pre-upgrade state for testing' const addressesJson = require('@graphprotocol/contracts/addresses.json') const arbSepoliaAddresses = addressesJson['421614'] - // Get contract addresses + // Get addresses const stakingAddress = arbSepoliaAddresses.L2Staking.address const graphTokenAddress = arbSepoliaAddresses.L2GraphToken.address + const controllerAddress = arbSepoliaAddresses.Controller.address console.log(`Using Staking contract at: ${stakingAddress}`) console.log(`Using GraphToken contract at: ${graphTokenAddress}`) // Create contract instances + // Note: Using ABIs directly instead of hre.graph().horizon because these are the old deployed contract instances const provider = new HardhatEthersProvider(hre.network.provider, hre.network.name) const GraphToken = new Contract(graphTokenAddress, graphTokenABI, provider) as unknown as IGraphToken const Staking = new Contract(stakingAddress, combinedStakingABI, provider) as unknown as IStaking + const Controller = new Contract(controllerAddress, controllerABI, provider) as unknown as IController - // The account on Arbitrum Sepolia that has GRT tokens - const assetHolderBalance = BigInt((await GraphToken.balanceOf(GRT_HOLDER_ADDRESS)).toString()) - console.log(`Asset holder balance: ${assetHolderBalance}`) - - // Convert BigNumber to bigint for comparison - if (assetHolderBalance < hre.ethers.parseEther('20000000')) { - throw new Error('Asset holder balance is less than 20M tokens') - } - - // Impersonate the account + // Use account 0 as the minter + const signers = await hre.ethers.getSigners() // eslint-disable-next-line @typescript-eslint/no-explicit-any - const grtHolder = await hre.ethers.getImpersonatedSigner(GRT_HOLDER_ADDRESS) as any + const minterAccount = signers[0] as any + console.log(`Using minter account: ${minterAccount.address}`) - // Fund with GRT signers from 0 to 19 with 1M tokens - console.log('Funding signers from 0 to 19 with 1M tokens...') - const signers = await hre.ethers.getSigners() + // Impersonate the governor to add minting permissions + const governorAddress = await Controller.getGovernor() + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const governorSigner = await hre.ethers.getImpersonatedSigner(governorAddress) as any + + // Add minting permissions for our minter account + console.log(`Adding minting permissions for ${minterAccount.address}...`) + const addMinterTx = await GraphToken.connect(governorSigner).addMinter(minterAccount.address) + await addMinterTx.wait() + console.log(`Successfully added minting permissions for ${minterAccount.address}`) + + // Mint tokens to our minter account + const mintAmount = hre.ethers.parseEther('50000000') // 50M tokens + console.log(`Minting ${mintAmount} tokens to ${minterAccount.address}...`) + const mintTx = await GraphToken.connect(minterAccount).mint(minterAccount.address, mintAmount) + await mintTx.wait() + + // Fund with GRT signers from 1 to 19 with 1M tokens + console.log('Funding signers from 1 to 19 with 1M tokens...') for (let i = 0; i < 20; i++) { const signer = signers[i] - const transferTx = await GraphToken.connect(grtHolder).transfer(signer.address, hre.ethers.parseEther('1000000')) + const transferTx = await GraphToken.connect(minterAccount).transfer(signer.address, hre.ethers.parseEther('1000000')) await transferTx.wait() } diff --git a/packages/horizon/tasks/test/transfer-onwership.ts b/packages/horizon/tasks/test/transfer-onwership.ts index 5cf43481f..d7ed1aea1 100644 --- a/packages/horizon/tasks/test/transfer-onwership.ts +++ b/packages/horizon/tasks/test/transfer-onwership.ts @@ -39,6 +39,7 @@ task('test:integration:transfer-ownership', 'Transfer ownership of protocol cont const combinedStakingABI = mergeABIs(L2StakingABI, StakingExtensionABI) // Get contracts + // Note: Using ABIs directly instead of hre.graph().horizon because these are the old deployed contract instances const staking = new Contract(stakingAddress, combinedStakingABI, hre.ethers.provider) as unknown as IStaking const controller = hre.graph().horizon!.contracts.Controller const graphProxyAdmin = hre.graph().horizon!.contracts.GraphProxyAdmin From 2bcd0d2a98e072ce30b9b508e5a046b88048f265 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Thu, 27 Mar 2025 10:42:05 -0300 Subject: [PATCH 19/23] chore: added more tests for service provider during transition period --- .../deployments/horizon/actions/staking.ts | 20 +++- .../horizon/tasks/test/fixtures/indexers.ts | 10 ++ .../add-to-delegation-pool.test.ts | 2 +- .../service-provider.test.ts | 111 +++++++++++++++++- 4 files changed, 138 insertions(+), 5 deletions(-) diff --git a/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts index 58db1ad0d..03598cb91 100644 --- a/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts +++ b/packages/hardhat-graph-protocol/src/sdk/deployments/horizon/actions/staking.ts @@ -28,7 +28,8 @@ export const HorizonStakingActions = { withdrawDelegated, withdrawDelegatedLegacy, createProvision, - addToProvision + addToProvision, + clearThawingPeriod, } /* ////////////////////////////////////////////////////////////// @@ -435,6 +436,23 @@ async function addToDelegationPool({ await addToDelegationPoolTx.wait() } +/* //////////////////////////////////////////////////////////// + THAWING PERIOD +////////////////////////////////////////////////////////////// */ + +interface ClearThawingPeriodParams { + horizonStaking: IHorizonStaking + governor: HardhatEthersSigner +} + +async function clearThawingPeriod({ + horizonStaking, + governor, +}: ClearThawingPeriodParams): Promise { + const clearThawingPeriodTx = await horizonStaking.connect(governor).clearThawingPeriod() + await clearThawingPeriodTx.wait() +} + /* //////////////////////////////////////////////////////////// HELPER FUNCTIONS ////////////////////////////////////////////////////////////// */ diff --git a/packages/horizon/tasks/test/fixtures/indexers.ts b/packages/horizon/tasks/test/fixtures/indexers.ts index 74068c0d5..6580b3ed0 100644 --- a/packages/horizon/tasks/test/fixtures/indexers.ts +++ b/packages/horizon/tasks/test/fixtures/indexers.ts @@ -36,6 +36,9 @@ const INDEXER_TWO_FIRST_ALLOCATION_PRIVATE_KEY = '0x80ff89a67cf4b41ea3ece2574b72 const INDEXER_TWO_SECOND_ALLOCATION_ID = '0x63280ec9EA63859b7e2041f07a549F311C86B3bd' const INDEXER_TWO_SECOND_ALLOCATION_PRIVATE_KEY = '0xab6cb9dbb3646a856e6cac2c0e2a59615634e93cde11385eb6c6ba58e2873a46' +// Indexer three data +const INDEXER_THREE_ADDRESS = '0x28a8746e75304c0780E011BEd21C72cD78cd535E' // Hardhat account #6 + // Subgraph deployment IDs const SUBGRAPH_DEPLOYMENT_ID_ONE = '0x02cd85012c1f075fd58fad178fd23ab841d3b5ddcf5cd3377c30118da97cb2a4' const SUBGRAPH_DEPLOYMENT_ID_TWO = '0x03ca89485a59894f1acfa34660c69024b6b90ce45171dece7662b0886bc375c7' @@ -91,4 +94,11 @@ export const indexers: Indexer[] = [ }, ], }, + { + address: INDEXER_THREE_ADDRESS, + stake: parseEther('1000000'), + indexingRewardCut: 800000, // 80% + queryFeeCut: 800000, // 80% + allocations: [], + }, ] diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts index eb48e16ce..c050c5bd1 100644 --- a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts @@ -26,7 +26,7 @@ describe('Add to delegation pool', () => { graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken const signers = await ethers.getSigners() - serviceProvider = signers[7] + serviceProvider = signers[8] delegator = signers[13] signer = signers[19] verifier = await ethers.Wallet.createRandom().getAddress() diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index 9d79e8ef0..924eb6845 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -40,12 +40,11 @@ describe('Service Provider', () => { describe(('New Protocol Users'), () => { let serviceProvider: SignerWithAddress - - const tokensToStake = ethers.parseEther('1000') + let tokensToStake = ethers.parseEther('1000') before(async () => { const signers = await ethers.getSigners() - serviceProvider = signers[7] + serviceProvider = signers[8] // Stake tokens to service provider await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) @@ -117,6 +116,68 @@ describe('Service Provider', () => { const balanceAfter = await graphToken.balanceOf(serviceProvider.address) expect(balanceAfter).to.equal(balanceBefore + request1 + request2, 'Tokens were not transferred back to service provider') }) + + describe('Transition period is over', () => { + let governor: SignerWithAddress + let tokensToUnstake: bigint + + before(async () => { + // Get governor + const signers = await ethers.getSigners() + governor = signers[1] + + // Set tokens + tokensToStake = ethers.parseEther('100000') + tokensToUnstake = ethers.parseEther('10000') + }) + + it('should be able to withdraw tokens that were unstaked during transition period', async () => { + // Stake tokens + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) + + // Unstake tokens + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: tokensToUnstake }) + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Get thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Clear thawing period + await HorizonStakingActions.clearThawingPeriod({ horizonStaking, governor }) + + // Mine blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Withdraw tokens + await HorizonStakingActions.withdraw({ horizonStaking, serviceProvider }) + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') + }) + + it('should be able to unstake tokens without a thawing period', async () => { + // Stake tokens + await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: tokensToStake }) + + // Clear thawing period + await HorizonStakingActions.clearThawingPeriod({ horizonStaking, governor }) + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Unstake tokens + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider, tokens: tokensToUnstake }) + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') + }) + }) }) describe('Existing Protocol Users', () => { @@ -372,5 +433,49 @@ describe('Service Provider', () => { }) }) }) + + describe('Transition period is over', () => { + let governor: SignerWithAddress + let tokensToUnstake: bigint + + before(async () => { + // Get governor + const signers = await ethers.getSigners() + governor = signers[1] + + // Get indexer + const indexerFixture = indexers[2] + indexer = await ethers.getSigner(indexerFixture.address) + + // Set tokens + tokensToUnstake = ethers.parseEther('10000') + }) + + it('should be able to withdraw tokens that were unstaked during transition period', async () => { + // Unstake tokens during transition period + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider: indexer, tokens: tokensToUnstake }) + + // Get thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Clear thawing period + await HorizonStakingActions.clearThawingPeriod({ horizonStaking, governor }) + + // Mine blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Withdraw tokens + await HorizonStakingActions.withdraw({ horizonStaking, serviceProvider: indexer }) + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') + }) + }) }) }) From dea25614c8e64f8ec8a124f0e4aeee24202059c4 Mon Sep 17 00:00:00 2001 From: Miguel de Elias Date: Fri, 28 Mar 2025 18:38:38 -0300 Subject: [PATCH 20/23] chore: added more service provider and delegators tests --- .../after-transition-period/delegator.test.ts | 586 +++++++++++------- .../service-provider.test.ts | 71 ++- .../delegator.test.ts | 72 +++ 3 files changed, 487 insertions(+), 242 deletions(-) diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts index 47fc5a93c..1f9c1443c 100644 --- a/packages/horizon/test/integration/after-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -7,6 +7,8 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers' import { IGraphToken, IHorizonStaking } from '../../../typechain-types' import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' +import { delegators } from '../../../tasks/test/fixtures/delegators' + describe('Delegator', () => { let horizonStaking: IHorizonStaking let graphToken: IGraphToken @@ -20,6 +22,9 @@ describe('Delegator', () => { const thawingPeriod = 2419200n // 28 days const tokens = ethers.parseEther('100000') + // TODO: FIX THIS + const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + before(async () => { const graph = hre.graph() @@ -44,213 +49,143 @@ describe('Delegator', () => { thawingPeriod, }) - // Send eth to delegator and new service provider to cover gas fees - await serviceProvider.sendTransaction({ - to: delegator.address, - value: ethers.parseEther('0.04'), - }) - await serviceProvider.sendTransaction({ - to: newServiceProvider.address, - value: ethers.parseEther('0.04'), - }) - // Send GRT to delegator and new service provider to use for delegation and staking await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) await graphToken.connect(serviceProvider).transfer(newServiceProvider.address, tokens) }) - it('should allow delegator to delegate to a service provider and verifier, undelegate and withdraw tokens', async () => { - const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) - const delegationTokens = ethers.parseEther('1000') - - // Delegate tokens to the service provider and verifier - await HorizonStakingActions.delegate({ - horizonStaking, - graphToken, - delegator, - serviceProvider, - verifier, - tokens: delegationTokens, - minSharesOut: 0n, - }) - - // Verify delegation tokens were added to the delegation pool - const delegationPool = await horizonStaking.getDelegationPool( - serviceProvider.address, - verifier, - ) - expect(delegationPool.tokens).to.equal(delegationTokens, 'Delegation tokens were not added to the delegation pool') - - // Verify delegation shares were minted, since it's the first delegation - // shares should be equal to tokens - const delegation = await horizonStaking.getDelegation( - serviceProvider.address, - verifier, - delegator.address, - ) - expect(delegation.shares).to.equal(delegationTokens, 'Delegation shares were not minted correctly') - - // Undelegate tokens - await HorizonStakingActions.undelegate({ - horizonStaking, - delegator, - serviceProvider, - verifier, - shares: delegationTokens, - }) - - // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) - await ethers.provider.send('evm_mine', []) - - // Withdraw tokens - await HorizonStakingActions.withdrawDelegated({ - horizonStaking, - delegator, - serviceProvider, - verifier, - nThawRequests: BigInt(1), - }) - - // Delegator should have received their tokens back - expect(await graphToken.balanceOf(delegator.address)).to.equal(delegatorBalanceBefore, 'Delegator balance should be the same as before delegation') - }) - - it('should revert when delegating to an invalid provision', async () => { - const delegateTokens = ethers.parseEther('1000') - const invalidVerifier = await ethers.Wallet.createRandom().getAddress() - - await expect( - HorizonStakingActions.delegate({ - horizonStaking, - graphToken, - delegator, - serviceProvider, - verifier: invalidVerifier, - tokens: delegateTokens, - minSharesOut: 0n, - }), - ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidProvision') - }) - - it('should revert when delegating less than minimum delegation', async () => { - const minDelegation = ethers.parseEther('1') - - await expect( - HorizonStakingActions.delegate({ - horizonStaking, - graphToken, - delegator, - serviceProvider, - verifier, - tokens: minDelegation - 1n, - minSharesOut: 0n, - }), - ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientDelegationTokens') - }) - - describe('Delegation pool already exists', () => { - const newProvisionTokens = ethers.parseEther('10000') - const delegationPoolTokens = ethers.parseEther('1000') + describe('New Protocol Users', () => { + it('should allow delegator to delegate to a service provider and verifier, undelegate and withdraw tokens', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationTokens = ethers.parseEther('1000') - before(async () => { - // Delegate tokens to initialize the delegation pool + // Delegate tokens to the service provider and verifier await HorizonStakingActions.delegate({ horizonStaking, graphToken, delegator, serviceProvider, verifier, - tokens: delegationPoolTokens, + tokens: delegationTokens, minSharesOut: 0n, }) - // Create new provision for a new service provider and verifier combo - await HorizonStakingActions.stake({ - horizonStaking, - graphToken, - serviceProvider: newServiceProvider, - tokens: newProvisionTokens, - }) - await HorizonStakingActions.createProvision({ - horizonStaking, - serviceProvider: newServiceProvider, - verifier: newVerifier, - tokens: newProvisionTokens, - maxVerifierCut, - thawingPeriod, - }) - }) + // Verify delegation tokens were added to the delegation pool + const delegationPool = await horizonStaking.getDelegationPool( + serviceProvider.address, + verifier, + ) + expect(delegationPool.tokens).to.equal(delegationTokens, 'Delegation tokens were not added to the delegation pool') - it('should allow delegator to undelegate and redelegate to new provider and verifier', async () => { - // Undelegate 20% of delegator's shares + // Verify delegation shares were minted, since it's the first delegation + // shares should be equal to tokens const delegation = await horizonStaking.getDelegation( serviceProvider.address, verifier, delegator.address, ) - const undelegateShares = delegation.shares / 5n + expect(delegation.shares).to.equal(delegationTokens, 'Delegation shares were not minted correctly') + // Undelegate tokens await HorizonStakingActions.undelegate({ horizonStaking, delegator, serviceProvider, verifier, - shares: undelegateShares, + shares: delegationTokens, }) // Wait for thawing period await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) await ethers.provider.send('evm_mine', []) - await HorizonStakingActions.redelegate({ + // Withdraw tokens + await HorizonStakingActions.withdrawDelegated({ horizonStaking, delegator, serviceProvider, verifier, - newServiceProvider, - newVerifier, - minSharesForNewProvider: 0n, nThawRequests: BigInt(1), }) - // Verify delegation shares were transferred to the new service provider - const delegationPool = await horizonStaking.getDelegationPool( - newServiceProvider.address, - newVerifier, - ) - expect(delegationPool.tokens).to.equal(undelegateShares, 'Delegation tokens were not transferred to the new service provider') + // Delegator should have received their tokens back + expect(await graphToken.balanceOf(delegator.address)).to.equal(delegatorBalanceBefore, 'Delegator balance should be the same as before delegation') + }) - const newDelegation = await horizonStaking.getDelegation( - newServiceProvider.address, - newVerifier, - delegator.address, - ) - expect(newDelegation.shares).to.equal(undelegateShares, 'Delegation shares were not transferred to the new service provider') + it('should revert when delegating to an invalid provision', async () => { + const delegateTokens = ethers.parseEther('1000') + const invalidVerifier = await ethers.Wallet.createRandom().getAddress() + + await expect( + HorizonStakingActions.delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier: invalidVerifier, + tokens: delegateTokens, + minSharesOut: 0n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidProvision') }) - it('should handle multiple undelegations with nThawRequests = 0', async () => { - const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) - const delegationPool = await horizonStaking.getDelegationPool( - serviceProvider.address, - verifier, - ) + it('should revert when delegating less than minimum delegation', async () => { + const minDelegation = ethers.parseEther('1') - const delegation = await horizonStaking.getDelegation( - serviceProvider.address, - verifier, - delegator.address, - ) - const undelegateShares = delegation.shares / 10n + await expect( + HorizonStakingActions.delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens: minDelegation - 1n, + minSharesOut: 0n, + }), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientDelegationTokens') + }) - let totalExpectedTokens = 0n - let remainingShares = delegation.shares - let remainingPoolTokens = delegationPool.tokens + describe('Delegation pool already exists', () => { + const newProvisionTokens = ethers.parseEther('10000') + const delegationPoolTokens = ethers.parseEther('1000') + + before(async () => { + // Delegate tokens to initialize the delegation pool + await HorizonStakingActions.delegate({ + horizonStaking, + graphToken, + delegator, + serviceProvider, + verifier, + tokens: delegationPoolTokens, + minSharesOut: 0n, + }) + + // Create new provision for a new service provider and verifier combo + await HorizonStakingActions.stake({ + horizonStaking, + graphToken, + serviceProvider: newServiceProvider, + tokens: newProvisionTokens, + }) + await HorizonStakingActions.createProvision({ + horizonStaking, + serviceProvider: newServiceProvider, + verifier: newVerifier, + tokens: newProvisionTokens, + maxVerifierCut, + thawingPeriod, + }) + }) - // Undelegate shares in 3 different transactions - for (let i = 0; i < 3; i++) { - const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares - totalExpectedTokens += tokensOut + it('should allow delegator to undelegate and redelegate to new provider and verifier', async () => { + // Undelegate 20% of delegator's shares + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 5n await HorizonStakingActions.undelegate({ horizonStaking, @@ -260,50 +195,152 @@ describe('Delegator', () => { shares: undelegateShares, }) - remainingShares -= undelegateShares - remainingPoolTokens -= tokensOut - } + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) - // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) - await ethers.provider.send('evm_mine', []) + await HorizonStakingActions.redelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + newServiceProvider, + newVerifier, + minSharesForNewProvider: 0n, + nThawRequests: BigInt(1), + }) - // Withdraw all thaw requests - await HorizonStakingActions.withdrawDelegated({ - horizonStaking, - delegator, - serviceProvider, - verifier, - nThawRequests: BigInt(0), // Withdraw all + // Verify delegation shares were transferred to the new service provider + const delegationPool = await horizonStaking.getDelegationPool( + newServiceProvider.address, + newVerifier, + ) + expect(delegationPool.tokens).to.equal(undelegateShares, 'Delegation tokens were not transferred to the new service provider') + + const newDelegation = await horizonStaking.getDelegation( + newServiceProvider.address, + newVerifier, + delegator.address, + ) + expect(newDelegation.shares).to.equal(undelegateShares, 'Delegation shares were not transferred to the new service provider') }) - // Verify tokens were transferred to delegator - expect(await graphToken.balanceOf(delegator.address)) - .to.equal(delegatorBalanceBefore + totalExpectedTokens, 'Delegator balance should be the same as before delegation') - }) + it('should handle multiple undelegations with nThawRequests = 0', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationPool = await horizonStaking.getDelegationPool( + serviceProvider.address, + verifier, + ) - it('should handle multiple undelegations with nThawRequests = 1', async () => { - const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) - const delegationPool = await horizonStaking.getDelegationPool( - serviceProvider.address, - verifier, - ) + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 10n + + let totalExpectedTokens = 0n + let remainingShares = delegation.shares + let remainingPoolTokens = delegationPool.tokens + + // Undelegate shares in 3 different transactions + for (let i = 0; i < 3; i++) { + const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares + totalExpectedTokens += tokensOut + + await HorizonStakingActions.undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares: undelegateShares, + }) + + remainingShares -= undelegateShares + remainingPoolTokens -= tokensOut + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Withdraw all thaw requests + await HorizonStakingActions.withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests: BigInt(0), // Withdraw all + }) - const delegation = await horizonStaking.getDelegation( - serviceProvider.address, - verifier, - delegator.address, - ) - const undelegateShares = delegation.shares / 10n + // Verify tokens were transferred to delegator + expect(await graphToken.balanceOf(delegator.address)) + .to.equal(delegatorBalanceBefore + totalExpectedTokens, 'Delegator balance should be the same as before delegation') + }) + + it('should handle multiple undelegations with nThawRequests = 1', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationPool = await horizonStaking.getDelegationPool( + serviceProvider.address, + verifier, + ) - let totalExpectedTokens = 0n - let remainingShares = delegation.shares - let remainingPoolTokens = delegationPool.tokens + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 10n + + let totalExpectedTokens = 0n + let remainingShares = delegation.shares + let remainingPoolTokens = delegationPool.tokens + + // Undelegate shares in 3 different transactions + for (let i = 0; i < 3; i++) { + const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares + totalExpectedTokens += tokensOut + + await HorizonStakingActions.undelegate({ + horizonStaking, + delegator, + serviceProvider, + verifier, + shares: undelegateShares, + }) + + remainingShares -= undelegateShares + remainingPoolTokens -= tokensOut + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Withdraw each thaw request individually + for (let i = 0; i < 3; i++) { + await HorizonStakingActions.withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests: BigInt(1), // Withdraw one thaw request at a time + }) + } + + // Verify tokens were transferred to delegator + expect(await graphToken.balanceOf(delegator.address)) + .to.equal(delegatorBalanceBefore + totalExpectedTokens, 'Delegator balance should be the same as before delegation') + }) - // Undelegate shares in 3 different transactions - for (let i = 0; i < 3; i++) { - const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares - totalExpectedTokens += tokensOut + it('should not revert when withdrawing before thawing period', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegation = await horizonStaking.getDelegation( + serviceProvider.address, + verifier, + delegator.address, + ) + const undelegateShares = delegation.shares / 10n await HorizonStakingActions.undelegate({ horizonStaking, @@ -313,60 +350,135 @@ describe('Delegator', () => { shares: undelegateShares, }) - remainingShares -= undelegateShares - remainingPoolTokens -= tokensOut - } + await expect( + HorizonStakingActions.withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider, + verifier, + nThawRequests: BigInt(1), + }), + ).to.not.be.reverted + + // Verify tokens were not transferred to delegator + expect(await graphToken.balanceOf(delegator.address)) + .to.equal(delegatorBalanceBefore, 'Delegator balance should be the same as before delegation') + }) + }) + }) - // Wait for thawing period - await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) - await ethers.provider.send('evm_mine', []) + describe('Existing Protocol Users', () => { + let indexer: SignerWithAddress + let existingDelegator: SignerWithAddress + let delegatedTokens: bigint - // Withdraw each thaw request individually - for (let i = 0; i < 3; i++) { - await HorizonStakingActions.withdrawDelegated({ - horizonStaking, - delegator, - serviceProvider, - verifier, - nThawRequests: BigInt(1), // Withdraw one thaw request at a time - }) - } + let snapshotId: string - // Verify tokens were transferred to delegator - expect(await graphToken.balanceOf(delegator.address)) - .to.equal(delegatorBalanceBefore + totalExpectedTokens, 'Delegator balance should be the same as before delegation') + before(async () => { + // Get indexer + indexer = await ethers.getSigner(delegators[0].delegations[0].indexerAddress) + + // Get delegator + existingDelegator = await ethers.getSigner(delegators[0].address) + + // Get delegated tokens + delegatedTokens = delegators[0].delegations[0].tokens }) - it('should not revert when withdrawing before thawing period', async () => { - const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('should be able to undelegate and withdraw tokens after the transition period', async () => { + // Get delegator's delegation const delegation = await horizonStaking.getDelegation( - serviceProvider.address, - verifier, - delegator.address, + indexer.address, + subgraphServiceAddress, + existingDelegator.address, ) - const undelegateShares = delegation.shares / 10n + // Undelegate tokens await HorizonStakingActions.undelegate({ horizonStaking, - delegator, - serviceProvider, - verifier, - shares: undelegateShares, + delegator: existingDelegator, + serviceProvider: indexer, + verifier: subgraphServiceAddress, + shares: delegation.shares, }) - await expect( - HorizonStakingActions.withdrawDelegated({ + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod) + 1]) + await ethers.provider.send('evm_mine', []) + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(existingDelegator.address) + + // Withdraw tokens + await HorizonStakingActions.withdrawDelegated({ + horizonStaking, + delegator: existingDelegator, + serviceProvider: indexer, + verifier: subgraphServiceAddress, + nThawRequests: BigInt(1), + }) + + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(existingDelegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + // because the delegation was before the horizon upgrade, after the upgrade there is no tax + const expectedBalanceAfter = balanceBefore + delegatedTokens - (delegatedTokens * 5000n / 1000000n) + + // Verify tokens were transferred to delegator + expect(balanceAfter).to.equal(expectedBalanceAfter, 'Tokens were not transferred to delegator') + }) + + describe('Undelegated before horizon upgrade', () => { + before(async () => { + const delegatorFixture = delegators[2] + const delegationFixture = delegatorFixture.delegations[0] + + // Get signers + indexer = await ethers.getSigner(delegationFixture.indexerAddress) + existingDelegator = await ethers.getSigner(delegatorFixture.address) + + // Verify delegator is undelegated + expect(delegatorFixture.undelegate).to.be.true + }) + + it('should allow delegator to withdraw tokens undelegated before horizon upgrade', async () => { + // Mine remaining blocks to complete thawing period + const oldThawingPeriod = 6646 + for (let i = 0; i < oldThawingPeriod + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(existingDelegator.address) + + // Withdraw tokens + await HorizonStakingActions.withdrawDelegatedLegacy({ horizonStaking, - delegator, - serviceProvider, - verifier, - nThawRequests: BigInt(1), - }), - ).to.not.be.reverted + delegator: existingDelegator, + serviceProvider: indexer, + }) - // Verify tokens were not transferred to delegator - expect(await graphToken.balanceOf(delegator.address)) - .to.equal(delegatorBalanceBefore, 'Delegator balance should be the same as before delegation') + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(existingDelegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + // because the delegation was before the horizon upgrade, after the upgrade there is no tax + const expectedBalanceAfter = balanceBefore + tokens - (tokens * 5000n / 1000000n) + + // Verify tokens were transferred to delegator + expect(balanceAfter).to.equal(expectedBalanceAfter, 'Tokens were not transferred to delegator') + }) }) }) }) diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts index d8c8309f8..2f6f1090b 100644 --- a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -8,11 +8,12 @@ import { IGraphToken, IHorizonStaking } from '../../../typechain-types' import { HorizonStakingActions } from 'hardhat-graph-protocol/sdk' import { HorizonTypes } from 'hardhat-graph-protocol/sdk' +import { indexers } from '../../../tasks/test/fixtures/indexers' + describe('Service provider', () => { let horizonStaking: IHorizonStaking let graphToken: IGraphToken let verifier: string - let serviceProvider: SignerWithAddress const thawingPeriod = 2419200n before(async () => { @@ -21,14 +22,18 @@ describe('Service provider', () => { horizonStaking = graph.horizon!.contracts.HorizonStaking as unknown as IHorizonStaking graphToken = graph.horizon!.contracts.L2GraphToken as unknown as IGraphToken - verifier = await ethers.Wallet.createRandom().getAddress(); - - [serviceProvider] = await ethers.getSigners() + verifier = await ethers.Wallet.createRandom().getAddress() }) - describe('Service provider', () => { + describe('New Protocol Users', () => { + let serviceProvider: SignerWithAddress const stakeAmount = ethers.parseEther('1000') + before(async () => { + const signers = await ethers.getSigners() + serviceProvider = signers[8] + }) + it('should allow staking tokens and unstake right after', async () => { const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) await HorizonStakingActions.stake({ horizonStaking, graphToken, serviceProvider, tokens: stakeAmount }) @@ -299,4 +304,60 @@ describe('Service provider', () => { }) }) }) + + describe('Existing Protocol Users', () => { + let indexer: SignerWithAddress + let tokensToUnstake: bigint + let snapshotId: string + + before(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Set tokens + tokensToUnstake = ethers.parseEther('10000') + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('should be able to unstake tokens without thawing', async () => { + // Get balance before unstaking + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Unstake tokens + await HorizonStakingActions.unstake({ horizonStaking, serviceProvider: indexer, tokens: tokensToUnstake }) + + // Verify tokens are transferred back to service provider + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') + }) + + it('should be able to withdraw locked tokens after thawing period', async () => { + const oldThawingPeriod = 6646 + + // Mine blocks to complete thawing period + for (let i = 0; i < oldThawingPeriod + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Withdraw tokens + await HorizonStakingActions.withdraw({ horizonStaking, serviceProvider: indexer }) + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal(balanceBefore + tokensToUnstake, 'Tokens were not transferred back to service provider') + }) + }) }) diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts index 869b1a3f5..1f369dd7e 100644 --- a/packages/horizon/test/integration/during-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/delegator.test.ts @@ -14,6 +14,11 @@ describe('Delegator', () => { let graphToken: IGraphToken let snapshotId: string + const thawingPeriod = 2419200n // 28 days + + // TODO: FIX THIS + const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + before(() => { const graph = hre.graph() @@ -90,5 +95,72 @@ describe('Delegator', () => { })).to.be.revertedWith('!tokens') }) }) + + describe('Transition period is over', () => { + let governor: SignerWithAddress + let indexer: SignerWithAddress + let delegator: SignerWithAddress + let tokens: bigint + + before(async () => { + const delegatorFixture = delegators[0] + const delegationFixture = delegatorFixture.delegations[0] + + // Get signers + governor = (await ethers.getSigners())[1] + indexer = await ethers.getSigner(delegationFixture.indexerAddress) + delegator = await ethers.getSigner(delegatorFixture.address) + + // Get tokens + tokens = delegationFixture.tokens + }) + + it('should be able to undelegate during transition period and withdraw after transition period', async () => { + // Get delegator's delegation + const delegation = await horizonStaking.getDelegation( + indexer.address, + subgraphServiceAddress, + delegator.address, + ) + + // Undelegate tokens + await HorizonStakingActions.undelegate({ + horizonStaking, + delegator, + serviceProvider: indexer, + verifier: subgraphServiceAddress, + shares: delegation.shares, + }) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod) + 1]) + await ethers.provider.send('evm_mine', []) + + // Clear thawing period + await HorizonStakingActions.clearThawingPeriod({ horizonStaking, governor }) + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(delegator.address) + + // Withdraw tokens + await HorizonStakingActions.withdrawDelegated({ + horizonStaking, + delegator, + serviceProvider: indexer, + verifier: subgraphServiceAddress, + nThawRequests: BigInt(1), + }) + + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(delegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + // because the delegation was before the horizon upgrade, after the upgrade there is no tax + const expectedBalanceAfter = balanceBefore + tokens - (tokens * 5000n / 1000000n) + + // Verify tokens are withdrawn + expect(balanceAfter).to.equal(expectedBalanceAfter) + }) + }) }) }) From aa51cf1f1672fc8149bcc363ed41fb90b8d302dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Thu, 3 Apr 2025 12:06:07 -0300 Subject: [PATCH 21/23] chore: rebase cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: TomΓ‘s Migone --- packages/horizon/package.json | 3 +- yarn.lock | 67 ++++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/packages/horizon/package.json b/packages/horizon/package.json index 5249e17e4..3266ca1ed 100644 --- a/packages/horizon/package.json +++ b/packages/horizon/package.json @@ -19,9 +19,8 @@ "lint:sol:natspec": "natspec-smells --config natspec-smells.config.js", "clean": "rm -rf build dist cache cache_forge typechain-types", "build": "hardhat compile", - "test": "forge test && hardhat test:integration --deploy-type deploy", + "test": "forge test", "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test", - "test:e2e": "./scripts/e2e/e2e", "test:integration": "./scripts/test/integration" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 99d80b378..81dc5fc63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7092,6 +7092,19 @@ __metadata: languageName: node linkType: hard +"abitype@npm:0.7.1": + version: 0.7.1 + resolution: "abitype@npm:0.7.1" + peerDependencies: + typescript: ">=4.9.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + checksum: c95386afc8438b29d09fcb6d7bc3a457958ab0a472483a363bdb9bf9f42e1b90ab5b05a16f04b653ad0bf79f4451233fe35fc6c7a04b66cb4eba9df7d8e49f12 + languageName: node + linkType: hard + "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -7889,7 +7902,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.4.0, axios@npm:^1.5.1, axios@npm:^1.6.7": +"axios@npm:^1.4.0, axios@npm:^1.5.1, axios@npm:^1.6.7, axios@npm:^1.6.8": version: 1.8.4 resolution: "axios@npm:1.8.4" dependencies: @@ -10246,6 +10259,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^12.0.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + "commander@npm:^13.1.0": version: 13.1.0 resolution: "commander@npm:13.1.0" @@ -13159,6 +13179,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:3.3.2": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + "fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" @@ -18382,7 +18415,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -27018,6 +27051,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:17.7.2, yargs@npm:^17.0.0, yargs@npm:^17.7.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + "yargs@npm:^10.0.3": version: 10.1.2 resolution: "yargs@npm:10.1.2" @@ -27072,21 +27120,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.7.1": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - "yargs@npm:^4.7.1": version: 4.8.1 resolution: "yargs@npm:4.8.1" From 7016cf93dd11cc89cc9ab82dfce5752b7352a29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Thu, 3 Apr 2025 14:55:57 -0300 Subject: [PATCH 22/23] chore: add arbitrum sepolia addresses to horizon address book MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: TomΓ‘s Migone --- packages/horizon/addresses.json | 35 ++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/horizon/addresses.json b/packages/horizon/addresses.json index 7a73a41bf..f8d6ee575 100644 --- a/packages/horizon/addresses.json +++ b/packages/horizon/addresses.json @@ -1,2 +1,35 @@ { -} \ No newline at end of file + "421614": { + "Controller": { + "address": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695" + }, + "EpochManager": { + "address": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "proxy": "graph", + "implementation": "0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da" + }, + "L2Curation": { + "address": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "proxy": "graph", + "implementation": "0xd90022aB67920212D0F902F5c427DE82732DE136" + }, + "RewardsManager": { + "address": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", + "proxy": "graph", + "implementation": "0x714B54e5249C90414fecA240e2F5B618C243F0aE" + }, + "L2GraphTokenGateway": { + "address": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + "proxy": "graph", + "implementation": "0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC" + }, + "L2GraphToken": { + "address": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "proxy": "graph", + "implementation": "0x4cf968bA38b43dd10be114daa7959C1b369479e5" + }, + "GraphProxyAdmin": { + "address": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C" + } + } + } \ No newline at end of file From a2ad15a56a90e34490de3b7d72efd2aef8688b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Thu, 3 Apr 2025 16:46:20 -0300 Subject: [PATCH 23/23] chore: couple fixes due to rebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: TomΓ‘s Migone --- .../src/sdk/hardhat.base.config.ts | 9 ++---- ...e-test.json5 => migrate.integration.json5} | 28 +++++++------------ packages/horizon/scripts/test/integration | 19 +++++++------ .../after-transition-period/delegator.test.ts | 4 +-- .../delegator.test.ts | 6 ++-- .../during-transition-period/operator.test.ts | 4 +-- .../service-provider.test.ts | 4 +-- 7 files changed, 33 insertions(+), 41 deletions(-) rename packages/horizon/ignition/configs/{migrate.e2e-test.json5 => migrate.integration.json5} (75%) diff --git a/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts index 2d0583fb2..048ae999a 100644 --- a/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts +++ b/packages/hardhat-graph-protocol/src/sdk/hardhat.base.config.ts @@ -76,12 +76,9 @@ export const networksUserConfig: BaseNetworksUserConfig = { secureAccounts: { enabled: true, }, - ...(vars.has('FORK') && vars.get('FORK') === 'true' - ? { accounts: 'remote' } - : vars.has('LOCALHOST_ACCOUNTS_MNEMONIC') - ? { accounts: { mnemonic: vars.get('LOCALHOST_ACCOUNTS_MNEMONIC') } } - : {} - ), + ...(vars.has('LOCALHOST_ACCOUNTS_MNEMONIC') && { + accounts: { mnemonic: vars.get('LOCALHOST_ACCOUNTS_MNEMONIC') }, + }), deployments: { horizon: resolveAddressBook('@graphprotocol/horizon/addresses.json', 'localhost'), subgraphService: resolveAddressBook('@graphprotocol/subgraph-service/addresses.json', 'localhost'), diff --git a/packages/horizon/ignition/configs/migrate.e2e-test.json5 b/packages/horizon/ignition/configs/migrate.integration.json5 similarity index 75% rename from packages/horizon/ignition/configs/migrate.e2e-test.json5 rename to packages/horizon/ignition/configs/migrate.integration.json5 index 6a3b6df23..d80340c85 100644 --- a/packages/horizon/ignition/configs/migrate.e2e-test.json5 +++ b/packages/horizon/ignition/configs/migrate.integration.json5 @@ -13,10 +13,19 @@ "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + // Must be set for step 2 of the migration + "graphPaymentsAddress": "", + "paymentsEscrowAddress": "", + // Must be set for step 3 and 4 of the migration "subgraphServiceAddress": "", - // Parameters + // Must be set for step 4 of the migration + "horizonStakingImplementationAddress": "", + "curationImplementationAddress": "", + "rewardsManagerImplementationAddress": "", + + // Global parameters "maxThawingPeriod": 2419200 }, "GraphPayments": { @@ -29,22 +38,5 @@ "eip712Name": "GraphTallyCollector", "eip712Version": "1", "revokeSignerThawingPeriod": 10000 - }, - "HorizonProxiesGovernor": { - // Must be set for step 2 of the migration - "graphPaymentsAddress": "", - "paymentsEscrowAddress": "" - }, - "HorizonStakingGovernor": { - // Must be set for step 4 of the migration - "horizonStakingImplementationAddress": "" - }, - "L2CurationGovernor": { - // Must be set for step 4 of the migration - "curationImplementationAddress": "" - }, - "RewardsManagerGovernor": { - // Must be set for step 4 of the migration - "rewardsManagerImplementationAddress": "" } } diff --git a/packages/horizon/scripts/test/integration b/packages/horizon/scripts/test/integration index f5bfdf720..56045d34c 100755 --- a/packages/horizon/scripts/test/integration +++ b/packages/horizon/scripts/test/integration @@ -3,7 +3,6 @@ set -eo pipefail # Set environment variables for this script -export HARDHAT_FORK=true export SECURE_ACCOUNTS_DISABLE_PROVIDER=true # Function to cleanup resources @@ -32,12 +31,13 @@ if [ -d "ignition/deployments/horizon-localhost" ]; then fi # Check required env variables +ARBITRUM_SEPOLIA_RPC=${ARBITRUM_SEPOLIA_RPC:-$(npx hardhat vars get ARBITRUM_SEPOLIA_RPC)} if [ -z "$ARBITRUM_SEPOLIA_RPC" ]; then echo "ARBITRUM_SEPOLIA_RPC environment variable is required" exit 1 fi -echo "Starting e2e tests..." +echo "Starting integration tests..." # Check if hardhat node is already running on port 8545 STARTED_NODE=false @@ -56,23 +56,26 @@ else sleep 10 fi -# Setup pre horizon migration state needed for the e2e tests +# Setup horizon address book +jq '{"31337": ."421614"}' addresses.json > addresses-localhost.json + +# Setup pre horizon migration state needed for the integration tests npx hardhat test:integration:pre-upgrade --network localhost # Transfer ownership of protocol to hardhat signer 1 npx hardhat test:integration:transfer-ownership --network localhost # Step 1 - Deployer -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 1 --account-index 0 +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 1 --account-index 0 # Step 2 - Governor -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 2 --patch-config --account-index 1 --hide-banner +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 2 --patch-config --account-index 1 --hide-banner # Step 3 - Deployer -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 3 --patch-config --account-index 0 --hide-banner +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 3 --patch-config --account-index 0 --hide-banner # Step 4 - Governor -npx hardhat deploy:migrate --network localhost --horizon-config e2e-test --step 4 --patch-config --account-index 1 --hide-banner +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 4 --patch-config --account-index 1 --hide-banner # Unset subgraph service npx hardhat transition:unset-subgraph-service --network localhost --governor-index 1 @@ -93,5 +96,5 @@ npx hardhat transition:enable-delegation-slashing --network localhost --governor npx hardhat test:integration --phase after-delegation-slashing-enabled --network localhost echo "" -echo "πŸŽ‰ ✨ πŸš€ βœ… E2E tests completed successfully! πŸŽ‰ ✨ πŸš€ βœ…" +echo "πŸŽ‰ ✨ πŸš€ βœ… Integration tests completed successfully! πŸŽ‰ ✨ πŸš€ βœ…" echo "" \ No newline at end of file diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts index 1f9c1443c..6001cfc1d 100644 --- a/packages/horizon/test/integration/after-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -22,8 +22,8 @@ describe('Delegator', () => { const thawingPeriod = 2419200n // 28 days const tokens = ethers.parseEther('100000') - // TODO: FIX THIS - const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' before(async () => { const graph = hre.graph() diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts index 1f369dd7e..9aa911171 100644 --- a/packages/horizon/test/integration/during-transition-period/delegator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/delegator.test.ts @@ -16,8 +16,8 @@ describe('Delegator', () => { const thawingPeriod = 2419200n // 28 days - // TODO: FIX THIS - const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' before(() => { const graph = hre.graph() @@ -92,7 +92,7 @@ describe('Delegator', () => { horizonStaking, delegator, serviceProvider: indexer, - })).to.be.revertedWith('!tokens') + })).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingNothingToWithdraw') }) }) diff --git a/packages/horizon/test/integration/during-transition-period/operator.test.ts b/packages/horizon/test/integration/during-transition-period/operator.test.ts index 39fe4e9f8..0e6836b88 100644 --- a/packages/horizon/test/integration/during-transition-period/operator.test.ts +++ b/packages/horizon/test/integration/during-transition-period/operator.test.ts @@ -15,8 +15,8 @@ describe('Operator', () => { let rewardsManager: IRewardsManager let snapshotId: string - // TODO: FIX THIS - const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' before(() => { const graph = hre.graph() diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts index 924eb6845..dc6dede8d 100644 --- a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -17,8 +17,8 @@ describe('Service Provider', () => { let graphToken: IGraphToken let snapshotId: string - // TODO: FIX THIS - const subgraphServiceAddress = '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B' + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' before(() => { const graph = hre.graph()