Skip to content

Commit

Permalink
[STABLE-8131] Calculate tokenMessengerV2 proxy address instead of par…
Browse files Browse the repository at this point in the history
…sing from env (#55)

- Add flag in DeployProxiesV2 script to determine whether to read
`remoteTokenMessengerAddresses` from env variable.
- Add logic to use deterministic Create2 address calculation if not
reading from env.
- Update UT to test the false case. True case will most likely not get
used.
- TODO: Figure out a way to set flag to true based on test selector
before `setUp()` is run to test the true case
  • Loading branch information
dlee-circle authored Jan 15, 2025
1 parent 7d70310 commit 8a25c1a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 23 deletions.
27 changes: 21 additions & 6 deletions scripts/v2/DeployProxiesV2.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {AdminUpgradableProxy} from "../../src/proxy/AdminUpgradableProxy.sol";
import {TokenMessengerV2} from "../../src/v2/TokenMessengerV2.sol";
import {TokenMinterV2} from "../../src/v2/TokenMinterV2.sol";
import {MessageTransmitterV2} from "../../src/v2/MessageTransmitterV2.sol";
import {AddressUtils} from "../../src/messages/v2/AddressUtils.sol";

contract DeployProxiesV2Script is Script {
// Expose for tests
Expand Down Expand Up @@ -150,15 +151,28 @@ contract DeployProxiesV2Script is Script {
""
);

// Calculate TokenMessengerV2 proxy address
address expectedTokenMessengerV2ProxyAddress = vm.computeCreate2Address(
keccak256(type(TokenMessengerV2).creationCode),
keccak256(
proxyCreateCode
),
factory
);

bool remoteTokenMessengerV2FromEnv = remoteTokenMessengerV2Addresses.length > 0;

// Construct initializer
bytes32[] memory remoteTokenMessengerAddresses = new bytes32[](
remoteDomains.length
);
uint256 remoteDomainsLength = remoteDomains.length;
for (uint256 i = 0; i < remoteDomainsLength; ++i) {
remoteTokenMessengerAddresses[i] = remoteTokenMessengerV2Addresses[
i
];
if (remoteTokenMessengerV2FromEnv) {
remoteTokenMessengerAddresses[i] = remoteTokenMessengerV2Addresses[i];
} else {
remoteTokenMessengerAddresses[i] = AddressUtils.toBytes32(expectedTokenMessengerV2ProxyAddress);
}
}
bytes memory initializer = abi.encodeWithSelector(
TokenMessengerV2.initialize.selector,
Expand Down Expand Up @@ -199,7 +213,6 @@ contract DeployProxiesV2Script is Script {
proxyCreateCode,
multiCallData
);

// Stop recording transations
vm.stopBroadcast();

Expand Down Expand Up @@ -333,9 +346,11 @@ contract DeployProxiesV2Script is Script {
);
tokenControllerPrivateKey = vm.envUint("TOKEN_CONTROLLER_KEY");

remoteTokenMessengerV2Addresses = vm.envBytes32(
bytes32[] memory emptyRemoteTokenMessengerV2Addresses = new bytes32[](0);
remoteTokenMessengerV2Addresses = vm.envOr(
"REMOTE_TOKEN_MESSENGER_V2_ADDRESSES",
","
",",
emptyRemoteTokenMessengerV2Addresses
);
}

Expand Down
6 changes: 5 additions & 1 deletion test/scripts/v2/DeployProxiesV2.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,13 @@ contract DeployProxiesV2Test is ScriptV2TestUtils {
// remote token messengers
for (uint256 i = 0; i < remoteDomains.length; i++) {
uint32 remoteDomain = remoteDomains[i];
bytes32 remoteTokenMessengerAddress = bytes32(uint256(uint160(address(tokenMessengerV2))));
if (remoteTokenMessengerV2FromEnv) {
remoteTokenMessengerAddress = bytes32(uint256(uint160(address(remoteTokenMessengerV2s[i]))));
}
assertEq(
tokenMessengerV2.remoteTokenMessengers(remoteDomain),
bytes32(uint256(uint160(address(remoteTokenMessengerV2s[i]))))
remoteTokenMessengerAddress
);
}
// admin
Expand Down
35 changes: 19 additions & 16 deletions test/scripts/v2/ScriptV2TestUtils.sol
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ contract ScriptV2TestUtils is TestUtils {
address[] remoteTokens;
uint32[] remoteDomains;
address[] remoteTokenMessengerV2s;
bool remoteTokenMessengerV2FromEnv = false;
uint32 anotherRemoteDomain = 5;
address anotherRemoteToken;

Expand Down Expand Up @@ -166,24 +167,26 @@ contract ScriptV2TestUtils is TestUtils {
)
)
);
vm.setEnv(
"REMOTE_TOKEN_MESSENGER_V2_ADDRESSES",
string(
abi.encodePacked(
vm.toString(
Message.addressToBytes32(remoteTokenMessengerV2s[0])
),
",",
vm.toString(
Message.addressToBytes32(remoteTokenMessengerV2s[1])
),
",",
vm.toString(
Message.addressToBytes32(remoteTokenMessengerV2s[2])
if (remoteTokenMessengerV2FromEnv) { // TODO: Figure out if there is a way to dynamically set this before setUp()
vm.setEnv(
"REMOTE_TOKEN_MESSENGER_V2_ADDRESSES",
string(
abi.encodePacked(
vm.toString(
Message.addressToBytes32(remoteTokenMessengerV2s[0])
),
",",
vm.toString(
Message.addressToBytes32(remoteTokenMessengerV2s[1])
),
",",
vm.toString(
Message.addressToBytes32(remoteTokenMessengerV2s[2])
)
)
)
)
);
);
}

vm.setEnv(
"MESSAGE_TRANSMITTER_V2_IMPLEMENTATION_ADDRESS",
Expand Down

0 comments on commit 8a25c1a

Please sign in to comment.