---
# System prepended metadata

title: Tempo HopV2 msig Signature req
tags: [Signing]

---

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

