Skip to content

Commit d863a96

Browse files
committed
script(lz): polish
1 parent bc7dffc commit d863a96

2 files changed

Lines changed: 147 additions & 142 deletions

File tree

script/layerzero/DeployNonDefaultMintBurnOftAdapters.s.sol

Lines changed: 139 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -9,200 +9,207 @@ import "forge-std/Script.sol";
99
// Main functionality.
1010
import {NonDefaultMintBurnOftAdapter} from "src/secondary-chain/layerzero/NonDefaultMintBurnOftAdapter.sol";
1111

12-
// Interfaces.
12+
// External contracts.
1313
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
1414

1515
// Other functionality.
1616
import {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.
2121
contract 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

Comments
 (0)