|
| 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