From 9ab198e5ed0f7a4fcf61e407cb8ffd7ccf2cdbf3 Mon Sep 17 00:00:00 2001 From: Thai Xuan Dang Date: Thu, 1 Aug 2024 18:28:05 +0700 Subject: [PATCH] script: deploy Aggregate Router & Katana Governance logic --- .gitmodules | 5 --- Makefile | 7 ++++ lib/foundry-deployment-kit | 1 - remappings.txt | 3 +- script/DeployAggregateRouter.s.sol | 38 +++++++++++++++++++ script/UpgradeKatanaGovernance.s.sol | 38 +++++++++++++++++++ .../DeployKatanaOperationMainnet.s.sol | 28 ++++++++++++++ .../DeployKatanaOperationTestnet.s.sol | 28 ++++++++++++++ .../deploy/UnsupportedProtocol.sol | 12 ------ .../modules/katana/v3/V3SwapRouter.sol | 2 +- src/governance/KatanaGovernance.sol | 2 +- 11 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 Makefile delete mode 160000 lib/foundry-deployment-kit create mode 100644 script/DeployAggregateRouter.s.sol create mode 100644 script/UpgradeKatanaGovernance.s.sol create mode 100644 script/ronin-mainnet/DeployKatanaOperationMainnet.s.sol create mode 100644 script/ronin-testnet/DeployKatanaOperationTestnet.s.sol delete mode 100644 src/aggregate-router/deploy/UnsupportedProtocol.sol diff --git a/.gitmodules b/.gitmodules index 06df277..c680064 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,8 +1,3 @@ -[submodule "lib/foundry-deployment-kit"] - path = lib/foundry-deployment-kit - url = https://github.com/axieinfinity/foundry-deployment-kit - branch = v0.2.0 - [submodule "lib/openzeppelin-contracts"] path = lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3fa2765 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +deploy-testnet: + op run --env-file="./.env" -- \ + forge script DeployKatanaOperationTestnet -f ronin-testnet + +deploy-testnet-broadcast: + op run --env-file="./.env" -- \ + forge script DeployKatanaOperationTestnet -f ronin-testnet --verify --verifier sourcify --verifier-url https://sourcify.roninchain.com/server/ --legacy --broadcast \ No newline at end of file diff --git a/lib/foundry-deployment-kit b/lib/foundry-deployment-kit deleted file mode 160000 index 2f48f7d..0000000 --- a/lib/foundry-deployment-kit +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2f48f7dbed4b99688ecd2b42109e3400d296b3a3 diff --git a/remappings.txt b/remappings.txt index ca33729..db64295 100644 --- a/remappings.txt +++ b/remappings.txt @@ -2,4 +2,5 @@ @openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ solmate/=lib/solmate/ permit2/=lib/permit2/ -@katana/v3-contracts/=lib/katana-v3-contracts/src/ \ No newline at end of file +@katana/v3-contracts/=lib/katana-v3-contracts/src/ +@katana/operation-contracts/=src/ \ No newline at end of file diff --git a/script/DeployAggregateRouter.s.sol b/script/DeployAggregateRouter.s.sol new file mode 100644 index 0000000..9475c0f --- /dev/null +++ b/script/DeployAggregateRouter.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { Script, console } from "forge-std/Script.sol"; +import { RouterParameters } from "@katana/operation-contracts/aggregate-router/base/RouterImmutables.sol"; +import { AggregateRouter } from "@katana/operation-contracts/aggregate-router/AggregateRouter.sol"; + +abstract contract DeployAggregateRouter is Script { + RouterParameters public params; + + address public router; + + function setUp() public virtual { + assert(params.permit2 != address(0)); + assert(params.weth9 != address(0)); + assert(params.v2Factory != address(0)); + assert(params.v3Factory != address(0)); + assert(params.pairInitCodeHash != bytes32(0)); + assert(params.poolInitCodeHash != bytes32(0)); + + logParams(); + } + + function run() public virtual { + vm.broadcast(); + router = address(new AggregateRouter(params)); + console.log("Aggregate Router deployed:", router); + } + + function logParams() internal view virtual { + console.log("permit2:", params.permit2); + console.log("WRON:", params.weth9); + console.log("v2Factory:", params.v2Factory); + console.log("v3Factory:", params.v3Factory); + console.log("pairInitCodeHash:", vm.toString(params.pairInitCodeHash)); + console.log("poolInitCodeHash:", vm.toString(params.poolInitCodeHash)); + } +} diff --git a/script/UpgradeKatanaGovernance.s.sol b/script/UpgradeKatanaGovernance.s.sol new file mode 100644 index 0000000..690fc00 --- /dev/null +++ b/script/UpgradeKatanaGovernance.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { Script, console } from "forge-std/Script.sol"; +import { ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { KatanaGovernance } from "@katana/operation-contracts/governance/KatanaGovernance.sol"; +import { DeployAggregateRouter } from "./DeployAggregateRouter.s.sol"; + +abstract contract UpgradeKatanaGovernance is DeployAggregateRouter { + address public nonfungiblePositionManager; + address public katanaGovernanceProxy; + address public proxyAdmin; + + address public katanaGovernanceLogic; + + function setUp() public virtual override { + require(nonfungiblePositionManager != address(0)); + require(katanaGovernanceProxy != address(0)); + require(proxyAdmin != address(0)); + + super.setUp(); + } + + function run() public override { + super.run(); + + vm.broadcast(); + katanaGovernanceLogic = address(new KatanaGovernance(nonfungiblePositionManager)); + console.log("Katana Governance (logic) deployed:", katanaGovernanceLogic); + + console.log("Please upgrade to Katana Governance (logic) using ProxyAdmin", proxyAdmin); + console.log("Data:", vm.toString(abi.encodeCall(KatanaGovernance.initializeV2, (router)))); + } + + function logParams() internal view override { + console.log("nonfungiblePositionManager:", nonfungiblePositionManager); + } +} diff --git a/script/ronin-mainnet/DeployKatanaOperationMainnet.s.sol b/script/ronin-mainnet/DeployKatanaOperationMainnet.s.sol new file mode 100644 index 0000000..19a5672 --- /dev/null +++ b/script/ronin-mainnet/DeployKatanaOperationMainnet.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { RouterParameters } from "@katana/operation-contracts/aggregate-router/base/RouterImmutables.sol"; +import { UpgradeKatanaGovernance } from "../UpgradeKatanaGovernance.s.sol"; + +contract DeployKatanaOperationMainnet is UpgradeKatanaGovernance { + function setUp() public override { + params = RouterParameters({ + permit2: 0x000000000022D473030F116dDEE9F6B43aC78BA3, + weth9: 0xe514d9DEB7966c8BE0ca922de8a064264eA6bcd4, // WRON + governance: 0x2C1726346d83cBF848bD3C2B208ec70d32a9E44a, + v2Factory: 0xB255D6A720BB7c39fee173cE22113397119cB930, // KatanaV2Factory + v3Factory: address(0), // TODO: To be deployed + pairInitCodeHash: 0xe85772d2fe4ad93037659afaee57751696456eb5dd99987e43f3cf11c6e255a2, + poolInitCodeHash: 0x97ee45181a4d14c00cdcc956fefebfa98f8c8744e3fe6d83e1861dc77ff40a99 + }); + + proxyAdmin = 0xA3e7d085E65CB0B916f6717da876b7bE5cC92f03; // Proxy Admin + + nonfungiblePositionManager = address(0); // TODO: To be deployed + katanaGovernanceProxy = 0x2C1726346d83cBF848bD3C2B208ec70d32a9E44a; + + vm.rememberKey(vm.envUint("MAINNET_PK")); + + super.setUp(); + } +} diff --git a/script/ronin-testnet/DeployKatanaOperationTestnet.s.sol b/script/ronin-testnet/DeployKatanaOperationTestnet.s.sol new file mode 100644 index 0000000..835c5fe --- /dev/null +++ b/script/ronin-testnet/DeployKatanaOperationTestnet.s.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.17; + +import { RouterParameters } from "@katana/operation-contracts/aggregate-router/base/RouterImmutables.sol"; +import { UpgradeKatanaGovernance } from "../UpgradeKatanaGovernance.s.sol"; + +contract DeployKatanaOperationTestnet is UpgradeKatanaGovernance { + function setUp() public override { + params = RouterParameters({ + permit2: 0x000000000022D473030F116dDEE9F6B43aC78BA3, + weth9: 0xA959726154953bAe111746E265E6d754F48570E6, + governance: 0x247F12836A421CDC5e22B93Bf5A9AAa0f521f986, + v2Factory: 0x86587380C4c815Ba0066c90aDB2B45CC9C15E72c, + v3Factory: 0x249F235bB9Fed56131B7E44Fe453E71b422B0A42, + pairInitCodeHash: 0x1cc97ead4d6949b7a6ecb28652b21159b9fd5608ae51a1960224099caab07dca, + poolInitCodeHash: 0x97ee45181a4d14c00cdcc956fefebfa98f8c8744e3fe6d83e1861dc77ff40a99 + }); + + proxyAdmin = 0x505d91E8fd2091794b45b27f86C045529fa92CD7; + + nonfungiblePositionManager = 0x131A3C134EB0a957A69775A122e3688EdF8Ce05A; + katanaGovernanceProxy = 0x247F12836A421CDC5e22B93Bf5A9AAa0f521f986; + + vm.rememberKey(vm.envUint("TESTNET_PK")); + + super.setUp(); + } +} diff --git a/src/aggregate-router/deploy/UnsupportedProtocol.sol b/src/aggregate-router/deploy/UnsupportedProtocol.sol deleted file mode 100644 index e0f5579..0000000 --- a/src/aggregate-router/deploy/UnsupportedProtocol.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity ^0.8.17; - -/// @title Dummy contract that always reverts -/// @notice Used as a placeholder to ensure reverts on attempted calls to protocols unsupported on a given chain -contract UnsupportedProtocol { - error UnsupportedProtocolError(); - - fallback() external { - revert UnsupportedProtocolError(); - } -} diff --git a/src/aggregate-router/modules/katana/v3/V3SwapRouter.sol b/src/aggregate-router/modules/katana/v3/V3SwapRouter.sol index 8827db9..dc1b7c3 100644 --- a/src/aggregate-router/modules/katana/v3/V3SwapRouter.sol +++ b/src/aggregate-router/modules/katana/v3/V3SwapRouter.sol @@ -147,7 +147,7 @@ abstract contract V3SwapRouter is KatanaImmutables, Permit2Payments, IKatanaV3Sw returns (int256 amount0Delta, int256 amount1Delta, bool zeroForOne) { (address tokenIn, uint24 fee, address tokenOut) = path.decodeFirstPool(); - + address[] memory tokens = new address[](2); tokens[0] = tokenIn; tokens[1] = tokenOut; diff --git a/src/governance/KatanaGovernance.sol b/src/governance/KatanaGovernance.sol index 9b3a28b..2f85ce4 100644 --- a/src/governance/KatanaGovernance.sol +++ b/src/governance/KatanaGovernance.sol @@ -63,7 +63,7 @@ contract KatanaGovernance is OwnableUpgradeable, IKatanaV2Factory, IKatanaGovern } } - function initializeV2(address router) external reinitializer(2) { + function initializeV2(address router) external reinitializer(3) { _router = router; }