@@ -9,200 +9,207 @@ import "forge-std/Script.sol";
99// Main functionality.
1010import {NonDefaultMintBurnOftAdapter} from "src/secondary-chain/layerzero/NonDefaultMintBurnOftAdapter.sol " ;
1111
12- // Interfaces .
12+ // External contracts .
1313import {IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol " ;
1414
1515// Other functionality.
1616import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol " ;
1717
18- /// @title Deploy NonDefault Mint/ Burn OFT Adapters (Secondary Chain)
19- /// @notice Deploys LayerZero NonDefaultMintBurnOftAdapter proxies for Vault Bridge custom tokens on the secondary chain (L2) .
20- /// @dev INTERNAL script. Run against the secondary chain RPC .
18+ /// @title Deploy Non-Default Upgradeable Mint- Burn OFT Adapters (Secondary Chain)
19+ /// @notice Creates a ` NonDefaultMintBurnOftAdapter` implementation and a `TransparentUpgradeableProxy` for each Non-Default Upgradeable Mint-Burn OFT Adapter, points the proxies to the implementation, and initializes them .
20+ /// @dev Each Non-Default Upgradeable Mint-Burn OFT Adapter needs to be configured in VB-LZ-ENV. Please refer to `src/ secondary- chain/layerzero/README.md` for more information .
2121contract DeployNonDefaultMintBurnOFTAdapters is Script {
2222 // ============ Constants ============
2323 address private constant ADDRESS_ZERO = address (0 );
2424
25- // ============ Optional label (for logs only) ============
25+ // ============ Secondary Chain Name ============
2626 string public secondaryChainName;
2727
28- // ============ Deployer / Ownership ============
28+ // ============ Accounts ============
2929 address public deployerAddress;
3030 address public ownerAddress;
3131 address public delegateAddress;
32- address public proxyOwnerAddress ;
32+ address public proxyAdminOwnerAddress ;
3333
3434 // ============ LayerZero ============
35- address public lzEndpointL2 ;
35+ address public lzEndpoint ;
3636
37- // ============ Adapter Configuration (shared) ============
37+ // ============ OFT Adapter Configuration ============
3838 bool public customTokenApprovalRequired;
3939
40- // ============ Token Deployment Flags ============
41- bool public deployVbEth;
42- bool public deployVbUsdc;
43- bool public deployVbUsdt;
44- bool public deployVbUsds;
45- bool public deployVbWbtc;
46-
47- // ============ L2 Token Addresses (Custom Tokens) ============
48- address public vbEthTokenL2;
49- address public vbUsdcTokenL2;
50- address public vbUsdtTokenL2;
51- address public vbUsdsTokenL2;
52- address public vbWbtcTokenL2;
53-
54- // ============ Deployed Adapter Proxies ============
55- NonDefaultMintBurnOftAdapter public vbEthAdapterL2;
56- NonDefaultMintBurnOftAdapter public vbUsdcAdapterL2;
57- NonDefaultMintBurnOftAdapter public vbUsdtAdapterL2;
58- NonDefaultMintBurnOftAdapter public vbUsdsAdapterL2;
59- NonDefaultMintBurnOftAdapter public vbWbtcAdapterL2;
60-
61- /// @notice Configure parameters before execution.
40+ // ============ Deployment Flags ============
41+ bool public deployForVbEth;
42+ bool public deployForVbUsdc;
43+ bool public deployForVbUsdt;
44+ bool public deployForVbUsds;
45+ bool public deployForVbWbtc;
46+
47+ // ============ Custom Token Addresses ============
48+ address public vbEth;
49+ address public vbUsdc;
50+ address public vbUsdt;
51+ address public vbUsds;
52+ address public vbWbtc;
53+
54+ // ============ Non-Default Upgradeable Mint-Burn OFT Adapter Implementations ============
55+ address public vbEthOftAdapterImplementation;
56+ address public vbUsdcOftAdapterImplementation;
57+ address public vbUsdtOftAdapterImplementation;
58+ address public vbUsdsOftAdapterImplementation;
59+ address public vbWbtcOftAdapterImplementation;
60+
61+ // ============ Non-Default Upgradeable Mint-Burn OFT Adapter Proxies ============
62+ NonDefaultMintBurnOftAdapter public vbEthOftAdapter;
63+ NonDefaultMintBurnOftAdapter public vbUsdcOftAdapter;
64+ NonDefaultMintBurnOftAdapter public vbUsdtOftAdapter;
65+ NonDefaultMintBurnOftAdapter public vbUsdsOftAdapter;
66+ NonDefaultMintBurnOftAdapter public vbWbtcOftAdapter;
67+
68+ /// @notice Setup.
69+ /// @dev You can customize the setup here.
6270 function setUp () public {
63- // ============ Chain Label ============
64- secondaryChainName = "optimism_sepolia " ; // for logging only
71+ // ============ Secondary Chain Name ============
72+ secondaryChainName = "" ;
6573
66- // ============ Address Configuration ============
74+ // ============ Accounts ============
6775 deployerAddress = ADDRESS_ZERO;
6876 ownerAddress = ADDRESS_ZERO;
6977 delegateAddress = ADDRESS_ZERO;
70- proxyOwnerAddress = ADDRESS_ZERO;
78+ proxyAdminOwnerAddress = ADDRESS_ZERO;
7179
7280 // ============ LayerZero ============
73- lzEndpointL2 = ADDRESS_ZERO;
81+ lzEndpoint = ADDRESS_ZERO;
7482
7583 // ============ Adapter Configuration ============
76- customTokenApprovalRequired = true ;
77-
78- // ============ Token Flags ============
79- deployVbEth = false ;
80- deployVbUsdc = false ;
81- deployVbUsdt = false ;
82- deployVbUsds = false ;
83- deployVbWbtc = false ;
84-
85- // ============ L2 Token Addresses ============
86- vbEthTokenL2 = ADDRESS_ZERO;
87- vbUsdcTokenL2 = ADDRESS_ZERO;
88- vbUsdtTokenL2 = ADDRESS_ZERO;
89- vbUsdsTokenL2 = ADDRESS_ZERO;
90- vbWbtcTokenL2 = ADDRESS_ZERO;
84+ customTokenApprovalRequired = false ;
85+
86+ // ============ Deployment Flags ============
87+ deployForVbEth = false ;
88+ deployForVbUsdc = false ;
89+ deployForVbUsdt = false ;
90+ deployForVbUsds = false ;
91+ deployForVbWbtc = false ;
92+
93+ // ============ Custom Token Addresses ============
94+ vbEth = ADDRESS_ZERO;
95+ vbUsdc = ADDRESS_ZERO;
96+ vbUsdt = ADDRESS_ZERO;
97+ vbUsds = ADDRESS_ZERO;
98+ vbWbtc = ADDRESS_ZERO;
9199
92100 // ============ Validation ============
93101 require (bytes (secondaryChainName).length != 0 , "Aborted: `secondaryChainName` not set " );
94102 require (deployerAddress != ADDRESS_ZERO, "Aborted: `deployerAddress` not set " );
95103 require (ownerAddress != ADDRESS_ZERO, "Aborted: `ownerAddress` not set " );
96104 require (delegateAddress != ADDRESS_ZERO, "Aborted: `delegateAddress` not set " );
97- require (proxyOwnerAddress != ADDRESS_ZERO, "Aborted: `proxyOwnerAddress ` not set " );
98- require (lzEndpointL2 != ADDRESS_ZERO, "Aborted: `lzEndpointL2 ` not set " );
105+ require (proxyAdminOwnerAddress != ADDRESS_ZERO, "Aborted: `proxyAdminOwnerAddress ` not set " );
106+ require (lzEndpoint != ADDRESS_ZERO, "Aborted: `lzEndpoint ` not set " );
99107
100108 require (
101- deployVbEth || deployVbUsdc || deployVbUsdt || deployVbUsds || deployVbWbtc ,
102- "Aborted: At least one token must be deployed "
109+ deployForVbEth || deployForVbUsdc || deployForVbUsdt || deployForVbUsds || deployForVbWbtc ,
110+ "Aborted: Nothing to deploy "
103111 );
104112
105- if (deployVbEth ) require (vbEthTokenL2 != ADDRESS_ZERO, "Aborted: `vbEthTokenL2 ` not set " );
106- if (deployVbUsdc ) require (vbUsdcTokenL2 != ADDRESS_ZERO, "Aborted: `vbUsdcTokenL2 ` not set " );
107- if (deployVbUsdt ) require (vbUsdtTokenL2 != ADDRESS_ZERO, "Aborted: `vbUsdtTokenL2 ` not set " );
108- if (deployVbUsds ) require (vbUsdsTokenL2 != ADDRESS_ZERO, "Aborted: `vbUsdsTokenL2 ` not set " );
109- if (deployVbWbtc ) require (vbWbtcTokenL2 != ADDRESS_ZERO, "Aborted: `vbWbtcTokenL2 ` not set " );
113+ if (deployForVbEth ) require (vbEth != ADDRESS_ZERO, "Aborted: `vbEth ` not set " );
114+ if (deployForVbUsdc ) require (vbUsdc != ADDRESS_ZERO, "Aborted: `vbUsdc ` not set " );
115+ if (deployForVbUsdt ) require (vbUsdt != ADDRESS_ZERO, "Aborted: `vbUsdt ` not set " );
116+ if (deployForVbUsds ) require (vbUsds != ADDRESS_ZERO, "Aborted: `vbUsds ` not set " );
117+ if (deployForVbWbtc ) require (vbWbtc != ADDRESS_ZERO, "Aborted: `vbWbtc ` not set " );
110118 }
111119
112- /// @notice Main execution function - deploys L2 OFT adapters for configured tokens .
113- /// @dev Run with the secondary chain rpc-url (or foundry.toml alias) .
120+ /// @notice Run .
121+ /// @dev You can customize the run here .
114122 function run () public {
115- console.log ("Running `DeployNonDefaultMintBurnOFTAdapters` on " , secondaryChainName);
116-
117- if (deployVbEth) vbEthAdapterL2 = _deployL2OftAdapter ("vbETH " , vbEthTokenL2);
118- if (deployVbUsdc) vbUsdcAdapterL2 = _deployL2OftAdapter ("vbUSDC " , vbUsdcTokenL2);
119- if (deployVbUsdt) vbUsdtAdapterL2 = _deployL2OftAdapter ("vbUSDT " , vbUsdtTokenL2);
120- if (deployVbUsds) vbUsdsAdapterL2 = _deployL2OftAdapter ("vbUSDS " , vbUsdsTokenL2);
121- if (deployVbWbtc) vbWbtcAdapterL2 = _deployL2OftAdapter ("vbWBTC " , vbWbtcTokenL2);
122-
123- _printDeploymentSummary ();
124-
125- console.log ("Finished running `DeployNonDefaultMintBurnOFTAdapters` " );
126- }
127-
128- function _deployProxy (address implementation , bytes memory initData ) internal returns (address ) {
129- _startBroadcast ();
130- TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy (implementation, proxyOwnerAddress, initData);
131- _stopBroadcast ();
132- return address (proxy);
123+ console.log ("Running `DeployNonDefaultMintBurnOFTAdapters` script... " );
124+
125+ _createSelectFork (secondaryChainName);
126+
127+ if (deployForVbEth) {
128+ vbEthOftAdapterImplementation = _createNonDefaultMintBurnOftAdapterImplementation ("vbETH " , vbEth);
129+ vbEthOftAdapter =
130+ _proxifyAndInitializeNonDefaultMintBurnOftAdapter ("vbETH " , vbEthOftAdapterImplementation, vbEth);
131+ }
132+ if (deployForVbUsdc) {
133+ vbUsdcOftAdapterImplementation = _createNonDefaultMintBurnOftAdapterImplementation ("vbUSDC " , vbUsdc);
134+ vbUsdcOftAdapter =
135+ _proxifyAndInitializeNonDefaultMintBurnOftAdapter ("vbUSDC " , vbUsdcOftAdapterImplementation, vbUsdc);
136+ }
137+ if (deployForVbUsdt) {
138+ vbUsdtOftAdapterImplementation = _createNonDefaultMintBurnOftAdapterImplementation ("vbUSDT " , vbUsdt);
139+ vbUsdtOftAdapter =
140+ _proxifyAndInitializeNonDefaultMintBurnOftAdapter ("vbUSDT " , vbUsdtOftAdapterImplementation, vbUsdt);
141+ }
142+ if (deployForVbUsds) {
143+ vbUsdsOftAdapterImplementation = _createNonDefaultMintBurnOftAdapterImplementation ("vbUSDS " , vbUsds);
144+ vbUsdsOftAdapter =
145+ _proxifyAndInitializeNonDefaultMintBurnOftAdapter ("vbUSDS " , vbUsdsOftAdapterImplementation, vbUsds);
146+ }
147+ if (deployForVbWbtc) {
148+ vbWbtcOftAdapterImplementation = _createNonDefaultMintBurnOftAdapterImplementation ("vbWBTC " , vbWbtc);
149+ vbWbtcOftAdapter =
150+ _proxifyAndInitializeNonDefaultMintBurnOftAdapter ("vbWBTC " , vbWbtcOftAdapterImplementation, vbWbtc);
151+ }
152+
153+ console.log ("Finished running `DeployNonDefaultMintBurnOFTAdapters` script " );
133154 }
134155
135- function _deployL2OftAdapter (string memory tokenSymbol , address customTokenAddress )
156+ function _createNonDefaultMintBurnOftAdapterImplementation (string memory label , address customTokenAddress )
136157 internal
137- returns (NonDefaultMintBurnOftAdapter )
158+ returns (address )
138159 {
139- console.log (string .concat ("\nDeploying L2 OFT Adapter for " , tokenSymbol, "... " ));
160+ console.log ("Deploying " , label, "Non-Default Upgradeable Mint-Burn OFT Adapter implementation... " );
161+
162+ require (customTokenAddress != ADDRESS_ZERO, "Aborted: `customTokenAddress` not set " );
140163
141- // Read token decimals
142164 uint8 customTokenDecimals = IERC20Metadata (customTokenAddress).decimals ();
143- console.log (string .concat (tokenSymbol, " decimals: " ), customTokenDecimals);
144165
145- // Deploy implementation
146166 _startBroadcast ();
147- NonDefaultMintBurnOftAdapter implementation =
148- new NonDefaultMintBurnOftAdapter (customTokenDecimals, lzEndpointL2);
167+
168+ NonDefaultMintBurnOftAdapter implementation = new NonDefaultMintBurnOftAdapter (customTokenDecimals, lzEndpoint);
169+
149170 _stopBroadcast ();
150171
151- console.log (string .concat (tokenSymbol, " L2 adapter implementation deployed: " ), address (implementation));
172+ console.log (
173+ label, "Non-Default Upgradeable Mint-Burn OFT Adapter implementation created: " , address (implementation)
174+ );
152175
153- // Prepare initialization data (atomic via proxy constructor)
154- bytes [] memory reinitializeData = new bytes [](1 );
155- reinitializeData[0 ] = abi.encodeCall (
176+ return address (implementation);
177+ }
178+
179+ function _proxifyAndInitializeNonDefaultMintBurnOftAdapter (
180+ string memory label ,
181+ address oftAdapterImplementation ,
182+ address customTokenAddress
183+ ) internal returns (NonDefaultMintBurnOftAdapter) {
184+ console.log ("Proxifying and initializing " , label, "Non-Default Upgradeable Mint-Burn OFT Adapter... " );
185+
186+ require (oftAdapterImplementation != ADDRESS_ZERO, "Aborted: `oftAdapterImplementation` not set " );
187+ require (customTokenAddress != ADDRESS_ZERO, "Aborted: `customTokenAddress` not set " );
188+
189+ bytes [] memory reinitialize1Data = new bytes [](1 );
190+
191+ reinitialize1Data[0 ] = abi.encodeCall (
156192 NonDefaultMintBurnOftAdapter.reinitialize1,
157193 (customTokenAddress, customTokenApprovalRequired, ownerAddress, delegateAddress)
158194 );
159195
160- bytes memory initData = abi.encodeCall (NonDefaultMintBurnOftAdapter.reinitialize, (reinitializeData ));
196+ bytes memory reinitializeData = abi.encodeCall (NonDefaultMintBurnOftAdapter.reinitialize, (reinitialize1Data ));
161197
162- // Deploy proxy
163- address proxyAddress = _deployProxy (address (implementation), initData);
198+ _startBroadcast ();
164199
165- console.log (string .concat (tokenSymbol, " L2 adapter proxy deployed: " ), proxyAddress);
200+ TransparentUpgradeableProxy proxy =
201+ new TransparentUpgradeableProxy (oftAdapterImplementation, proxyAdminOwnerAddress, reinitializeData);
166202
167- return NonDefaultMintBurnOftAdapter (proxyAddress);
168- }
203+ _stopBroadcast ();
204+
205+ console.log (label, "Non-Default Upgradeable Mint-Burn OFT Adapter proxified and initialized: " , address (proxy));
169206
170- function _printDeploymentSummary () internal view {
171- console.log ("\n======================================== " );
172- console.log ("L2 DEPLOYMENT SUMMARY " );
173- console.log ("======================================== " );
174-
175- if (deployVbEth) _logTokenDeployment ("vbETH " , address (vbEthAdapterL2), vbEthTokenL2);
176- if (deployVbUsdc) _logTokenDeployment ("vbUSDC " , address (vbUsdcAdapterL2), vbUsdcTokenL2);
177- if (deployVbUsdt) _logTokenDeployment ("vbUSDT " , address (vbUsdtAdapterL2), vbUsdtTokenL2);
178- if (deployVbUsds) _logTokenDeployment ("vbUSDS " , address (vbUsdsAdapterL2), vbUsdsTokenL2);
179- if (deployVbWbtc) _logTokenDeployment ("vbWBTC " , address (vbWbtcAdapterL2), vbWbtcTokenL2);
180-
181- console.log ("\n======================================== " );
182- console.log ("NEXT STEPS " );
183- console.log ("======================================== " );
184- console.log ("1. Configure LayerZero peer connections between L1 and L2 -> Wire contracts " );
185- console.log ("2. Call setBridge() on each custom token with the corresponding L2 adapter address " );
186- console.log ("\n======================================== " );
207+ return NonDefaultMintBurnOftAdapter (address (proxy));
187208 }
188209
189- function _logTokenDeployment (string memory tokenSymbol , address l2AdapterAddress , address l2TokenAddress )
190- internal
191- pure
192- {
193- console.log (string .concat ("\n " , tokenSymbol, ": " ));
194- console.log (" L2 Adapter: " , l2AdapterAddress);
195- console.log (" L2 Token: " , l2TokenAddress);
196- console.log (" setBridge command: " );
197- console.log (
198- string .concat (
199- " forge script script/layerzero/DeployCustomTokensLayerzero.s.sol --sig 'setBridge(address,address)' " ,
200- vm.toString (l2TokenAddress),
201- " " ,
202- vm.toString (l2AdapterAddress),
203- " --broadcast "
204- )
205- );
210+ function _createSelectFork (string memory chainName_ ) internal {
211+ vm.createSelectFork (vm.rpcUrl (chainName_));
212+ console.log ("Switched to " , chainName_, "chain " );
206213 }
207214
208215 function _startBroadcast () internal {
0 commit comments