Skip to content

Commit d6f1e9e

Browse files
authored
Merge pull request #80 from BootNodeDev/mainnet-deploys
Deploy to mainnets
2 parents c01cb0f + 796d83a commit d6f1e9e

File tree

6 files changed

+150
-9
lines changed

6 files changed

+150
-9
lines changed

solidity/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ out
99

1010
# files
1111
*.env
12+
*.env.testnet
1213
*.log
1314
.DS_Store
1415
.pnp.*

solidity/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ implementations to create custom solutions. For example:
5555
This modular approach enables a high degree of flexibility, allowing developers to adapt the framework to various use
5656
cases and requirements.
5757

58+
## Deployment Addresses
59+
60+
| Blockchain | Proxy | Implementation |
61+
| ---------- | ----- | -------------- |
62+
| Mainnet | [`0x5F69f9aeEB44e713fBFBeb136d712b22ce49eb88`](https://etherscan.io/address/0x5F69f9aeEB44e713fBFBeb136d712b22ce49eb88) | [`0xF84c1bf6dC94f9DBdef81E61e974A6a8888263F9`](https://etherscan.io/address/0xF84c1bf6dC94f9DBdef81E61e974A6a8888263F9) |
63+
| Optimism | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://optimistic.etherscan.io/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://optimistic.etherscan.io/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
64+
| Arbitrum | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://arbiscan.io/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://arbiscan.io/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
65+
| Base | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://basescan.org/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://basescan.org/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
66+
| Gnosis | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://gnosisscan.io/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://gnosisscan.io/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
67+
| Berachain | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://berascan.com/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://berascan.com/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
68+
| Form | [`0x9245A985d2055CeA7576B293Da8649bb6C5af9D0`](https://explorer.form.network/address/0x9245A985d2055CeA7576B293Da8649bb6C5af9D0) | [`0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc`](https://explorer.form.network/address/0x8f9508C68ED70A7A02A4f8190604a81Ca8D79BEc) |
69+
70+
5871
## Scripts
5972

6073
### Deploy

solidity/foundry.toml

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,17 @@
2222
verbosity = 4
2323

2424
[etherscan]
25+
mainnet = { key = "${API_KEY_ETHERSCAN}" }
26+
optimism = { key = "${API_KEY_OPTIMISTIC_ETHERSCAN}" }
2527
arbitrum = { key = "${API_KEY_ARBISCAN}" }
26-
avalanche = { key = "${API_KEY_SNOWTRACE}" }
2728
base = { key = "${API_KEY_BASESCAN}" }
29+
berachain = { key = "${API_KEY_BERACAHAINSCAN}", url = "https://api.routescan.io/v2/network/mainnet/evm/80094/etherscan/api/" }
30+
form = { key = "${API_KEY_FORMSCAN}", url = "https://explorer.form.network/api" }
31+
32+
avalanche = { key = "${API_KEY_SNOWTRACE}" }
2833
bnb_smart_chain = { key = "${API_KEY_BSCSCAN}" }
2934
gnosis_chain = { key = "${API_KEY_GNOSISSCAN}" }
3035
goerli = { key = "${API_KEY_ETHERSCAN}" }
31-
mainnet = { key = "${API_KEY_ETHERSCAN}" }
32-
optimism = { key = "${API_KEY_OPTIMISTIC_ETHERSCAN}" }
3336
polygon = { key = "${API_KEY_POLYGONSCAN}" }
3437
sepolia = { key = "${API_KEY_ETHERSCAN}" }
3538

@@ -44,14 +47,17 @@
4447
wrap_comments = true
4548

4649
[rpc_endpoints]
47-
mainnet = "https://eth-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
48-
arbitrum = "https://arbitrum-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
49-
avalanche = "https://avalanche-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
50+
mainnet = "https://rpc.ankr.com/eth"
51+
optimism = "https://mainnet.optimism.io"
52+
arbitrum = "https://arb1.arbitrum.io/rpc"
5053
base = "https://mainnet.base.org"
51-
bnb_smart_chain = "https://bsc-dataseed.binance.org"
54+
berachain = "https://rpc.berachain.com"
55+
form = "https://rpc.form.network/http"
5256
gnosis_chain = "https://rpc.gnosischain.com"
57+
58+
avalanche = "https://avalanche-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
59+
bnb_smart_chain = "https://bsc-dataseed.binance.org"
5360
localhost = "http://localhost:8545"
54-
optimism = "https://optimism-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
5561
polygon = "https://polygon-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
5662
optimism-sepolia = "https://opt-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
5763
arbitrum-sepolia = "https://arb-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}"

solidity/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,13 @@
6262
"test:coverage:report": "forge coverage --no-match-coverage \"(test|mock|node_modules|script)\" --report lcov && genhtml lcov.info --ignore-errors inconsistent,inconsistent --branch-coverage --output-dir coverage",
6363
"deployHyperlane7683": "forge script script/DeployHyperlane7683.s.sol:DeployHyperlane7683 -f $NETWORK --broadcast --verify --slow -vvv",
6464
"run:deployHyperlane7683": "dotenv-run-script deployHyperlane7683",
65+
"deploySimple": "forge script script/DeploySimple.s.sol:DeploySimple -f $NETWORK --broadcast --verify --slow -vvv",
66+
"run:deploySimple": "dotenv-run-script deploySimple",
6567
"deployToken": "forge script script/DeployToken.s.sol:DeployToken -f $NETWORK --broadcast --verify --slow -vvv",
6668
"run:deployToken": "dotenv-run-script deployToken",
6769
"openOrder": "forge script script/OpenOrder.s.sol:OpenOrder -f $NETWORK --broadcast --verify --slow -vvv",
68-
"run:openOrder": "dotenv-run-script openOrder"
70+
"run:openOrder": "dotenv-run-script openOrder",
71+
"enrollRouter": "forge script script/EnrollRouter.s.sol:EnrollRouter -f $NETWORK --broadcast --slow -vvv",
72+
"run:enrollRouter": "dotenv-run-script enrollRouter"
6973
}
7074
}

