diff --git a/packages/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol b/packages/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol index 50ca90fc3..6252f63fa 100644 --- a/packages/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol +++ b/packages/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol @@ -774,12 +774,12 @@ interface IHorizonStakingMain { * @param beneficiary The address where the tokens will be withdrawn after thawing * @return The ID of the thaw request */ - function undelegateWithBeneficiary( - address serviceProvider, - address verifier, - uint256 shares, - address beneficiary - ) external returns (bytes32); + // function undelegateWithBeneficiary( + // address serviceProvider, + // address verifier, + // uint256 shares, + // address beneficiary + // ) external returns (bytes32); /** * @notice Withdraw undelegated tokens from a provision after thawing. @@ -815,11 +815,11 @@ interface IHorizonStakingMain { * @param verifier The verifier address * @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests. */ - function withdrawDelegatedWithBeneficiary( - address serviceProvider, - address verifier, - uint256 nThawRequests - ) external; + // function withdrawDelegatedWithBeneficiary( + // address serviceProvider, + // address verifier, + // uint256 nThawRequests + // ) external; /** * @notice Re-delegate undelegated tokens from a provision after thawing to a `newServiceProvider` and `newVerifier`. diff --git a/packages/horizon/contracts/staking/HorizonStaking.sol b/packages/horizon/contracts/staking/HorizonStaking.sol index 3414fe555..97fb30ca9 100644 --- a/packages/horizon/contracts/staking/HorizonStaking.sol +++ b/packages/horizon/contracts/staking/HorizonStaking.sol @@ -310,15 +310,15 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain { /** * @notice See {IHorizonStakingMain-undelegate}. */ - function undelegateWithBeneficiary( - address serviceProvider, - address verifier, - uint256 shares, - address beneficiary - ) external override notPaused returns (bytes32) { - require(beneficiary != address(0), HorizonStakingInvalidBeneficiaryZeroAddress()); - return _undelegate(ThawRequestType.DelegationWithBeneficiary, serviceProvider, verifier, shares, beneficiary); - } + // function undelegateWithBeneficiary( + // address serviceProvider, + // address verifier, + // uint256 shares, + // address beneficiary + // ) external override notPaused returns (bytes32) { + // require(beneficiary != address(0), HorizonStakingInvalidBeneficiaryZeroAddress()); + // return _undelegate(ThawRequestType.DelegationWithBeneficiary, serviceProvider, verifier, shares, beneficiary); + // } /** * @notice See {IHorizonStakingMain-withdrawDelegated}. @@ -342,21 +342,21 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain { /** * @notice See {IHorizonStakingMain-withdrawDelegatedWithBeneficiary}. */ - function withdrawDelegatedWithBeneficiary( - address serviceProvider, - address verifier, - uint256 nThawRequests - ) external override notPaused { - _withdrawDelegated( - ThawRequestType.DelegationWithBeneficiary, - serviceProvider, - verifier, - address(0), - address(0), - 0, - nThawRequests - ); - } + // function withdrawDelegatedWithBeneficiary( + // address serviceProvider, + // address verifier, + // uint256 nThawRequests + // ) external override notPaused { + // _withdrawDelegated( + // ThawRequestType.DelegationWithBeneficiary, + // serviceProvider, + // verifier, + // address(0), + // address(0), + // 0, + // nThawRequests + // ); + // } /** * @notice See {IHorizonStakingMain-redelegate}. diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts index 41c92d1b9..a2c1dd155 100644 --- a/packages/horizon/hardhat.config.ts +++ b/packages/horizon/hardhat.config.ts @@ -1,12 +1,23 @@ import '@nomicfoundation/hardhat-foundry' import '@nomicfoundation/hardhat-toolbox' import '@nomicfoundation/hardhat-ignition-ethers' +import '@tenderly/hardhat-tenderly' import 'hardhat-storage-layout' import 'hardhat-contract-sizer' import 'hardhat-secure-accounts' +import * as dotenv from 'dotenv' import type { HardhatUserConfig } from 'hardhat/config' +dotenv.config() + +const getNetworkAccounts = () => { + const accounts: string[] = [] + if (process.env.DEPLOYER_PRIVATE_KEY) accounts.push(process.env.DEPLOYER_PRIVATE_KEY) + if (process.env.GOVERNOR_PRIVATE_KEY) accounts.push(process.env.GOVERNOR_PRIVATE_KEY) + return accounts.length > 0 ? accounts : undefined +} + if (process.env.BUILD_RUN !== 'true') { require('hardhat-graph-protocol') } @@ -17,7 +28,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 200, + runs: 1, }, }, }, @@ -41,6 +52,18 @@ const config: HardhatUserConfig = { chainId: 421614, url: 'https://sepolia-rollup.arbitrum.io/rpc', }, + arbitrumVirtualTestnet: { + secureAccounts: { + enabled: false, + }, + chainId: 421615, + url: process.env.ARBITRUM_VIRTUAL_TESTNET_URL || '', + accounts: getNetworkAccounts(), + }, + }, + tenderly: { + project: 'graph-network', + username: 'graphprotocol', }, graph: { deployments: { diff --git a/packages/horizon/ignition/configs/horizon-migrate.hardhat.json5 b/packages/horizon/ignition/configs/horizon-migrate.hardhat.json5 new file mode 100644 index 000000000..f403e3477 --- /dev/null +++ b/packages/horizon/ignition/configs/horizon-migrate.hardhat.json5 @@ -0,0 +1,34 @@ +{ + "$global": { + "isMigrate": true, + "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "horizonStakingProxyAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "bridgeEscrowProxyAddress": "0x428Ab6E9EeF41Dc5098a34a6993Cdd5Be5BA24a6", + "epochManagerProxyAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "graphTokenProxyAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "graphTokenGatewayProxyAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + // Placeholder address for a standalone Horizon deployment, see README.md for more details + "subgraphServiceAddress": "0x0000000000000000000000000000000000000000" + }, + "RewardsManager": { + "rewardsManagerProxyAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79" + }, + "Curation": { + "graphCurationProxyAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5" + }, + "HorizonStaking": { + "maxThawingPeriod": 2419200 + }, + "GraphPayments": { + "protocolPaymentCut": 10000 + }, + "PaymentsEscrow": { + "withdrawEscrowThawingPeriod": 10000 + }, + "TAPCollector": { + "eip712Name": "TAPCollector", + "eip712Version": "1", + "revokeSignerThawingPeriod": 10000 + } +} diff --git a/packages/horizon/ignition/configs/horizon.hardhat.json5 b/packages/horizon/ignition/configs/horizon.hardhat.json5 index c06f27ad0..90d515811 100644 --- a/packages/horizon/ignition/configs/horizon.hardhat.json5 +++ b/packages/horizon/ignition/configs/horizon.hardhat.json5 @@ -1,5 +1,6 @@ { "$global": { + "isMigrate": false, "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", "pauseGuardian": "0x95cED938F7991cd0dFcb48F0a06a40FA1aF46EBC", "subgraphAvailabilityOracle": "0xd03ea8624C8C5987235048901fB614fDcA89b117", diff --git a/packages/horizon/ignition/modules/core/GraphPayments.ts b/packages/horizon/ignition/modules/core/GraphPayments.ts index 43fcf5b55..2a42c0003 100644 --- a/packages/horizon/ignition/modules/core/GraphPayments.ts +++ b/packages/horizon/ignition/modules/core/GraphPayments.ts @@ -27,5 +27,5 @@ export default buildModule('GraphPayments', (m) => { // Load contract with implementation ABI const GraphPayments = m.contractAt('GraphPayments', GraphPaymentsArtifact, GraphPaymentsProxy, { id: 'GraphPayments_Instance' }) - return { GraphPayments } + return { GraphPayments, GraphPaymentsImplementation } }) diff --git a/packages/horizon/ignition/modules/core/HorizonProxies.ts b/packages/horizon/ignition/modules/core/HorizonProxies.ts index 8656571af..7fc0220d2 100644 --- a/packages/horizon/ignition/modules/core/HorizonProxies.ts +++ b/packages/horizon/ignition/modules/core/HorizonProxies.ts @@ -16,17 +16,28 @@ export default buildModule('HorizonProxies', (m) => { const { Controller, PeripheryRegistered } = m.useModule(GraphPeripheryModule) const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + const isMigrate = m.getParameter('isMigrate', false) + // Deploy HorizonStaking proxy without an implementation - const HorizonStakingProxy = m.contract('GraphProxy', GraphProxyArtifact, [ZERO_ADDRESS, GraphProxyAdmin], { after: [PeripheryRegistered], id: 'GraphProxy_HorizonStaking' }) + let HorizonStakingProxy, setProxyHorizonStaking + if (isMigrate) { + const horizonStakingProxyAddress = m.getParameter('horizonStakingProxyAddress') + HorizonStakingProxy = m.contractAt('GraphProxy', GraphProxyArtifact, horizonStakingProxyAddress, { id: 'GraphProxy_HorizonStaking' }) + setProxyHorizonStaking = HorizonStakingProxy + } else { + HorizonStakingProxy = m.contract('GraphProxy', GraphProxyArtifact, [ZERO_ADDRESS, GraphProxyAdmin], { after: [PeripheryRegistered], id: 'GraphProxy_HorizonStaking' }) + setProxyHorizonStaking = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Staking')), HorizonStakingProxy], { id: 'setContractProxy_HorizonStaking' }) + } // Deploy proxies for payments contracts using OZ TransparentUpgradeableProxy const { Proxy: GraphPaymentsProxy, ProxyAdmin: GraphPaymentsProxyAdmin } = deployWithOZProxy(m, 'GraphPayments') const { Proxy: PaymentsEscrowProxy, ProxyAdmin: PaymentsEscrowProxyAdmin } = deployWithOZProxy(m, 'PaymentsEscrow') // Register the proxies in the controller - const setProxyHorizonStaking = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Staking')), HorizonStakingProxy], { id: 'setContractProxy_HorizonStaking' }) - const setProxyGraphPayments = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphPayments')), GraphPaymentsProxy], { id: 'setContractProxy_GraphPayments' }) - const setProxyPaymentsEscrow = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), PaymentsEscrowProxy], { id: 'setContractProxy_PaymentsEscrow' }) + // if isMigrate then use from: governor + const options = isMigrate ? { from: m.getAccount(1) } : {} + const setProxyGraphPayments = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphPayments')), GraphPaymentsProxy], { ...options, id: 'setContractProxy_GraphPayments' }) + const setProxyPaymentsEscrow = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), PaymentsEscrowProxy], { ...options, id: 'setContractProxy_PaymentsEscrow' }) // Deploy dummy contract to signal that all periphery contracts are registered const HorizonRegistered = m.contract('Dummy', DummyArtifact, [], { diff --git a/packages/horizon/ignition/modules/core/HorizonStaking.ts b/packages/horizon/ignition/modules/core/HorizonStaking.ts index c412af887..36f18e997 100644 --- a/packages/horizon/ignition/modules/core/HorizonStaking.ts +++ b/packages/horizon/ignition/modules/core/HorizonStaking.ts @@ -27,12 +27,15 @@ export default buildModule('HorizonStaking', (m) => { ) // Upgrade proxy to implementation contract - const upgradeCall = m.call(GraphProxyAdmin, 'upgrade', [HorizonStakingProxy, HorizonStakingImplementation]) - const acceptCall = m.call(GraphProxyAdmin, 'acceptProxy', [HorizonStakingImplementation, HorizonStakingProxy], { after: [upgradeCall] }) + const isMigrate = m.getParameter('isMigrate') + const governor = m.getAccount(1) + const options = isMigrate ? { from: governor } : {} + const upgradeCall = m.call(GraphProxyAdmin, 'upgrade', [HorizonStakingProxy, HorizonStakingImplementation], options) + const acceptCall = m.call(GraphProxyAdmin, 'acceptProxy', [HorizonStakingImplementation, HorizonStakingProxy], { ...options, after: [upgradeCall] }) // Load contract with implementation ABI const HorizonStaking = m.contractAt('HorizonStaking', HorizonStakingArtifact, HorizonStakingProxy, { after: [acceptCall], id: 'HorizonStaking_Instance' }) - m.call(HorizonStaking, 'setMaxThawingPeriod', [m.getParameter('maxThawingPeriod')]) + m.call(HorizonStaking, 'setMaxThawingPeriod', [m.getParameter('maxThawingPeriod')], options) return { HorizonStakingProxy, HorizonStakingImplementation, HorizonStaking } }) diff --git a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts index 7c7948a7e..f25455b84 100644 --- a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts +++ b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts @@ -27,5 +27,5 @@ export default buildModule('PaymentsEscrow', (m) => { // Load contract with implementation ABI const PaymentsEscrow = m.contractAt('PaymentsEscrow', PaymentsEscrowArtifact, PaymentsEscrowProxy, { id: 'PaymentsEscrow_Instance' }) - return { PaymentsEscrow } + return { PaymentsEscrow, PaymentsEscrowImplementation } }) diff --git a/packages/horizon/ignition/modules/periphery.ts b/packages/horizon/ignition/modules/periphery.ts index 2c358c74f..8f9b2284e 100644 --- a/packages/horizon/ignition/modules/periphery.ts +++ b/packages/horizon/ignition/modules/periphery.ts @@ -18,30 +18,42 @@ export default buildModule('GraphHorizon_Periphery', (m) => { const { EpochManager } = m.useModule(EpochManagerModule) const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) const { GraphTokenGateway } = m.useModule(GraphTokenGatewayModule) - const { RewardsManager } = m.useModule(RewardsManagerModule) const { GraphToken } = m.useModule(GraphTokenModule) - const { Curation } = m.useModule(CurationModule) - - // Register contracts in the Controller - const setProxyEpochManager = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('EpochManager')), EpochManager], { id: 'setContractProxy_EpochManager' }) - const setProxyRewardsManager = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('RewardsManager')), RewardsManager], { id: 'setContractProxy_RewardsManager' }) - const setProxyGraphToken = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphToken')), GraphToken], { id: 'setContractProxy_GraphToken' }) - const setProxyGraphTokenGateway = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphTokenGateway')), GraphTokenGateway], { id: 'setContractProxy_GraphTokenGateway' }) - // eslint-disable-next-line no-secrets/no-secrets - const setProxyGraphProxyAdmin = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphProxyAdmin')), GraphProxyAdmin], { id: 'setContractProxy_GraphProxyAdmin' }) - const setProxyCuration = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Curation')), Curation], { id: 'setContractProxy_Curation' }) - - // Deploy dummy contract to signal that all periphery contracts are registered - const PeripheryRegistered = m.contract('Dummy', DummyArtifact, [], { - after: [ - setProxyEpochManager, - setProxyRewardsManager, - setProxyGraphToken, - setProxyGraphTokenGateway, - setProxyGraphProxyAdmin, - setProxyCuration, - ], - }) + + const { instance: RewardsManager } = m.useModule(RewardsManagerModule) + const { instance: Curation } = m.useModule(CurationModule) + + const isMigrate = m.getParameter('isMigrate', false) + + let PeripheryRegistered + if (!isMigrate) { + // Register contracts in the Controller + const setProxyEpochManager = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('EpochManager')), EpochManager], { id: 'setContractProxy_EpochManager' }) + const setProxyRewardsManager = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('RewardsManager')), RewardsManager], { id: 'setContractProxy_RewardsManager' }) + const setProxyGraphToken = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphToken')), GraphToken], { id: 'setContractProxy_GraphToken' }) + const setProxyGraphTokenGateway = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphTokenGateway')), GraphTokenGateway], { id: 'setContractProxy_GraphTokenGateway' }) + // eslint-disable-next-line no-secrets/no-secrets + const setProxyGraphProxyAdmin = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphProxyAdmin')), GraphProxyAdmin], { id: 'setContractProxy_GraphProxyAdmin' }) + const setProxyCuration = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Curation')), Curation], { id: 'setContractProxy_Curation' }) + + // Deploy dummy contract to signal that all periphery contracts are registered + PeripheryRegistered = m.contract('Dummy', DummyArtifact, [], { + after: [ + setProxyEpochManager, + setProxyRewardsManager, + setProxyGraphToken, + setProxyGraphTokenGateway, + setProxyGraphProxyAdmin, + setProxyCuration, + ], + }) + } else { + // TODO: Remove if not needed + const governor = m.getAccount(1) + // eslint-disable-next-line no-secrets/no-secrets + const setProxyGraphProxyAdmin = m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphProxyAdmin')), GraphProxyAdmin], { id: 'setContractProxy_GraphProxyAdmin', from: governor }) + PeripheryRegistered = m.contract('Dummy', DummyArtifact, [], { after: [setProxyGraphProxyAdmin] }) + } return { BridgeEscrow, diff --git a/packages/horizon/ignition/modules/periphery/BridgeEscrow.ts b/packages/horizon/ignition/modules/periphery/BridgeEscrow.ts index 6d9dd32ee..3ded3d9c6 100644 --- a/packages/horizon/ignition/modules/periphery/BridgeEscrow.ts +++ b/packages/horizon/ignition/modules/periphery/BridgeEscrow.ts @@ -6,13 +6,21 @@ import BridgeEscrowArtifact from '@graphprotocol/contracts/build/contracts/contr import ControllerModule from '../periphery/Controller' export default buildModule('BridgeEscrow', (m) => { - const { Controller } = m.useModule(ControllerModule) + const isMigrate = m.getParameter('isMigrate', false) - const { instance: BridgeEscrow } = deployWithGraphProxy(m, { - name: 'BridgeEscrow', - artifact: BridgeEscrowArtifact, - args: [Controller], - }) + let BridgeEscrow + if (isMigrate) { + const bridgeEscrowProxyAddress = m.getParameter('bridgeEscrowProxyAddress') + BridgeEscrow = m.contractAt('BridgeEscrow', BridgeEscrowArtifact, bridgeEscrowProxyAddress) + } else { + const { Controller } = m.useModule(ControllerModule) + + BridgeEscrow = deployWithGraphProxy(m, { + name: 'BridgeEscrow', + artifact: BridgeEscrowArtifact, + args: [Controller], + }).instance + } return { BridgeEscrow } }) diff --git a/packages/horizon/ignition/modules/periphery/Controller.ts b/packages/horizon/ignition/modules/periphery/Controller.ts index 41a3e6484..eb6c21102 100644 --- a/packages/horizon/ignition/modules/periphery/Controller.ts +++ b/packages/horizon/ignition/modules/periphery/Controller.ts @@ -4,14 +4,22 @@ import ControllerArtifact from '@graphprotocol/contracts/build/contracts/contrac // TODO: Ownership transfer is a two step process, the new owner needs to accept it by calling acceptOwnership export default buildModule('Controller', (m) => { - const governor = m.getParameter('governor') - const pauseGuardian = m.getParameter('pauseGuardian') + const isMigrate = m.getParameter('isMigrate', false) - const Controller = m.contract('Controller', ControllerArtifact) + let Controller + if (isMigrate) { + const controllerAddress = m.getParameter('controllerAddress') + Controller = m.contractAt('Controller', ControllerArtifact, controllerAddress) + } else { + const governor = m.getParameter('governor') + const pauseGuardian = m.getParameter('pauseGuardian') - m.call(Controller, 'setPauseGuardian', [pauseGuardian]) - m.call(Controller, 'transferOwnership', [governor]) - m.call(Controller, 'setPaused', [false]) + Controller = m.contract('Controller', ControllerArtifact) + + m.call(Controller, 'setPauseGuardian', [pauseGuardian]) + m.call(Controller, 'transferOwnership', [governor]) + m.call(Controller, 'setPaused', [false]) + } return { Controller } }) diff --git a/packages/horizon/ignition/modules/periphery/Curation.ts b/packages/horizon/ignition/modules/periphery/Curation.ts index 2a1516168..1dcdaba37 100644 --- a/packages/horizon/ignition/modules/periphery/Curation.ts +++ b/packages/horizon/ignition/modules/periphery/Curation.ts @@ -1,23 +1,53 @@ -import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' -import { deployWithGraphProxy } from '../proxy/GraphProxy' +import { buildModule, IgnitionModuleBuilder } from '@nomicfoundation/ignition-core' +import { deployWithGraphProxy, upgradeWithGraphProxy } from '../proxy/GraphProxy' import ControllerModule from './Controller' + import CurationArtifact from '@graphprotocol/contracts/build/contracts/contracts/l2/curation/L2Curation.sol/L2Curation.json' import GraphCurationTokenArtifact from '@graphprotocol/contracts/build/contracts/contracts/curation/GraphCurationToken.sol/GraphCurationToken.json' +import GraphProxyArtifact from '@graphprotocol/contracts/build/contracts/contracts/upgrades/GraphProxy.sol/GraphProxy.json' export default buildModule('Curation', (m) => { - const { Controller } = m.useModule(ControllerModule) + const isMigrate = m.getParameter('isMigrate') + + if (isMigrate) { + return upgradeCuration(m) + } else { + return deployCuration(m) + } +}) + +function upgradeCuration(m: IgnitionModuleBuilder) { + const governor = m.getAccount(1) + + const graphCurationProxyAddress = m.getParameter('graphCurationProxyAddress') + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + const GraphProxy = m.contractAt('GraphProxy', GraphProxyArtifact, graphCurationProxyAddress) + const { instance: Curation, implementation: CurationImplementation } = upgradeWithGraphProxy(m, { + name: 'Curation', + artifact: CurationArtifact, + proxyContract: GraphProxy, + }, { from: governor }) + m.call(Curation, 'setSubgraphService', [subgraphServiceAddress], { from: governor }) + + return { instance: Curation, implementation: CurationImplementation } +} + +function deployCuration(m: IgnitionModuleBuilder) { const curationTaxPercentage = m.getParameter('curationTaxPercentage') const minimumCurationDeposit = m.getParameter('minimumCurationDeposit') + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + const { Controller } = m.useModule(ControllerModule) const GraphCurationToken = m.contract('GraphCurationToken', GraphCurationTokenArtifact, []) - const { instance: Curation } = deployWithGraphProxy(m, { + const { instance: Curation, implementation: CurationImplementation } = deployWithGraphProxy(m, { name: 'Curation', artifact: CurationArtifact, args: [Controller, GraphCurationToken, curationTaxPercentage, minimumCurationDeposit], }) + m.call(Curation, 'setSubgraphService', [subgraphServiceAddress]) - return { Curation } -}) + return { instance: Curation, implementation: CurationImplementation } +} diff --git a/packages/horizon/ignition/modules/periphery/EpochManager.ts b/packages/horizon/ignition/modules/periphery/EpochManager.ts index e05792171..119b20015 100644 --- a/packages/horizon/ignition/modules/periphery/EpochManager.ts +++ b/packages/horizon/ignition/modules/periphery/EpochManager.ts @@ -5,15 +5,23 @@ import ControllerModule from './Controller' import EpochManagerArtifact from '@graphprotocol/contracts/build/contracts/contracts/epochs/EpochManager.sol/EpochManager.json' export default buildModule('EpochManager', (m) => { - const { Controller } = m.useModule(ControllerModule) + const isMigrate = m.getParameter('isMigrate', false) - const epochLength = m.getParameter('epochLength') + let EpochManager + if (isMigrate) { + const epochManagerProxyAddress = m.getParameter('epochManagerProxyAddress') + EpochManager = m.contractAt('EpochManager', EpochManagerArtifact, epochManagerProxyAddress) + } else { + const { Controller } = m.useModule(ControllerModule) - const { instance: EpochManager } = deployWithGraphProxy(m, { - name: 'EpochManager', - artifact: EpochManagerArtifact, - args: [Controller, epochLength], - }) + const epochLength = m.getParameter('epochLength') + + EpochManager = deployWithGraphProxy(m, { + name: 'EpochManager', + artifact: EpochManagerArtifact, + args: [Controller, epochLength], + }).instance + } return { EpochManager } }) diff --git a/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts index 8715316c8..28d6f2de7 100644 --- a/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts +++ b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts @@ -2,12 +2,20 @@ import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' import GraphProxyAdminArtifact from '@graphprotocol/contracts/build/contracts/contracts/upgrades/GraphProxyAdmin.sol/GraphProxyAdmin.json' -// TODO: Ownership transfer is a two step process, the new owner needs to accept it by calling acceptOwnership export default buildModule('GraphProxyAdmin', (m) => { - const governor = m.getParameter('governor') - const GraphProxyAdmin = m.contract('GraphProxyAdmin', GraphProxyAdminArtifact) + const isMigrate = m.getParameter('isMigrate', false) - m.call(GraphProxyAdmin, 'transferOwnership', [governor]) + let GraphProxyAdmin + if (isMigrate) { + const graphProxyAdminAddress = m.getParameter('graphProxyAdminAddress') + GraphProxyAdmin = m.contractAt('GraphProxyAdmin', GraphProxyAdminArtifact, graphProxyAdminAddress) + } else { + // TODO: Ownership transfer is a two step process, the new owner needs to accept it by calling acceptOwnership + const governor = m.getParameter('governor') + GraphProxyAdmin = m.contract('GraphProxyAdmin', GraphProxyAdminArtifact) + + m.call(GraphProxyAdmin, 'transferOwnership', [governor]) + } return { GraphProxyAdmin } }) diff --git a/packages/horizon/ignition/modules/periphery/GraphToken.ts b/packages/horizon/ignition/modules/periphery/GraphToken.ts index 955d95edb..a3b0a8dc9 100644 --- a/packages/horizon/ignition/modules/periphery/GraphToken.ts +++ b/packages/horizon/ignition/modules/periphery/GraphToken.ts @@ -8,26 +8,34 @@ import GraphTokenArtifact from '@graphprotocol/contracts/build/contracts/contrac // TODO: Ownership transfer is a two step process, the new owner needs to accept it by calling acceptOwnership export default buildModule('GraphToken', (m) => { - const { RewardsManager } = m.useModule(RewardsManagerModule) - const { GraphTokenGateway } = m.useModule(GraphTokenGatewayModule) - - const deployer = m.getAccount(0) - const governor = m.getParameter('governor') - const initialSupply = m.getParameter('initialSupply') - - const { instance: GraphToken } = deployWithGraphProxy(m, { - name: 'GraphToken', - artifact: GraphTokenArtifact, - args: [deployer], - }) - - // TODO: move this mint to a testnet only module - // Note that this next mint would only be done in L1 - m.call(GraphToken, 'mint', [deployer, initialSupply]) - m.call(GraphToken, 'renounceMinter', []) - m.call(GraphToken, 'addMinter', [RewardsManager], { id: 'addMinterRewardsManager' }) - m.call(GraphToken, 'addMinter', [GraphTokenGateway], { id: 'addMinterGateway' }) - m.call(GraphToken, 'transferOwnership', [governor]) + const isMigrate = m.getParameter('isMigrate', false) + + let GraphToken + if (isMigrate) { + const graphTokenProxyAddress = m.getParameter('graphTokenProxyAddress') + GraphToken = m.contractAt('GraphToken', GraphTokenArtifact, graphTokenProxyAddress) + } else { + const { instance: RewardsManager } = m.useModule(RewardsManagerModule) + const { GraphTokenGateway } = m.useModule(GraphTokenGatewayModule) + + const deployer = m.getAccount(0) + const governor = m.getParameter('governor') + const initialSupply = m.getParameter('initialSupply') + + GraphToken = deployWithGraphProxy(m, { + name: 'GraphToken', + artifact: GraphTokenArtifact, + args: [deployer], + }).instance + + // TODO: move this mint to a testnet only module + // Note that this next mint would only be done in L1 + m.call(GraphToken, 'mint', [deployer, initialSupply]) + m.call(GraphToken, 'renounceMinter', []) + m.call(GraphToken, 'addMinter', [RewardsManager], { id: 'addMinterRewardsManager' }) + m.call(GraphToken, 'addMinter', [GraphTokenGateway], { id: 'addMinterGateway' }) + m.call(GraphToken, 'transferOwnership', [governor]) + } return { GraphToken } }) diff --git a/packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts b/packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts index 2bb13a78e..3c797a889 100644 --- a/packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts +++ b/packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts @@ -6,17 +6,24 @@ import ControllerModule from '../periphery/Controller' import GraphTokenGatewayArtifact from '@graphprotocol/contracts/build/contracts/contracts/l2/gateway/L2GraphTokenGateway.sol/L2GraphTokenGateway.json' export default buildModule('GraphTokenGateway', (m) => { - const { Controller } = m.useModule(ControllerModule) + const isMigrate = m.getParameter('isMigrate', false) - const pauseGuardian = m.getParameter('pauseGuardian') + let GraphTokenGateway + if (isMigrate) { + const graphTokenGatewayProxyAddress = m.getParameter('graphTokenGatewayProxyAddress') + GraphTokenGateway = m.contractAt('GraphTokenGateway', GraphTokenGatewayArtifact, graphTokenGatewayProxyAddress) + } else { + const { Controller } = m.useModule(ControllerModule) - const { instance: GraphTokenGateway } = deployWithGraphProxy(m, { - name: 'GraphTokenGateway', - artifact: GraphTokenGatewayArtifact, - args: [Controller], - }) + const pauseGuardian = m.getParameter('pauseGuardian') - m.call(GraphTokenGateway, 'setPauseGuardian', [pauseGuardian]) + GraphTokenGateway = deployWithGraphProxy(m, { + name: 'GraphTokenGateway', + artifact: GraphTokenGatewayArtifact, + args: [Controller], + }).instance + m.call(GraphTokenGateway, 'setPauseGuardian', [pauseGuardian]) + } return { GraphTokenGateway } }) diff --git a/packages/horizon/ignition/modules/periphery/RewardsManager.ts b/packages/horizon/ignition/modules/periphery/RewardsManager.ts index 3773933e9..a0f29c0aa 100644 --- a/packages/horizon/ignition/modules/periphery/RewardsManager.ts +++ b/packages/horizon/ignition/modules/periphery/RewardsManager.ts @@ -1,26 +1,53 @@ -import { buildModule } from '@nomicfoundation/ignition-core' - -import { deployWithGraphProxy } from '../proxy/GraphProxy' +import { buildModule, IgnitionModuleBuilder } from '@nomicfoundation/ignition-core' +import { deployWithGraphProxy, upgradeWithGraphProxy } from '../proxy/GraphProxy' import ControllerModule from '../periphery/Controller' + import RewardsManagerArtifact from '@graphprotocol/contracts/build/contracts/contracts/rewards/RewardsManager.sol/RewardsManager.json' +import GraphProxyArtifact from '@graphprotocol/contracts/build/contracts/contracts/upgrades/GraphProxy.sol/GraphProxy.json' export default buildModule('RewardsManager', (m) => { - const { Controller } = m.useModule(ControllerModule) + const isMigrate = m.getParameter('isMigrate') + + if (isMigrate) { + return upgradeRewardsManager(m) + } else { + return deployRewardsManager(m) + } +}) + +function upgradeRewardsManager(m: IgnitionModuleBuilder) { + const governor = m.getAccount(1) - const issuancePerBlock = m.getParameter('issuancePerBlock') - const subgraphAvailabilityOracle = m.getParameter('subgraphAvailabilityOracle') const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + const rewardsManagerProxyAddress = m.getParameter('rewardsManagerProxyAddress') + const GraphProxy = m.contractAt('GraphProxy', GraphProxyArtifact, rewardsManagerProxyAddress) + + const { instance: RewardsManager, implementation: RewardsManagerImplementation } = upgradeWithGraphProxy(m, { + name: 'RewardsManager', + artifact: RewardsManagerArtifact, + proxyContract: GraphProxy, + }, { from: governor }) + m.call(RewardsManager, 'setSubgraphService', [subgraphServiceAddress], { from: governor }) + + return { instance: RewardsManager, implementation: RewardsManagerImplementation } +} - const { instance: RewardsManager } = deployWithGraphProxy(m, { +function deployRewardsManager(m: IgnitionModuleBuilder) { + const { Controller } = m.useModule(ControllerModule) + const { instance: RewardsManager, implementation: RewardsManagerImplementation } = deployWithGraphProxy(m, { name: 'RewardsManager', artifact: RewardsManagerArtifact, args: [Controller], }) + const issuancePerBlock = m.getParameter('issuancePerBlock') + const subgraphAvailabilityOracle = m.getParameter('subgraphAvailabilityOracle') + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + m.call(RewardsManager, 'setSubgraphAvailabilityOracle', [subgraphAvailabilityOracle]) m.call(RewardsManager, 'setIssuancePerBlock', [issuancePerBlock]) m.call(RewardsManager, 'setSubgraphService', [subgraphServiceAddress]) - return { RewardsManager } -}) + return { instance: RewardsManager, implementation: RewardsManagerImplementation } +} diff --git a/packages/horizon/ignition/modules/proxy/GraphProxy.ts b/packages/horizon/ignition/modules/proxy/GraphProxy.ts index 85455977f..43efd324c 100644 --- a/packages/horizon/ignition/modules/proxy/GraphProxy.ts +++ b/packages/horizon/ignition/modules/proxy/GraphProxy.ts @@ -1,9 +1,17 @@ -import { ArgumentType, Artifact, ContractOptions, IgnitionModuleBuilder } from '@nomicfoundation/ignition-core' +import { ArgumentType, Artifact, ContractAtFuture, ContractOptions, IgnitionModuleBuilder } from '@nomicfoundation/ignition-core' import GraphProxyAdminModule from '../periphery/GraphProxyAdmin' + import GraphProxyArtifact from '@graphprotocol/contracts/build/contracts/contracts/upgrades/GraphProxy.sol/GraphProxy.json' -export function deployWithGraphProxy(m: IgnitionModuleBuilder, contract: { name: string, artifact?: Artifact, args?: ArgumentType[] }, options?: ContractOptions) { +export function deployWithGraphProxy( + m: IgnitionModuleBuilder, + contract: { + name: string + artifact?: Artifact + args?: ArgumentType[] + }, options?: ContractOptions, +) { const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) options = options || {} @@ -34,3 +42,43 @@ export function deployWithGraphProxy(m: IgnitionModuleBuilder, contract: { name: return { proxy, implementation, instance } } + +export function upgradeWithGraphProxy( + m: IgnitionModuleBuilder, + contract: { + name: string + artifact?: Artifact + proxyContract: ContractAtFuture + }, + options?: ContractOptions, +) { + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + + options = options || {} + + // Deploy new implementation + let implementation + if (contract.artifact === undefined) { + implementation = m.contract(contract.name, [], {}) + } else { + implementation = m.contract(contract.name, contract.artifact, [], {}) + } + + // Upgrade proxy to new implementation + const proxy = contract.proxyContract + const upgradeCall = m.call(GraphProxyAdmin, 'upgrade', [proxy, implementation], options) + m.call(GraphProxyAdmin, 'acceptProxy', [implementation, proxy], { + ...options, + after: [upgradeCall], + }) + + // Load proxy with new implementation ABI + let instance + if (contract.artifact === undefined) { + instance = m.contractAt(contract.name, proxy, {}) + } else { + instance = m.contractAt(`${contract.name}_Instance`, contract.artifact, proxy, {}) + } + + return { proxy, implementation, instance } +} diff --git a/packages/horizon/package.json b/packages/horizon/package.json index ba3ff93c9..0ec466d1a 100644 --- a/packages/horizon/package.json +++ b/packages/horizon/package.json @@ -23,7 +23,7 @@ "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.8", "@nomicfoundation/hardhat-foundry": "^1.1.1", - "@nomicfoundation/hardhat-ignition": "^0.15.8", + "@nomicfoundation/hardhat-ignition": "^0.15.9", "@nomicfoundation/hardhat-ignition-ethers": "^0.15.8", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomicfoundation/hardhat-toolbox": "^4.0.0", @@ -70,5 +70,10 @@ "**/*.json": [ "yarn lint:ts" ] + }, + "dependencies": { + "@tenderly/api-client": "^1.1.0", + "@tenderly/hardhat-tenderly": "^2.5.1", + "dotenv": "^16.4.7" } } diff --git a/packages/horizon/scripts/migrate.ts b/packages/horizon/scripts/migrate.ts new file mode 100644 index 000000000..0940aa869 --- /dev/null +++ b/packages/horizon/scripts/migrate.ts @@ -0,0 +1,184 @@ +require('json5/lib/register') + +import hre from 'hardhat' +import { ignition } from 'hardhat' +import { ethers } from 'ethers' +import { expect } from 'chai' + +import CurationModule from '../ignition/modules/periphery/Curation' +import RewardsManagerModule from '../ignition/modules/periphery/RewardsManager' +import HorizonProxiesModule from '../ignition/modules/core/HorizonProxies' +import HorizonStakingModule from '../ignition/modules/core/HorizonStaking' +import HorizonStakingExtensionModule from '../ignition/modules/core/HorizonStakingExtension' +import ControllerModule from '../ignition/modules/periphery/Controller' +import GraphPaymentsModule from '../ignition/modules/core/GraphPayments' +import PaymentsEscrowModule from '../ignition/modules/core/PaymentsEscrow' +import TAPCollectorModule from '../ignition/modules/core/TAPCollector' + +async function main() { + console.log(getHorizonBanner()) + + const deployer = await hre.accounts.provider.getSigner(0) + const governor = await hre.accounts.provider.getSigner(1) + + console.log('Using deployer account:', deployer.address) + console.log('Using governor account:', governor.address) + + const HorizonMigrateConfig = removeNFromBigInts(require('../ignition/configs/horizon-migrate.hardhat.json5')) + + // Deploy and update proxy with new version of L2Curation + console.log('Upgrading Curation...') + const { instance: Curation, implementation: CurationImplementation } = await ignition.deploy( + CurationModule, { parameters: HorizonMigrateConfig }, + ) + console.log('Curation deployed at:', Curation.target as string) + console.log('Curation implementation updated to:', CurationImplementation.target as string) + console.log('==============================================') + + // Deploy and update proxy with new version of RewardsManager + console.log('Upgrading RewardsManager...') + const { instance: RewardsManager, implementation: RewardsManagerImplementation } = await ignition.deploy( + RewardsManagerModule, { parameters: HorizonMigrateConfig }, + ) + console.log('RewardsManager deployed at:', RewardsManager.target as string) + console.log('RewardsManager implementation updated to:', RewardsManagerImplementation.target as string) + console.log('==============================================') + + // Deploy GraphPayments and PaymentsEscrow proxies + console.log('Deploying GraphPayments and PaymentsEscrow proxies...') + const { + GraphPaymentsProxy, + PaymentsEscrowProxy, + GraphPaymentsProxyAdmin, + PaymentsEscrowProxyAdmin, + } = await ignition.deploy(HorizonProxiesModule, { parameters: HorizonMigrateConfig }) + + console.log('GraphPaymentsProxy deployed at:', GraphPaymentsProxy.target as string) + console.log('PaymentsEscrowProxy deployed at:', PaymentsEscrowProxy.target as string) + console.log('GraphPaymentsProxyAdmin deployed at:', GraphPaymentsProxyAdmin.target as string) + console.log('PaymentsEscrowProxyAdmin deployed at:', PaymentsEscrowProxyAdmin.target as string) + console.log('==============================================') + + // Check if controller has all contracts registered + console.log('Checking if controller has all contracts registered...') + const { Controller } = await ignition.deploy(ControllerModule, { parameters: HorizonMigrateConfig }) + + const graphTokenAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('GraphToken'))) + expect(graphTokenAddress).to.equal(HorizonMigrateConfig.$global.graphTokenProxyAddress, 'GraphToken address does not match') + console.log('Controller_GraphToken address:', graphTokenAddress) + + const stakingAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('Staking'))) + expect(stakingAddress).to.equal(HorizonMigrateConfig.$global.horizonStakingProxyAddress, 'Staking address does not match') + console.log('Controller_Staking address:', stakingAddress) + + const graphPaymentsAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('GraphPayments'))) + expect(graphPaymentsAddress).to.equal(GraphPaymentsProxy.target as string, 'GraphPayments address does not match') + console.log('Controller_GraphPayments address:', graphPaymentsAddress) + + const paymentsEscrowAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow'))) + expect(paymentsEscrowAddress).to.equal(PaymentsEscrowProxy.target as string, 'PaymentsEscrow address does not match') + console.log('Controller_PaymentsEscrow address:', paymentsEscrowAddress) + + const epochManagerAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('EpochManager'))) + expect(epochManagerAddress).to.equal(HorizonMigrateConfig.$global.epochManagerProxyAddress, 'EpochManager address does not match') + console.log('Controller_EpochManager address:', epochManagerAddress) + + const rewardsManagerAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('RewardsManager'))) + expect(rewardsManagerAddress).to.equal(RewardsManager.target as string, 'RewardsManager address does not match') + console.log('Controller_RewardsManager address:', rewardsManagerAddress) + + const graphTokenGatewayAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('GraphTokenGateway'))) + expect(graphTokenGatewayAddress).to.equal(HorizonMigrateConfig.$global.graphTokenGatewayProxyAddress, 'GraphTokenGateway address does not match') + console.log('Controller_GraphTokenGateway address:', graphTokenGatewayAddress) + + const graphProxyAdminAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('GraphProxyAdmin'))) + expect(graphProxyAdminAddress).to.equal(HorizonMigrateConfig.$global.graphProxyAdminAddress, 'GraphProxyAdmin address does not match') + console.log('Controller_GraphProxyAdmin address:', graphProxyAdminAddress) + + const curationAddress = await Controller.getContractProxy(ethers.keccak256(ethers.toUtf8Bytes('Curation'))) + expect(curationAddress).to.equal(Curation.target as string, 'Curation address does not match') + console.log('Controller_Curation address:', curationAddress) + console.log('==============================================') + + // Deploy HorizonStakingExtension + console.log('Deploying HorizonStakingExtension...') + const { HorizonStakingExtension } = await ignition.deploy(HorizonStakingExtensionModule, { parameters: HorizonMigrateConfig }) + console.log('HorizonStakingExtension deployed at:', HorizonStakingExtension.target as string) + console.log('==============================================') + + // Deploy HorizonStaking implementation and upgrade proxy + console.log('Deploying HorizonStaking implementation...') + const { HorizonStakingImplementation, HorizonStaking } = await ignition.deploy(HorizonStakingModule, { parameters: HorizonMigrateConfig }) + console.log('HorizonStakingImplementation deployed at:', HorizonStakingImplementation.target as string) + console.log('HorizonStakingProxy implementation updated') + console.log('==============================================') + + // Deploy GraphPayments implementation and upgrade proxy + console.log('Deploying GraphPayments implementation...') + const { GraphPayments, GraphPaymentsImplementation } = await ignition.deploy(GraphPaymentsModule, { parameters: HorizonMigrateConfig }) + console.log('GraphPaymentsImplementation deployed at:', GraphPaymentsImplementation.target as string) + console.log('GraphPaymentsProxy implementation updated') + console.log('==============================================') + + // Deploy PaymentsEscrow implementation and upgrade proxy + console.log('Deploying PaymentsEscrow implementation...') + const { PaymentsEscrow, PaymentsEscrowImplementation } = await ignition.deploy(PaymentsEscrowModule, { parameters: HorizonMigrateConfig }) + console.log('PaymentsEscrowImplementation deployed at:', PaymentsEscrowImplementation.target as string) + console.log('PaymentsEscrowProxy implementation updated') + console.log('==============================================') + + // Deploy TAPCollector + console.log('Deploying TAPCollector...') + const { TAPCollector } = await ignition.deploy(TAPCollectorModule, { parameters: HorizonMigrateConfig }) + console.log('TAPCollector deployed at:', TAPCollector.target as string) + console.log('==============================================') + + // Check if parameters are set correctly + console.log('Checking if parameters are set correctly...') + expect(await HorizonStaking.getMaxThawingPeriod()).to.equal(HorizonMigrateConfig.HorizonStaking.maxThawingPeriod, 'Max thawing period does not match') + expect(await GraphPayments.PROTOCOL_PAYMENT_CUT()).to.equal(HorizonMigrateConfig.GraphPayments.protocolPaymentCut, 'Protocol payment cut does not match') + expect(await PaymentsEscrow.WITHDRAW_ESCROW_THAWING_PERIOD()).to.equal(HorizonMigrateConfig.PaymentsEscrow.withdrawEscrowThawingPeriod, 'Withdraw escrow thawing period does not match') + expect(await TAPCollector.REVOKE_SIGNER_THAWING_PERIOD()).to.equal(HorizonMigrateConfig.TAPCollector.revokeSignerThawingPeriod, 'Revoke signer thawing period does not match') + console.log('Parameters are set correctly') + console.log('==============================================') + + console.log('Migration successful! 🎉') +} + +main().catch((error) => { + console.error(error) + process.exit(1) +}) + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function removeNFromBigInts(obj: any): any { + // Ignition requires "n" suffix for bigints, but not here + if (typeof obj === 'string') { + return obj.replace(/(\d+)n/g, '$1') + } else if (Array.isArray(obj)) { + return obj.map(removeNFromBigInts) + } else if (typeof obj === 'object' && obj !== null) { + for (const key in obj) { + obj[key] = removeNFromBigInts(obj[key]) + } + } + return obj +} + +function getHorizonBanner(): string { + return ` +██╗ ██╗ ██████╗ ██████╗ ██╗███████╗ ██████╗ ███╗ ██╗ +██║ ██║██╔═══██╗██╔══██╗██║╚══███╔╝██╔═══██╗████╗ ██║ +███████║██║ ██║██████╔╝██║ ███╔╝ ██║ ██║██╔██╗ ██║ +██╔══██║██║ ██║██╔══██╗██║ ███╔╝ ██║ ██║██║╚██╗██║ +██║ ██║╚██████╔╝██║ ██║██║███████╗╚██████╔╝██║ ╚████║ +╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═══╝ + +██╗ ██╗██████╗ ██████╗ ██████╗ █████╗ ██████╗ ███████╗ +██║ ██║██╔══██╗██╔════╝ ██╔══██╗██╔══██╗██╔══██╗██╔════╝ +██║ ██║██████╔╝██║ ███╗██████╔╝███████║██║ ██║█████╗ +██║ ██║██╔═══╝ ██║ ██║██╔══██╗██╔══██║██║ ██║██╔══╝ +╚██████╔╝██║ ╚██████╔╝██║ ██║██║ ██║██████╔╝███████╗ + ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚══════╝ +` +} diff --git a/yarn.lock b/yarn.lock index 927c703e1..55d195c7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -772,6 +772,13 @@ __metadata: 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 + "@chainsafe/as-sha256@npm:^0.3.1": version: 0.3.1 resolution: "@chainsafe/as-sha256@npm:0.3.1" @@ -2933,7 +2940,7 @@ __metadata: "@nomicfoundation/hardhat-chai-matchers": "npm:^2.0.0" "@nomicfoundation/hardhat-ethers": "npm:^3.0.8" "@nomicfoundation/hardhat-foundry": "npm:^1.1.1" - "@nomicfoundation/hardhat-ignition": "npm:^0.15.8" + "@nomicfoundation/hardhat-ignition": "npm:^0.15.9" "@nomicfoundation/hardhat-ignition-ethers": "npm:^0.15.8" "@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0" "@nomicfoundation/hardhat-toolbox": "npm:^4.0.0" @@ -2941,12 +2948,15 @@ __metadata: "@nomicfoundation/ignition-core": "npm:^0.15.8" "@openzeppelin/contracts": "npm:^5.0.2" "@openzeppelin/contracts-upgradeable": "npm:^5.0.2" + "@tenderly/api-client": "npm:^1.1.0" + "@tenderly/hardhat-tenderly": "npm:^2.5.1" "@typechain/ethers-v6": "npm:^0.5.0" "@typechain/hardhat": "npm:^9.0.0" "@types/chai": "npm:^4.2.0" "@types/mocha": "npm:>=9.1.0" "@types/node": "npm:>=16.0.0" chai: "npm:^4.2.0" + dotenv: "npm:^16.4.7" eslint: "npm:^8.56.0" eslint-graph-config: "workspace:^0.0.1" ethers: "npm:^6.13.4" @@ -4722,7 +4732,7 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-ethers@npm:^3.0.8": +"@nomicfoundation/hardhat-ethers@npm:^3.0.0, @nomicfoundation/hardhat-ethers@npm:^3.0.8": version: 3.0.8 resolution: "@nomicfoundation/hardhat-ethers@npm:3.0.8" dependencies: @@ -4759,6 +4769,24 @@ __metadata: languageName: node linkType: hard +"@nomicfoundation/hardhat-ignition@npm:^0.15.5, @nomicfoundation/hardhat-ignition@npm:^0.15.9": + version: 0.15.9 + resolution: "@nomicfoundation/hardhat-ignition@npm:0.15.9" + dependencies: + "@nomicfoundation/ignition-core": "npm:^0.15.9" + "@nomicfoundation/ignition-ui": "npm:^0.15.9" + chalk: "npm:^4.0.0" + debug: "npm:^4.3.2" + fs-extra: "npm:^10.0.0" + json5: "npm:^2.2.3" + prompts: "npm:^2.4.2" + peerDependencies: + "@nomicfoundation/hardhat-verify": ^2.0.1 + hardhat: ^2.18.0 + checksum: b8d6b3f92a0183d6d3bb7b3f9919860ba001dc8d0995d74ad1a324110b93d4dfbdbfb685e8a4a3bec6da5870750325d63ebe014653a7248366adac02ff142841 + languageName: node + linkType: hard + "@nomicfoundation/hardhat-ignition@npm:^0.15.8": version: 0.15.8 resolution: "@nomicfoundation/hardhat-ignition@npm:0.15.8" @@ -4832,6 +4860,25 @@ __metadata: languageName: node linkType: hard +"@nomicfoundation/hardhat-verify@npm:^2.0.8": + version: 2.0.12 + resolution: "@nomicfoundation/hardhat-verify@npm:2.0.12" + dependencies: + "@ethersproject/abi": "npm:^5.1.2" + "@ethersproject/address": "npm:^5.0.2" + cbor: "npm:^8.1.0" + debug: "npm:^4.1.1" + lodash.clonedeep: "npm:^4.5.0" + picocolors: "npm:^1.1.0" + semver: "npm:^6.3.0" + table: "npm:^6.8.0" + undici: "npm:^5.14.0" + peerDependencies: + hardhat: ^2.0.4 + checksum: 551f11346480175362023807b4cebbdacc5627db70e2b4fb0afa04d8ec2c26c3b05d2e74821503e881ba745ec6e2c3a678af74206364099ec14e584a811b2564 + languageName: node + linkType: hard + "@nomicfoundation/ignition-core@npm:^0.15.8": version: 0.15.8 resolution: "@nomicfoundation/ignition-core@npm:0.15.8" @@ -4849,6 +4896,23 @@ __metadata: languageName: node linkType: hard +"@nomicfoundation/ignition-core@npm:^0.15.9": + version: 0.15.9 + resolution: "@nomicfoundation/ignition-core@npm:0.15.9" + dependencies: + "@ethersproject/address": "npm:5.6.1" + "@nomicfoundation/solidity-analyzer": "npm:^0.1.1" + cbor: "npm:^9.0.0" + debug: "npm:^4.3.2" + ethers: "npm:^6.7.0" + fs-extra: "npm:^10.0.0" + immer: "npm:10.0.2" + lodash: "npm:4.17.21" + ndjson: "npm:2.0.0" + checksum: fe02e3f4a981ef338e3acf75cf2e05535c2aba21f4c5b5831b1430fcaa7bbb42b16bd8ac4bb0b9f036d0b9eb1aede5fa57890f0c3863c4ae173d45ac3e484ed8 + languageName: node + linkType: hard + "@nomicfoundation/ignition-ui@npm:^0.15.8": version: 0.15.8 resolution: "@nomicfoundation/ignition-ui@npm:0.15.8" @@ -4856,6 +4920,22 @@ __metadata: 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 + languageName: node + linkType: hard + +"@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 + "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1": version: 0.1.1 resolution: "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1" @@ -5124,6 +5204,13 @@ __metadata: 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" @@ -5187,6 +5274,38 @@ __metadata: languageName: node linkType: hard +"@openzeppelin/defender-sdk-base-client@npm:^1.14.4, @openzeppelin/defender-sdk-base-client@npm:^1.15.2": + version: 1.15.2 + resolution: "@openzeppelin/defender-sdk-base-client@npm:1.15.2" + dependencies: + amazon-cognito-identity-js: "npm:^6.3.6" + async-retry: "npm:^1.3.3" + checksum: cb1f5a286564b7f4da0c6f4b21f032b7e09697c2e476c2cf3d957287bc9dc880d0f1c2a4b21d42bc8246a99ea117ce39cfff6fd18f20ca63ac3dc859a43b62a1 + languageName: node + linkType: hard + +"@openzeppelin/defender-sdk-deploy-client@npm:^1.14.4": + version: 1.15.2 + resolution: "@openzeppelin/defender-sdk-deploy-client@npm:1.15.2" + dependencies: + "@openzeppelin/defender-sdk-base-client": "npm:^1.15.2" + axios: "npm:^1.7.2" + lodash: "npm:^4.17.21" + checksum: af3db2976d14bdeb7b24e109209a37fcd98ab14176ebd62f0543d0dff552fd9359b382e35c2698315e195c42f55b2bc52b2aea0f598a070ac0a24274a1ba93d9 + languageName: node + linkType: hard + +"@openzeppelin/defender-sdk-network-client@npm:^1.14.4": + version: 1.15.2 + resolution: "@openzeppelin/defender-sdk-network-client@npm:1.15.2" + dependencies: + "@openzeppelin/defender-sdk-base-client": "npm:^1.15.2" + axios: "npm:^1.7.2" + lodash: "npm:^4.17.21" + checksum: ce0021d34244353c5251c51ad1d49e06e3234993d65846d216e1e75fbe7a0ce740d2f4c7ab23a689ce07eacb9979e44fab93d40509d571284993bda3c8138446 + languageName: node + linkType: hard + "@openzeppelin/hardhat-defender@npm:^1.8.1": version: 1.9.0 resolution: "@openzeppelin/hardhat-defender@npm:1.9.0" @@ -5223,6 +5342,33 @@ __metadata: languageName: node linkType: hard +"@openzeppelin/hardhat-upgrades@npm:^3.3.0": + version: 3.8.0 + resolution: "@openzeppelin/hardhat-upgrades@npm:3.8.0" + dependencies: + "@openzeppelin/defender-sdk-base-client": "npm:^1.14.4" + "@openzeppelin/defender-sdk-deploy-client": "npm:^1.14.4" + "@openzeppelin/defender-sdk-network-client": "npm:^1.14.4" + "@openzeppelin/upgrades-core": "npm:^1.41.0" + chalk: "npm:^4.1.0" + debug: "npm:^4.1.1" + ethereumjs-util: "npm:^7.1.5" + proper-lockfile: "npm:^4.1.1" + undici: "npm:^6.11.1" + peerDependencies: + "@nomicfoundation/hardhat-ethers": ^3.0.0 + "@nomicfoundation/hardhat-verify": ^2.0.0 + ethers: ^6.6.0 + hardhat: ^2.0.2 + peerDependenciesMeta: + "@nomicfoundation/hardhat-verify": + optional: true + bin: + migrate-oz-cli-project: dist/scripts/migrate-oz-cli-project.js + checksum: fce87807374c6e1e373bdbb19b605f94462ad5fddf6a32b68d3075fc0cd7bcd8a1dab2a2aa7ebfc34689d6c1126ba2a4d287d467d1c585af455ecd27894591e8 + languageName: node + linkType: hard + "@openzeppelin/platform-deploy-client@npm:^0.8.0": version: 0.8.0 resolution: "@openzeppelin/platform-deploy-client@npm:0.8.0" @@ -5254,6 +5400,26 @@ __metadata: languageName: node linkType: hard +"@openzeppelin/upgrades-core@npm:^1.32.2, @openzeppelin/upgrades-core@npm:^1.41.0": + version: 1.41.0 + resolution: "@openzeppelin/upgrades-core@npm:1.41.0" + dependencies: + "@nomicfoundation/slang": "npm:^0.18.3" + cbor: "npm:^9.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: 91eb03c6b78aabc9236539f2b96a3c44354103df748d6ce3f44de062e61bd606de1892214d9a25cfbf29acc6bf38ea924eac246ca7f97769505dba74b13cc17f + languageName: node + linkType: hard + "@peculiar/asn1-schema@npm:^2.3.8": version: 2.3.8 resolution: "@peculiar/asn1-schema@npm:2.3.8" @@ -5727,6 +5893,50 @@ __metadata: languageName: node linkType: hard +"@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" @@ -5759,6 +5969,23 @@ __metadata: languageName: node linkType: hard +"@tenderly/hardhat-tenderly@npm:^2.5.1": + version: 2.5.1 + resolution: "@tenderly/hardhat-tenderly@npm:2.5.1" + dependencies: + "@ethersproject/bignumber": "npm:^5.7.0" + "@nomicfoundation/hardhat-ethers": "npm:^3.0.0" + "@nomicfoundation/hardhat-ignition": "npm:^0.15.5" + "@nomicfoundation/hardhat-verify": "npm:^2.0.8" + "@openzeppelin/hardhat-upgrades": "npm:^3.3.0" + "@openzeppelin/upgrades-core": "npm:^1.32.2" + "@tenderly/hardhat-integration": "npm:^1.1.0" + dotenv: "npm:^16.4.5" + ethers: "npm:^6.8.1" + checksum: a50270a6fda8ce6c728e3939c8885590d8b42316e79c8f5b8c77e83cb9f409f7acd1c9e00e72bfc18e7eeacd1e2c0dba9cc0342fc111cfe053ede63bf8ee5652 + languageName: node + linkType: hard + "@truffle/error@npm:^0.1.1": version: 0.1.1 resolution: "@truffle/error@npm:0.1.1" @@ -7056,6 +7283,19 @@ __metadata: languageName: node linkType: hard +"amazon-cognito-identity-js@npm:^6.3.6": + version: 6.3.14 + resolution: "amazon-cognito-identity-js@npm:6.3.14" + 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: 2487aa3fa73ff952cbd233a014dda9c53f952e0820695a54d19c2f8dc003ae2791210a224bbd676f570ea9f24a4fa0d8d43e8f02d911bfd5277ec3a9885afa53 + languageName: node + linkType: hard + "amdefine@npm:>=0.0.4": version: 1.0.1 resolution: "amdefine@npm:1.0.1" @@ -7660,6 +7900,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.6.7, axios@npm:^1.7.2": + version: 1.7.9 + resolution: "axios@npm:1.7.9" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: b7a41e24b59fee5f0f26c1fc844b45b17442832eb3a0fb42dd4f1430eb4abc571fe168e67913e8a1d91c993232bd1d1ab03e20e4d1fee8c6147649b576fc1b0b + languageName: node + linkType: hard + "babel-code-frame@npm:^6.26.0": version: 6.26.0 resolution: "babel-code-frame@npm:6.26.0" @@ -11073,6 +11324,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^16.4.5, dotenv@npm:^16.4.7": + version: 16.4.7 + resolution: "dotenv@npm:16.4.7" + checksum: be9f597e36a8daf834452daa1f4cc30e5375a5968f98f46d89b16b983c567398a330580c88395069a77473943c06b877d1ca25b4afafcdd6d4adb549e8293462 + languageName: node + linkType: hard + "dotenv@npm:^9.0.0": version: 9.0.2 resolution: "dotenv@npm:9.0.2" @@ -12402,6 +12660,21 @@ __metadata: languageName: node linkType: hard +"ethers@npm:^6.8.1": + version: 6.13.5 + resolution: "ethers@npm:6.13.5" + dependencies: + "@adraffy/ens-normalize": "npm:1.10.1" + "@noble/curves": "npm:1.2.0" + "@noble/hashes": "npm:1.3.2" + "@types/node": "npm:22.7.5" + aes-js: "npm:4.0.0-beta.5" + tslib: "npm:2.7.0" + ws: "npm:8.17.1" + checksum: 64bc7b8907de199392b8a88c15c9a085892919cff7efa2e5326abc7fe5c426001726c51d91e10c74e5fc5e2547188297ce4127f6e52ea42a97ade0b2ae474677 + languageName: node + linkType: hard + "ethjs-unit@npm:0.1.6": version: 0.1.6 resolution: "ethjs-unit@npm:0.1.6" @@ -14301,7 +14574,7 @@ __metadata: languageName: node linkType: hard -"hardhat-deploy@npm:^0.11.14": +"hardhat-deploy@npm:^0.11.14, hardhat-deploy@npm:^0.11.43": version: 0.11.45 resolution: "hardhat-deploy@npm:0.11.45" dependencies: @@ -14949,6 +15222,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" @@ -16719,7 +17001,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 @@ -18138,6 +18420,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.5": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + "minimist-options@npm:4.1.0, minimist-options@npm:^4.0.2": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -19002,6 +19293,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" @@ -20337,7 +20656,7 @@ __metadata: 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 @@ -21790,6 +22109,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + languageName: node + linkType: hard + "semver@npm:~5.4.1": version: 5.4.1 resolution: "semver@npm:5.4.1" @@ -24291,6 +24619,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.5.4": + version: 5.7.2 + resolution: "typescript@npm:5.7.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: a873118b5201b2ef332127ef5c63fb9d9c155e6fdbe211cbd9d8e65877283797cca76546bad742eea36ed7efbe3424a30376818f79c7318512064e8625d61622 + languageName: node + linkType: hard + "typescript@npm:^5.6.3": version: 5.6.3 resolution: "typescript@npm:5.6.3" @@ -24321,6 +24659,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A^5.5.4#optional!builtin": + version: 5.7.2 + resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: c891ccf04008bc1305ba34053db951f8a4584b4a1bf2f68fd972c4a354df3dc5e62c8bfed4f6ac2d12e5b3b1c49af312c83a651048f818cd5b4949d17baacd79 + 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" @@ -24482,6 +24830,13 @@ __metadata: languageName: node linkType: hard +"undici@npm:^6.11.1": + version: 6.21.0 + resolution: "undici@npm:6.21.0" + checksum: afa9bde6dcf8e0f5cf1ff2fa977ba73dd5510299ddfca0e1f37ff326554172ae31cb3d4a40b5a729601be1f21b96a2684f974d74dab53f9b6930fd47d1949246 + languageName: node + linkType: hard + "unfetch@npm:^4.2.0": version: 4.2.0 resolution: "unfetch@npm:4.2.0" @@ -24773,6 +25128,13 @@ __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"