Skip to content

Commit c47ae11

Browse files
authored
fix: use entire message when calculating relay hash for evm chains (#867)
* fix: hash entire message when calculating relay hash for evm chains Signed-off-by: bennett <bennett@umaproject.org> * make getV3RelayHash public Signed-off-by: bennett <bennett@umaproject.org> * update fixture with relay hash change Signed-off-by: bennett <bennett@umaproject.org> --------- Signed-off-by: bennett <bennett@umaproject.org>
1 parent dd88c3c commit c47ae11

File tree

2 files changed

+11
-54
lines changed

2 files changed

+11
-54
lines changed

contracts/SpokePool.sol

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,7 @@ abstract contract SpokePool is
976976

977977
V3RelayExecutionParams memory relayExecution = V3RelayExecutionParams({
978978
relay: relayData,
979-
relayHash: _getV3RelayHash(relayData),
979+
relayHash: getV3RelayHash(relayData),
980980
updatedOutputAmount: relayData.outputAmount,
981981
updatedRecipient: relayData.recipient,
982982
updatedMessage: relayData.message,
@@ -1046,7 +1046,7 @@ abstract contract SpokePool is
10461046

10471047
V3RelayExecutionParams memory relayExecution = V3RelayExecutionParams({
10481048
relay: relayData,
1049-
relayHash: _getV3RelayHash(relayData),
1049+
relayHash: getV3RelayHash(relayData),
10501050
updatedOutputAmount: updatedOutputAmount,
10511051
updatedRecipient: updatedRecipient,
10521052
updatedMessage: updatedMessage,
@@ -1093,7 +1093,7 @@ abstract contract SpokePool is
10931093
}
10941094
if (relayData.fillDeadline < currentTime) revert ExpiredFillDeadline();
10951095

1096-
bytes32 relayHash = _getV3RelayHash(relayData);
1096+
bytes32 relayHash = getV3RelayHash(relayData);
10971097
if (fillStatuses[relayHash] != uint256(FillStatus.Unfilled)) revert InvalidSlowFillRequest();
10981098
fillStatuses[relayHash] = uint256(FillStatus.RequestedSlowFill);
10991099

@@ -1182,7 +1182,7 @@ abstract contract SpokePool is
11821182
// deposit params like outputAmount, message and recipient.
11831183
V3RelayExecutionParams memory relayExecution = V3RelayExecutionParams({
11841184
relay: relayData,
1185-
relayHash: _getV3RelayHash(relayData),
1185+
relayHash: getV3RelayHash(relayData),
11861186
updatedOutputAmount: slowFillLeaf.updatedOutputAmount,
11871187
updatedRecipient: relayData.recipient,
11881188
updatedMessage: relayData.message,
@@ -1302,6 +1302,10 @@ abstract contract SpokePool is
13021302
return relayerRefund[l2TokenAddress][refundAddress];
13031303
}
13041304

1305+
function getV3RelayHash(V3RelayData memory relayData) public view returns (bytes32) {
1306+
return keccak256(abi.encode(relayData, chainId()));
1307+
}
1308+
13051309
/**************************************
13061310
* INTERNAL FUNCTIONS *
13071311
**************************************/
@@ -1627,27 +1631,6 @@ abstract contract SpokePool is
16271631
return (amount * uint256(int256(1e18) - feesPct)) / 1e18;
16281632
}
16291633

1630-
function _getV3RelayHash(V3RelayData memory relayData) private view returns (bytes32) {
1631-
return
1632-
keccak256(
1633-
abi.encode(
1634-
relayData.depositor,
1635-
relayData.recipient,
1636-
relayData.exclusiveRelayer,
1637-
relayData.inputToken,
1638-
relayData.outputToken,
1639-
relayData.inputAmount,
1640-
relayData.outputAmount,
1641-
relayData.originChainId,
1642-
relayData.depositId,
1643-
relayData.fillDeadline,
1644-
relayData.exclusivityDeadline,
1645-
_hashNonEmptyMessage(relayData.message),
1646-
chainId()
1647-
)
1648-
);
1649-
}
1650-
16511634
// Unwraps ETH and does a transfer to a recipient address. If the recipient is a smart contract then sends wrappedNativeToken.
16521635
function _unwrapwrappedNativeTokenTo(address payable to, uint256 amount) internal {
16531636
if (address(to).isContract()) {

test/evm/hardhat/fixtures/SpokePool.Fixture.ts

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -180,39 +180,13 @@ export function getRelayHash(
180180
}
181181

182182
export function getV3RelayHash(relayData: V3RelayData, destinationChainId: number): string {
183-
const messageHash = relayData.message == "0x" ? ethers.constants.HashZero : ethers.utils.keccak256(relayData.message);
184183
return ethers.utils.keccak256(
185184
defaultAbiCoder.encode(
186185
[
187-
"bytes32", // depositor
188-
"bytes32", // recipient
189-
"bytes32", // exclusiveRelayer
190-
"bytes32", // inputToken
191-
"bytes32", // outputToken
192-
"uint256", // inputAmount
193-
"uint256", // outputAmount
194-
"uint256", // originChainId
195-
"uint256", // depositId
196-
"uint32", // fillDeadline
197-
"uint32", // exclusivityDeadline
198-
"bytes32", // messageHash
199-
"uint256", // destinationChainId
186+
"tuple(bytes32 depositor, bytes32 recipient, bytes32 exclusiveRelayer, bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 originChainId, uint256 depositId, uint32 fillDeadline, uint32 exclusivityDeadline, bytes message)",
187+
"uint256 destinationChainId",
200188
],
201-
[
202-
relayData.depositor,
203-
relayData.recipient,
204-
relayData.exclusiveRelayer,
205-
relayData.inputToken,
206-
relayData.outputToken,
207-
relayData.inputAmount,
208-
relayData.outputAmount,
209-
relayData.originChainId,
210-
relayData.depositId,
211-
relayData.fillDeadline,
212-
relayData.exclusivityDeadline,
213-
messageHash,
214-
destinationChainId,
215-
]
189+
[relayData, destinationChainId]
216190
)
217191
);
218192
}

0 commit comments

Comments
 (0)