diff --git a/packages/contracts/contracts/upgrades/GraphProxy.sol b/packages/contracts/contracts/upgrades/GraphProxy.sol index 7d227b065..c5c01ca8f 100644 --- a/packages/contracts/contracts/upgrades/GraphProxy.sol +++ b/packages/contracts/contracts/upgrades/GraphProxy.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; - -import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +pragma solidity >=0.6.12 <0.9.0; import { GraphProxyStorage } from "./GraphProxyStorage.sol"; @@ -160,7 +158,6 @@ contract GraphProxy is GraphProxyStorage, IGraphProxy { */ function _acceptUpgrade() internal { address _pendingImplementation = _getPendingImplementation(); - require(Address.isContract(_pendingImplementation), "Impl must be a contract"); require(_pendingImplementation != address(0), "Impl cannot be zero address"); require(msg.sender == _pendingImplementation, "Only pending implementation"); diff --git a/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol b/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol index 7d809d5ec..8fb735901 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity >=0.6.12 <0.9.0; import { Governed } from "../governance/Governed.sol"; diff --git a/packages/contracts/contracts/upgrades/GraphProxyStorage.sol b/packages/contracts/contracts/upgrades/GraphProxyStorage.sol index 05b922647..42e2a0545 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyStorage.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyStorage.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity >=0.6.12 <0.9.0; /** * @title Graph Proxy Storage diff --git a/packages/horizon/contracts/payments/PaymentsEscrow.sol b/packages/horizon/contracts/payments/PaymentsEscrow.sol index 88b13b962..c6cef4a34 100644 --- a/packages/horizon/contracts/payments/PaymentsEscrow.sol +++ b/packages/horizon/contracts/payments/PaymentsEscrow.sol @@ -76,8 +76,8 @@ contract PaymentsEscrow is Multicall, GraphDirectory, IPaymentsEscrow { revert GraphEscrowThawingPeriodTooLong(withdrawEscrowThawingPeriod, MAX_THAWING_PERIOD); } - revokeCollectorThawingPeriod = revokeCollectorThawingPeriod; - withdrawEscrowThawingPeriod = withdrawEscrowThawingPeriod; + REVOKE_COLLECTOR_THAWING_PERIOD = revokeCollectorThawingPeriod; + WITHDRAW_ESCROW_THAWING_PERIOD = withdrawEscrowThawingPeriod; } // approve a data service to collect funds diff --git a/packages/horizon/test/GraphBase.t.sol b/packages/horizon/test/GraphBase.t.sol index 51a5b4d5a..f348ca3f0 100644 --- a/packages/horizon/test/GraphBase.t.sol +++ b/packages/horizon/test/GraphBase.t.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.24; import "forge-std/Test.sol"; +import { GraphProxyAdmin } from "@graphprotocol/contracts/contracts/upgrades/GraphProxyAdmin.sol"; +import { GraphProxy } from "@graphprotocol/contracts/contracts/upgrades/GraphProxy.sol"; import { Controller } from "@graphprotocol/contracts/contracts/governance/Controller.sol"; import { PaymentsEscrow } from "contracts/payments/PaymentsEscrow.sol"; @@ -18,6 +20,7 @@ abstract contract GraphBaseTest is Test, Constants { /* Contracts */ + GraphProxyAdmin public proxyAdmin; Controller public controller; MockGRTToken public token; GraphPayments public payments; @@ -41,6 +44,7 @@ abstract contract GraphBaseTest is Test, Constants { function setUp() public virtual { // Deploy ERC20 token + vm.prank(users.deployer); token = new MockGRTToken(); // Setup Users @@ -68,10 +72,13 @@ abstract contract GraphBaseTest is Test, Constants { function deployProtocolContracts() private { vm.startPrank(users.governor); + proxyAdmin = new GraphProxyAdmin(); controller = new Controller(); - controller.setContractProxy(keccak256("GraphToken"), address(token)); vm.stopPrank(); + // Staking Proxy + vm.prank(users.deployer); + GraphProxy stakingProxy = new GraphProxy(address(0), address(proxyAdmin)); // GraphPayments predict address bytes32 saltPayments = keccak256("GraphPaymentsSalt"); @@ -101,39 +108,16 @@ abstract contract GraphBaseTest is Test, Constants { users.deployer ); - // HorizonStakingExtension predict address - bytes32 saltHorizonStakingExtension = keccak256("HorizonStakingExtensionSalt"); - bytes32 horizonStakingExtensionHash = keccak256(bytes.concat( - vm.getCode("HorizonStakingExtension.sol:HorizonStakingExtension"), - abi.encode(address(controller), subgraphDataServiceAddress) - )); - address predictedAddressHorizonStakingExtension = vm.computeCreate2Address( - saltHorizonStakingExtension, - horizonStakingExtensionHash, - users.deployer - ); - - // HorizonStaking predict address - bytes32 saltHorizonStaking = keccak256("saltHorizonStaking"); - bytes32 horizonStakingHash = keccak256(bytes.concat( - vm.getCode("HorizonStaking.sol:HorizonStaking"), - abi.encode( - address(controller), - predictedAddressHorizonStakingExtension, - subgraphDataServiceAddress - ) - )); - address predictedAddressHorizonStaking = vm.computeCreate2Address( - saltHorizonStaking, - horizonStakingHash, - users.deployer - ); - // Setup controller vm.startPrank(users.governor); - controller.setContractProxy(keccak256("GraphEscrow"), predictedAddressEscrow); + controller.setContractProxy(keccak256("GraphToken"), address(token)); + controller.setContractProxy(keccak256("PaymentsEscrow"), predictedAddressEscrow); controller.setContractProxy(keccak256("GraphPayments"), predictedPaymentsAddress); - controller.setContractProxy(keccak256("Staking"), address(predictedAddressHorizonStaking)); + controller.setContractProxy(keccak256("Staking"), address(stakingProxy)); + controller.setContractProxy(keccak256("EpochManager"), makeAddr("EpochManager")); + controller.setContractProxy(keccak256("RewardsManager"), makeAddr("RewardsManager")); + controller.setContractProxy(keccak256("Curation"), makeAddr("Curation")); + controller.setContractProxy(keccak256("GraphTokenGateway"), makeAddr("GraphTokenGateway")); vm.stopPrank(); vm.startPrank(users.deployer); @@ -146,16 +130,21 @@ abstract contract GraphBaseTest is Test, Constants { revokeCollectorThawingPeriod, withdrawEscrowThawingPeriod ); - stakingExtension = new HorizonStakingExtension{salt: saltHorizonStakingExtension}( + stakingExtension = new HorizonStakingExtension( address(controller), subgraphDataServiceAddress ); - stakingBase = new HorizonStaking{salt: saltHorizonStaking}( + stakingBase = new HorizonStaking( address(controller), address(stakingExtension), subgraphDataServiceAddress ); - staking = IHorizonStaking(address(stakingBase)); + vm.stopPrank(); + + vm.startPrank(users.governor); + proxyAdmin.upgrade(stakingProxy, address(stakingBase)); + proxyAdmin.acceptProxy(stakingBase, stakingProxy); + staking = IHorizonStaking(address(stakingProxy)); vm.stopPrank(); } diff --git a/packages/horizon/test/HorizonStaking.t.sol b/packages/horizon/test/HorizonStaking.t.sol deleted file mode 100644 index 55088f0fe..000000000 --- a/packages/horizon/test/HorizonStaking.t.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.24; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import { HorizonStaking } from "../contracts/staking/HorizonStaking.sol"; -import { ControllerMock } from "../contracts/mocks/ControllerMock.sol"; -import { HorizonStakingExtension } from "../contracts/staking/HorizonStakingExtension.sol"; -import { ExponentialRebates } from "../contracts/staking/libraries/ExponentialRebates.sol"; -import { IHorizonStaking } from "../contracts/interfaces/IHorizonStaking.sol"; - -contract HorizonStakingTest is Test { - HorizonStakingExtension ext; - IHorizonStaking staking; - ControllerMock controller; - - function setUp() public { - console.log("Deploying Controller mock"); - controller = new ControllerMock(address(0x1)); - console.log("Deploying HorizonStaking"); - ext = new HorizonStakingExtension(address(controller), address(0x1)); - staking = IHorizonStaking(address(new HorizonStaking(address(controller), address(ext), address(0x1)))); - } - - function test_SetGlobalOperator() public { - address operator = address(0x1337); - address dataService = address(0x1338); - address serviceProvider = address(this); - - staking.setOperator(operator, dataService, true); - assertTrue(staking.isAuthorized(operator, serviceProvider, dataService)); - } -} diff --git a/packages/horizon/test/HorizonStaking.ts b/packages/horizon/test/HorizonStaking.ts deleted file mode 100644 index 28eb281f7..000000000 --- a/packages/horizon/test/HorizonStaking.ts +++ /dev/null @@ -1,38 +0,0 @@ -import hardhat from 'hardhat' - -import { expect } from 'chai' -import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' -import { ZeroAddress } from 'ethers' -import { IHorizonStaking } from '../typechain-types' - -const ethers = hardhat.ethers - -describe('HorizonStaking', function () { - async function deployFixture() { - const [owner] = await ethers.getSigners() - const ControllerMock = await ethers.getContractFactory('ControllerMock') - const controller = await ControllerMock.deploy(owner.address) - await controller.waitForDeployment() - const ExponentialRebates = await ethers.getContractFactory('ExponentialRebates') - const exponentialRebates = await ExponentialRebates.deploy() - await exponentialRebates.waitForDeployment() - const HorizonStakingExtension = await ethers.getContractFactory('HorizonStakingExtension', { libraries: { ExponentialRebates: exponentialRebates.target } }) - const horizonStakingExtension = await HorizonStakingExtension.deploy(controller.target, ZeroAddress) - await horizonStakingExtension.waitForDeployment() - const HorizonStaking = await ethers.getContractFactory('HorizonStaking') - const horizonStakingContract = await HorizonStaking.deploy(controller.target, horizonStakingExtension.target, ZeroAddress) - await horizonStakingContract.waitForDeployment() - const horizonStaking = (await ethers.getContractAt('IHorizonStaking', horizonStakingContract.target)) as unknown as IHorizonStaking - return { horizonStaking, owner } - } - - describe('setOperator', function () { - it('adds an operator', async function () { - const { horizonStaking, owner } = await loadFixture(deployFixture) - const verifier = ethers.Wallet.createRandom().address - const operator = ethers.Wallet.createRandom().address - await horizonStaking.connect(owner).setOperator(operator, verifier, true) - expect(await horizonStaking.isAuthorized(operator, owner, verifier)).to.be.true - }) - }) -})