Skip to content

Commit f827a6d

Browse files
committed
feat: deployment script
1 parent d5c6ced commit f827a6d

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

contracts/foundry.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ cache_path = 'foundry-cache'
1010
libs = ['node_modules', 'foundry-lib']
1111
bytecode_hash = "none"
1212
ffi = false
13+
allow_internal_expect_revert = true
1314

1415
# default is zero, using a non-zero amount enables us to test e.g. billing based on gas prices.
1516
gas_price = 1
@@ -26,6 +27,7 @@ single_line_statement_blocks = "preserve"
2627
solc_version = '0.8.24'
2728
src = 'src/v0.8/ccip'
2829
test = 'src/v0.8/ccip/test'
30+
script = 'script'
2931
optimizer_runs = 800
3032
evm_version = 'paris'
3133

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.0;
3+
4+
import {Script, console2 as console} from "forge-std/Script.sol";
5+
6+
import {UpgradeableBurnMintTokenPool} from "./../src/v0.8/ccip/pools/GHO/UpgradeableBurnMintTokenPool.sol";
7+
import {ITransparentProxyFactory} from "solidity-utils/contracts/transparent-proxy/interfaces/ITransparentProxyFactory.sol";
8+
import {IERC20Metadata} from "solidity-utils/contracts/oz-common/interfaces/IERC20Metadata.sol";
9+
10+
interface IProxyAdmin {
11+
function UPGRADE_INTERFACE_VERSION() external view returns (string memory);
12+
}
13+
14+
contract DeployUpgradableBurnMintTokenPool is Script {
15+
function run() external {
16+
IERC20Metadata GHO_TOKEN = IERC20Metadata(vm.promptAddress("GHO_TOKEN"));
17+
uint8 TOKEN_DECIMALS = _validateTokenAndFetchDecimals(GHO_TOKEN);
18+
ITransparentProxyFactory PROXY_FACTORY = ITransparentProxyFactory(vm.promptAddress("TRANSPARENT_PROXY_FACTORY"));
19+
address OWNER = vm.promptAddress("OWNER");
20+
address ROUTER = vm.promptAddress("ROUTER");
21+
address RMN_PROXY = vm.promptAddress("RMN_PROXY");
22+
23+
address[] memory ALLOW_LIST = new address[](0);
24+
bool ALLOW_LIST_ENABLED = false;
25+
26+
vm.startBroadcast();
27+
address tokenPool = address(
28+
new UpgradeableBurnMintTokenPool(address(GHO_TOKEN), TOKEN_DECIMALS, RMN_PROXY, ALLOW_LIST_ENABLED)
29+
);
30+
address tokenPoolProxy = PROXY_FACTORY.create(
31+
tokenPool,
32+
OWNER,
33+
abi.encodeCall(UpgradeableBurnMintTokenPool.initialize, (OWNER, ALLOW_LIST, ROUTER))
34+
);
35+
vm.stopBroadcast();
36+
37+
console.log("tokenPoolProxy: ", tokenPoolProxy);
38+
console.log("tokenPool: ", tokenPool);
39+
40+
_validateProxyAdminVersion(tokenPoolProxy);
41+
}
42+
43+
function _validateTokenAndFetchDecimals(IERC20Metadata token) internal view returns (uint8) {
44+
require(_cmp(token.name(), "GHO"), "InvalidToken");
45+
require(_cmp(token.symbol(), "GHO"), "InvalidToken");
46+
return token.decimals();
47+
}
48+
49+
function _validateProxyAdminVersion(address proxy) internal view {
50+
IProxyAdmin proxyAdmin = _getProxyAdmin(proxy);
51+
require(address(proxyAdmin) != address(0), "InvalidProxyAdmin");
52+
require(_cmp(proxyAdmin.UPGRADE_INTERFACE_VERSION(), "5.0.0"), "InvalidProxyAdminVersion");
53+
}
54+
55+
function _getProxyAdmin(address proxy) internal view returns (IProxyAdmin) {
56+
bytes32 slot = bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1);
57+
return IProxyAdmin(address(uint160(uint256(vm.load(proxy, slot)))));
58+
}
59+
60+
function _cmp(string memory a, string memory b) internal pure returns (bool) {
61+
return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
62+
}
63+
}

0 commit comments

Comments
 (0)