Skip to content

Commit 68a7ca4

Browse files
committed
evm: TransferSent(bytes32), fixes #503
1 parent 6a1a3d9 commit 68a7ca4

File tree

5 files changed

+50
-2
lines changed

5 files changed

+50
-2
lines changed

evm/README.md

+8
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ event TransferSent(
2020
);
2121
```
2222

23+
```solidity
24+
/// @notice Emitted when a message is sent from the nttManager.
25+
/// @dev Topic0
26+
/// 0x3e6ae56314c6da8b461d872f41c6d0bb69317b9d0232805aaccfa45df1a16fa0.
27+
/// @param digest The digest of the message.
28+
event TransferSent(bytes32 indexed digest);
29+
```
30+
2331
2. **Rate Limit**
2432

2533
A transfer can be rate-limited (see [here](../README.md#rate-limiting-and-cancel-flows) for more details) both on the source and destination chains. If a transfer is rate-limited on the source chain and the `shouldQueue` flag is enabled, it is added to an outbound queue. The transfer can be released after the configured `_rateLimitDuration` has expired via the [`completeOutboundQueuedTransfer`] method. The `OutboundTransferQueued` and `OutboundTransferRateLimited` events are emitted.

evm/src/NttManager/NttManager.sol

+4
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,10 @@ contract NttManager is INttManager, RateLimiter, ManagerBase {
539539
seq
540540
);
541541

542+
emit TransferSent(
543+
TransceiverStructs._nttManagerMessageDigest(chainId, encodedNttManagerPayload)
544+
);
545+
542546
// return the sequence number
543547
return seq;
544548
}

evm/src/interfaces/INttManager.sol

+6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ interface INttManager is IManagerBase {
3232
uint64 msgSequence
3333
);
3434

35+
/// @notice Emitted when a message is sent from the nttManager.
36+
/// @dev Topic0
37+
/// 0x3e6ae56314c6da8b461d872f41c6d0bb69317b9d0232805aaccfa45df1a16fa0.
38+
/// @param digest The digest of the message.
39+
event TransferSent(bytes32 indexed digest);
40+
3541
/// @notice Emitted when the peer contract is updated.
3642
/// @dev Topic0
3743
/// 0x1456404e7f41f35c3daac941bb50bad417a66275c3040061b4287d787719599d.

evm/src/libraries/TransceiverStructs.sol

+8-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,14 @@ library TransceiverStructs {
5959
uint16 sourceChainId,
6060
NttManagerMessage memory m
6161
) public pure returns (bytes32) {
62-
return keccak256(abi.encodePacked(sourceChainId, encodeNttManagerMessage(m)));
62+
return _nttManagerMessageDigest(sourceChainId, encodeNttManagerMessage(m));
63+
}
64+
65+
function _nttManagerMessageDigest(
66+
uint16 sourceChainId,
67+
bytes memory encodedNttManagerMessage
68+
) internal pure returns (bytes32) {
69+
return keccak256(abi.encodePacked(sourceChainId, encodedNttManagerMessage));
6370
}
6471

6572
function encodeNttManagerMessage(

evm/test/IntegrationStandalone.t.sol

+24-1
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,18 @@ contract TestEndToEndBase is Test, IRateLimiterEvents {
184184

185185
vm.stopPrank();
186186

187+
// Get the TransferSent(bytes32) event to ensure it matches up with the TransferRedeemed(bytes32) event later
188+
Vm.Log[] memory recordedLogs = vm.getRecordedLogs();
189+
bytes32 sentEventDigest;
190+
for (uint256 i = 0; i < recordedLogs.length; i++) {
191+
if (recordedLogs[i].topics[0] == keccak256("TransferSent(bytes32)")) {
192+
sentEventDigest = recordedLogs[i].topics[1];
193+
}
194+
}
195+
require(sentEventDigest != bytes32(0), "TransferSent(bytes32) event should be found");
196+
187197
// Get and sign the log to go down the other pipe. Thank you to whoever wrote this code in the past!
188-
Vm.Log[] memory entries = guardian.fetchWormholeMessageFromLog(vm.getRecordedLogs());
198+
Vm.Log[] memory entries = guardian.fetchWormholeMessageFromLog(recordedLogs);
189199
bytes[] memory encodedVMs = new bytes[](entries.length);
190200
for (uint256 i = 0; i < encodedVMs.length; i++) {
191201
encodedVMs[i] = guardian.fetchSignedMessageFromLogs(entries[i], chainId1);
@@ -209,6 +219,19 @@ contract TestEndToEndBase is Test, IRateLimiterEvents {
209219
);
210220
}
211221

222+
// Get the TransferRedeemed(bytes32) event to ensure it matches up with the TransferSent(bytes32) event earlier
223+
recordedLogs = vm.getRecordedLogs();
224+
bytes32 recvEventDigest;
225+
for (uint256 i = 0; i < recordedLogs.length; i++) {
226+
if (recordedLogs[i].topics[0] == keccak256("TransferRedeemed(bytes32)")) {
227+
recvEventDigest = recordedLogs[i].topics[1];
228+
}
229+
}
230+
require(
231+
sentEventDigest == recvEventDigest,
232+
"TransferRedeemed(bytes32) event should match TransferSent(bytes32)"
233+
);
234+
212235
// Can't resubmit the same message twice
213236
(IWormhole.VM memory wormholeVM,,) = wormhole.parseAndVerifyVM(encodedVMs[0]);
214237
vm.expectRevert(

0 commit comments

Comments
 (0)