## Tempo HopV2 msig Signature required
### Fraxtal Msig : https://safe.mainnet.frax.com/transactions/queue?safe=fraxtal:0x5f25218ed9474b721d6a38c115107428E832fA2E
#### #185 - Connect FraxtalHopV2 to RemoteHopV2Tempo
#### #186 — ~~Set Tempo Executor Options on all Remote HopV2 Instances~~ : **Reject**
### Tempo Msig : https://app.test.safe.protofire.io/transactions/queue?safe=tempo:0x1Ba19a54a01AE967f5E3895764Caaa6919FD2bEe
> **Tempo Safe credentials**
> - username: `Z7JOjyA2INpoWplGm5mxDEZrJDkNRTHO`
> - password: `pIgsmsZ0U7BkYCn5zLoRm2uHYJguq9Gt`
---
#### Key Addresses (Tempo)
| Role | Address |
|------|---------|
| Tempo Safe (sender) | `0x1Ba19a54a01AE967f5E3895764Caaa6919FD2bEe` |
| RemoteHopV2 (proxy) | `0x0000006D38568b00B457580b734e0076C62de659` |
| ProxyAdmin | `0x000000dbfaA1Fb91ca46867cE6D41aB6da4f7428` |
| LZ EndpointV2 (Tempo) | `0x20Bb7C2E2f4e5ca2B4c57060d1aE2615245dCc9C` |
| Fraxtal HopV2 | `0x00000000e18aFc20Afe54d4B2C8688bB60c06B36` |
| Old (non-deterministic) RemoteAdmin | `0xe764367bf30ef6e66918ea595e2ee621c7ad4a2a` |
| Standard deterministic RemoteAdmin | `0x954286118E93df807aB6f99aE0454f8710f0a8B9` |
| Correct Tempo RemoteAdmin (w/ correct frxUSD OFT) | `0x05b4a311Aac6658C0FA1e0247Be898aae8a8581f` |
---
#### #1 — Revoke DEFAULT_ADMIN_ROLE from old non-deterministic RemoteAdmin
**Target:** RemoteHopV2 (`0x0000006D...de659`)
```
revokeRole(
role: 0x0000...0000 (DEFAULT_ADMIN_ROLE)
account: 0xe764367bf30ef6e66918ea595e2ee621c7ad4a2a
)
```
Removes admin access from the old, non-deterministically deployed RemoteAdmin.
<details>
<summary>Cast verification</summary>
```bash
cast calldata-decode \
"revokeRole(bytes32,address)" \
0xd547741f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e764367bf30ef6e66918ea595e2ee621c7ad4a2a
```
Expected:
```
0x0000000000000000000000000000000000000000000000000000000000000000 ← DEFAULT_ADMIN_ROLE
0xe764367bf30ef6e66918ea595e2ee621c7ad4a2a ← old RemoteAdmin
```
</details>
---
#### #2 — Grant DEFAULT_ADMIN_ROLE to standard deterministic RemoteAdmin
**Target:** RemoteHopV2 (`0x0000006D...de659`)
```
grantRole(
role: 0x0000...0000 (DEFAULT_ADMIN_ROLE)
account: 0x954286118E93df807aB6f99aE0454f8710f0a8B9
)
```
Grants admin access to the standard deterministic RemoteAdmin (`0x9542...`). This is the same RemoteAdmin used on all other chains — however it was later discovered that this one was deployed with an incorrect `frxUSDoft` for Tempo (see #4).
<details>
<summary>Cast verification</summary>
```bash
cast calldata-decode \
"grantRole(bytes32,address)" \
0x2f2ff15d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000954286118e93df807ab6f99ae0454f8710f0a8b9
```
Expected:
```
0x0000000000000000000000000000000000000000000000000000000000000000 ← DEFAULT_ADMIN_ROLE
0x954286118E93df807aB6f99aE0454f8710f0a8B9 ← deterministic RemoteAdmin
```
</details>
---
#### #3 — Upgrade RemoteHopV2Tempo to new implementation + reinitialize
**Target:** ProxyAdmin (`0x000000dbfaA1Fb91ca46867cE6D41aB6da4f7428`)
Calls `upgradeAndCall` on the ProxyAdmin, which upgrades the RemoteHopV2 proxy to a new implementation and calls `initialize` on it.
```
upgradeAndCall(
proxy: 0x0000006D38568b00B457580b734e0076C62de659 (RemoteHopV2)
implementation: 0xa4dCb15E851cC4F14498cc9B0158c317672Df7b5 (new RemoteHopV2Tempo)
data: initialize(...)
)
```
**Inner `initialize` call:**
```
initialize(
_localEid: 30410 (Tempo)
_endpoint: 0x20Bb7C2E2f4e5ca2B4c57060d1aE2615245dCc9C (LZ EndpointV2)
_fraxtalHop: 0x00000000e18aFc20Afe54d4B2C8688bB60c06B36 (bytes32)
_numDVNs: 3
_executor: 0xf851abCa1d0fD1Df8eAba6de466a102996b7d7B2
_dvn: 0x76FaFF60799021B301B45dC1BbEDE53F261F9961
_treasury: 0x1deB70e45c2399a4aBEf19E9B1643F2670f892d0
_approvedOfts: [
0x00000000D61733e7A393A10A5B48c311AbE8f1E5 (frxUSD)
0x00000000fD8C4B8A413A06821456801295921a71 (sfrxUSD)
0x000000008c3930dCA540bB9B3A5D0ee78FcA9A4c (frxETH)
0x00000000883279097A49dB1f2af954EAd0C77E3c (sfrxETH)
0x00000000E9CE0f293D1Ce552768b187eBA8a56D4 (wFRAX)
0x00000000bC4aEF4bA6363a437455Cb1af19e2aEb (FPI)
]
)
```
> New implementation is `RemoteHopV2Tempo` — optimized `_sendToDestination` that sets native token as user token and does a single `_payNativeAltToken` to collect/swap. More efficient when users have a gas token not in LZD whitelist.
<details>
<summary>Cast verification</summary>
**Decode outer `upgradeAndCall`:**
```bash
cast calldata-decode \
"upgradeAndCall(address,address,bytes)" \
0x9623609d0000000000000000000000000000006d38568b00b457580b734e0076c62de659000000000000000000000000a4dcb15e851cc4f14498cc9b0158c317672df7b5000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e4df1cf4a100000000000000000000000000000000000000000000000000000000000076ca00000000000000000000000020bb7c2e2f4e5ca2b4c57060d1ae2615245dcc9c00000000000000000000000000000000e18afc20afe54d4b2c8688bb60c06b360000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f851abca1d0fd1df8eaba6de466a102996b7d7b200000000000000000000000076faff60799021b301b45dc1bbede53f261f99610000000000000000000000001deb70e45c2399a4abef19e9b1643f2670f892d00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000d61733e7a393a10a5b48c311abe8f1e500000000000000000000000000000000fd8c4b8a413a06821456801295921a71000000000000000000000000000000008c3930dca540bb9b3a5d0ee78fca9a4c00000000000000000000000000000000883279097a49db1f2af954ead0c77e3c00000000000000000000000000000000e9ce0f293d1ce552768b187eba8a56d400000000000000000000000000000000bc4aef4ba6363a437455cb1af19e2aeb00000000000000000000000000000000000000000000000000000000
```
Expected:
```
0x0000006D38568b00B457580b734e0076C62de659 ← proxy (RemoteHopV2)
0xa4dCb15E851cC4F14498cc9B0158c317672Df7b5 ← new implementation
0xdf1cf4a1... ← initialize(...)
```
**Decode inner `initialize`:**
```bash
cast calldata-decode \
"initialize(uint32,address,bytes32,uint32,address,address,address,address[])" \
0xdf1cf4a100000000000000000000000000000000000000000000000000000000000076ca00000000000000000000000020bb7c2e2f4e5ca2b4c57060d1ae2615245dcc9c00000000000000000000000000000000e18afc20afe54d4b2c8688bb60c06b360000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f851abca1d0fd1df8eaba6de466a102996b7d7b200000000000000000000000076faff60799021b301b45dc1bbede53f261f99610000000000000000000000001deb70e45c2399a4abef19e9b1643f2670f892d00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000d61733e7a393a10a5b48c311abe8f1e500000000000000000000000000000000fd8c4b8a413a06821456801295921a71000000000000000000000000000000008c3930dca540bb9b3a5d0ee78fca9a4c00000000000000000000000000000000883279097a49db1f2af954ead0c77e3c00000000000000000000000000000000e9ce0f293d1ce552768b187eba8a56d400000000000000000000000000000000bc4aef4ba6363a437455cb1af19e2aeb
```
Expected:
```
30410 ← _localEid (Tempo)
0x20Bb7C2E2f4e5ca2B4c57060d1aE2615245dCc9C ← _endpoint
0x00000000000000000000000000000000e18afc20afe54d4b2c8688bb60c06b36 ← _fraxtalHop
3 ← _numDVNs
0xf851abCa1d0fD1Df8eAba6de466a102996b7d7B2 ← _executor
0x76FaFF60799021B301B45dC1BbEDE53F261F9961 ← _dvn
0x1deB70e45c2399a4aBEf19E9B1643F2670f892d0 ← _treasury
[frxUSD, sfrxUSD, frxETH, sfrxETH, wFRAX, FPI] ← _approvedOfts
```
</details>
---
#### #4 — Fix RemoteAdmin: revoke `0x9542...` (wrong frxUSD OFT), grant `0x05b4...` (correct)
**Target:** RemoteHopV2 (`0x0000006D...de659`) via Safe `multiSend`
The deterministic RemoteAdmin at `0x9542...` (granted in #2) was deployed with an incorrect `frxUSDoft` address. Tempo's frxUSD OFT address differs from other chains. This `multiSend` atomically:
1. **`grantRole(DEFAULT_ADMIN_ROLE, 0x05b4a311Aac6658C0FA1e0247Be898aae8a8581f)`** — grant to new RemoteAdmin (deployed with correct Tempo frxUSD OFT)
2. **`revokeRole(DEFAULT_ADMIN_ROLE, 0x954286118E93df807aB6f99aE0454f8710f0a8B9)`** — revoke from old RemoteAdmin (wrong frxUSD OFT)
Both calls target RemoteHopV2 at `0x0000006D38568b00B457580b734e0076C62de659`.
> After #4, only `0x05b4...` holds DEFAULT_ADMIN_ROLE on RemoteHopV2Tempo.
<details>
<summary>Cast verification</summary>
**Decode outer `multiSend`:**
```bash
cast calldata-decode \
"multiSend(bytes)" \
0x8d80ff0a00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000132000000006d38568b00b457580b734e0076c62de659000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b4a311aac6658c0fa1e0247be898aae8a8581f000000006d38568b00b457580b734e0076c62de65900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d547741f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000954286118e93df807ab6f99ae0454f8710f0a8b90000000000000000000000000000
```
**Inner call 1 — `grantRole`:**
```bash
cast calldata-decode \
"grantRole(bytes32,address)" \
0x2f2ff15d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b4a311aac6658c0fa1e0247be898aae8a8581f
```
Expected:
```
0x0000...0000 ← DEFAULT_ADMIN_ROLE
0x05b4a311Aac6658C0FA1e0247Be898aae8a8581f ← correct Tempo RemoteAdmin
```
**Inner call 2 — `revokeRole`:**
```bash
cast calldata-decode \
"revokeRole(bytes32,address)" \
0xd547741f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000954286118e93df807ab6f99ae0454f8710f0a8b9
```
Expected:
```
0x0000...0000 ← DEFAULT_ADMIN_ROLE
0x954286118E93df807aB6f99aE0454f8710f0a8B9 ← old RemoteAdmin (wrong frxUSD)
```
</details>
#### #5 - set executor options for Somnia (30380). Options : `0x01001101000000000000000000000000000f4240` .
(0F4240)16 = (1000000)10