solidity/script/DeploySimple.s.sol

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity >=0.8.25 <0.9.0;
3+
4+
import { Script } from "forge-std/Script.sol";
5+
import { console2 } from "forge-std/console2.sol";
6+
7+
import { TypeCasts } from "@hyperlane-xyz/libs/TypeCasts.sol";
8+
import { GasRouter } from "@hyperlane-xyz/client/GasRouter.sol";
9+
import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
10+
import { ProxyAdmin } from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
11+
12+
import { Hyperlane7683 } from "../src/Hyperlane7683.sol";
13+
14+
import { ICreateX } from "./utils/ICreateX.sol";
15+
16+
contract OwnableProxyAdmin is ProxyAdmin {
17+
constructor(address _owner) {
18+
_transferOwnership(_owner);
19+
}
20+
}
21+
22+
/// @dev See the Solidity Scripting tutorial: https://book.getfoundry.sh/tutorials/solidity-scripting
23+
contract DeploySimple is Script {
24+
function run() public {
25+
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PK");
26+
27+
address owner = vm.envAddress("ROUTER_OWNER");
28+
29+
uint256[] memory domains = vm.envUint("DOMAINS", ",");
30+
address[] memory routers = vm.envAddress("ROUTERS", ",");
31+
assert(routers.length == domains.length);
32+
uint32[] memory _domains = new uint32[](domains.length);
33+
bytes32[] memory _routers = new bytes32[](domains.length);
34+
GasRouter.GasRouterConfig[] memory gasConfigs = new GasRouter.GasRouterConfig[](domains.length);
35+
36+
vm.startBroadcast(deployerPrivateKey);
37+
38+
ProxyAdmin proxyAdmin = deployProxyAdmin();
39+
address routerImpl = deployImplementation();
40+
TransparentUpgradeableProxy proxy = deployProxy(routerImpl, address(proxyAdmin));
41+
42+
for (uint i = 0; i < domains.length; i++) {
43+
_routers[i] = TypeCasts.addressToBytes32(routers[i]);
44+
_domains[i] = uint32(domains[i]);
45+
// TODO - amount is based on gas report from tests multiply 2
46+
gasConfigs[i] = GasRouter.GasRouterConfig(_domains[i], 1070688);
47+
}
48+
49+
Hyperlane7683(address(proxy)).enrollRemoteRouters(_domains, _routers);
50+
51+
Hyperlane7683(address(proxy)).setDestinationGas(gasConfigs);
52+
53+
Hyperlane7683(address(proxy)).transferOwnership(owner);
54+
55+
vm.stopBroadcast();
56+
57+
// solhint-disable-next-line no-console
58+
console2.log("Router Proxy:", address(proxy));
59+
console2.log("Implementation:", routerImpl);
60+
console2.log("ProxyAdmin:", address(proxyAdmin));
61+
}
62+
63+
function deployProxyAdmin() internal returns (ProxyAdmin proxyAdmin) {
64+
string memory ROUTER_SALT = vm.envString("HYPERLANE7683_SALT");
65+
address proxyAdminOwner = vm.envAddress("PROXY_ADMIN_OWNER");
66+
67+
proxyAdmin = new OwnableProxyAdmin(proxyAdminOwner);
68+
}
69+
70+
function deployImplementation() internal returns (address routerImpl) {
71+
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PK");
72+
string memory ROUTER_SALT = vm.envString("HYPERLANE7683_SALT");
73+
address mailbox = vm.envAddress("MAILBOX");
74+
address permit2 = vm.envAddress("PERMIT2");
75+
76+
return address(new Hyperlane7683(mailbox, permit2));
77+
}
78+
79+
function deployProxy(address routerImpl, address proxyAdmin) internal returns (TransparentUpgradeableProxy proxy) {
80+
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PK");
81+
string memory ROUTER_SALT = vm.envString("HYPERLANE7683_SALT");
82+
address initialOwner = vm.addr(deployerPrivateKey);
83+
84+
proxy = new TransparentUpgradeableProxy(
85+
routerImpl,
86+
proxyAdmin,
87+
abi.encodeWithSelector(Hyperlane7683.initialize.selector, address(0), address(0), initialOwner)
88+
);
89+
}
90+
}

solidity/script/EnrollRouter.s.sol

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity >=0.8.25 <0.9.0;
3+
4+
import { Script } from "forge-std/Script.sol";
5+
import { console2 } from "forge-std/console2.sol";
6+
7+
import { TypeCasts } from "@hyperlane-xyz/libs/TypeCasts.sol";
8+
9+
import { Hyperlane7683 } from "../src/Hyperlane7683.sol";
10+
11+
12+
/// @dev See the Solidity Scripting tutorial: https://book.getfoundry.sh/tutorials/solidity-scripting
13+
contract EnrollRouter is Script {
14+
function run() public {
15+
uint256 deployerPrivateKey = vm.envUint("OWNER_PK");
16+
17+
address localRouter = vm.envAddress("ROUTER");
18+
address remoteRouter = vm.envAddress("REMOTE_ROUTER");
19+
uint256 chainId = vm.envUint("ENROLL_CHAIN");
20+
21+
vm.startBroadcast(deployerPrivateKey);
22+
23+
Hyperlane7683(localRouter).enrollRemoteRouter(uint32(chainId), TypeCasts.addressToBytes32(remoteRouter));
24+
25+
vm.stopBroadcast();
26+
}
27+
}

0 commit comments

Comments
 (0)