Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 8 additions & 25 deletions contracts/SpokePool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -1011,7 +1011,7 @@ abstract contract SpokePool is

V3RelayExecutionParams memory relayExecution = V3RelayExecutionParams({
relay: relayData,
relayHash: _getV3RelayHash(relayData),
relayHash: getV3RelayHash(relayData),
updatedOutputAmount: relayData.outputAmount,
updatedRecipient: relayData.recipient,
updatedMessage: relayData.message,
Expand Down Expand Up @@ -1059,7 +1059,7 @@ abstract contract SpokePool is

V3RelayExecutionParams memory relayExecution = V3RelayExecutionParams({
relay: relayData,
relayHash: _getV3RelayHash(relayData),
relayHash: getV3RelayHash(relayData),
updatedOutputAmount: updatedOutputAmount,
updatedRecipient: updatedRecipient,
updatedMessage: updatedMessage,
Expand Down Expand Up @@ -1106,7 +1106,7 @@ abstract contract SpokePool is
}
if (relayData.fillDeadline < currentTime) revert ExpiredFillDeadline();

bytes32 relayHash = _getV3RelayHash(relayData);
bytes32 relayHash = getV3RelayHash(relayData);
if (fillStatuses[relayHash] != uint256(FillStatus.Unfilled)) revert InvalidSlowFillRequest();
fillStatuses[relayHash] = uint256(FillStatus.RequestedSlowFill);

Expand Down Expand Up @@ -1195,7 +1195,7 @@ abstract contract SpokePool is
// deposit params like outputAmount, message and recipient.
V3RelayExecutionParams memory relayExecution = V3RelayExecutionParams({
relay: relayData,
relayHash: _getV3RelayHash(relayData),
relayHash: getV3RelayHash(relayData),
updatedOutputAmount: slowFillLeaf.updatedOutputAmount,
updatedRecipient: relayData.recipient,
updatedMessage: relayData.message,
Expand Down Expand Up @@ -1315,6 +1315,10 @@ abstract contract SpokePool is
return relayerRefund[l2TokenAddress][refundAddress];
}

function getV3RelayHash(V3RelayData memory relayData) public view returns (bytes32) {
return keccak256(abi.encode(relayData, chainId()));
}

/**************************************
* INTERNAL FUNCTIONS *
**************************************/
Expand Down Expand Up @@ -1640,27 +1644,6 @@ abstract contract SpokePool is
return (amount * uint256(int256(1e18) - feesPct)) / 1e18;
}

function _getV3RelayHash(V3RelayData memory relayData) private view returns (bytes32) {
return
keccak256(
abi.encode(
relayData.depositor,
relayData.recipient,
relayData.exclusiveRelayer,
relayData.inputToken,
relayData.outputToken,
relayData.inputAmount,
relayData.outputAmount,
relayData.originChainId,
relayData.depositId,
relayData.fillDeadline,
relayData.exclusivityDeadline,
_hashNonEmptyMessage(relayData.message),
chainId()
)
);
}

// Unwraps ETH and does a transfer to a recipient address. If the recipient is a smart contract then sends wrappedNativeToken.
function _unwrapwrappedNativeTokenTo(address payable to, uint256 amount) internal {
if (address(to).isContract()) {
Expand Down
32 changes: 3 additions & 29 deletions test/evm/hardhat/fixtures/SpokePool.Fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,39 +180,13 @@ export function getRelayHash(
}

export function getV3RelayHash(relayData: V3RelayData, destinationChainId: number): string {
const messageHash = relayData.message == "0x" ? ethers.constants.HashZero : ethers.utils.keccak256(relayData.message);
return ethers.utils.keccak256(
defaultAbiCoder.encode(
[
"bytes32", // depositor
"bytes32", // recipient
"bytes32", // exclusiveRelayer
"bytes32", // inputToken
"bytes32", // outputToken
"uint256", // inputAmount
"uint256", // outputAmount
"uint256", // originChainId
"uint256", // depositId
"uint32", // fillDeadline
"uint32", // exclusivityDeadline
"bytes32", // messageHash
"uint256", // destinationChainId
"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)",
"uint256 destinationChainId",
],
[
relayData.depositor,
relayData.recipient,
relayData.exclusiveRelayer,
relayData.inputToken,
relayData.outputToken,
relayData.inputAmount,
relayData.outputAmount,
relayData.originChainId,
relayData.depositId,
relayData.fillDeadline,
relayData.exclusivityDeadline,
messageHash,
destinationChainId,
]
[relayData, destinationChainId]
)
);
}
Expand Down
Loading