From ed599c8ab580170bc7a2dfcde12cfc1c743029aa Mon Sep 17 00:00:00 2001 From: Luke Parker Date: Fri, 24 Jan 2025 17:03:48 -0500 Subject: [PATCH] Have the Batch event encode the amount of results Necessary to distinguish a bitvec with 1 results from a bitvec with 7 results. --- processor/ethereum/router/contracts/IRouter.sol | 15 +++++++++------ processor/ethereum/router/contracts/Router.sol | 9 ++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/processor/ethereum/router/contracts/IRouter.sol b/processor/ethereum/router/contracts/IRouter.sol index c22bef3c..772a04f7 100644 --- a/processor/ethereum/router/contracts/IRouter.sol +++ b/processor/ethereum/router/contracts/IRouter.sol @@ -27,14 +27,17 @@ interface IRouterWithoutCollisions { /// @notice Emitted when a batch of `OutInstruction`s occurs /// @param nonce The nonce consumed to execute this batch of transactions /// @param messageHash The hash of the message signed for the executed batch + /// @param resultsLength The length of the results bitvec (represented as bytes) /** - * @param results The result of each `OutInstruction` executed. This is a bitmask with true - * representing success and false representing failure. The high bit (1 << 7) in the first byte - * is used for the first `OutInstruction`, before the next bit, and so on, before the next byte. - * An `OutInstruction` is considered as having succeeded if the call transferring ETH doesn't - * fail, the ERC20 transfer doesn't fail, and any executed code doesn't revert. + * @param results The result of each `OutInstruction` executed. This is a bitvec with true + * representing success and false representing failure. The low bit in the first byte is used + * for the first `OutInstruction`, before the next bit, and so on, before the next byte. An + * `OutInstruction` is considered as having succeeded if the call transferring ETH doesn't fail, + * the ERC20 transfer doesn't fail, and any executed code doesn't revert. */ - event Batch(uint256 indexed nonce, bytes32 indexed messageHash, bytes results); + event Batch( + uint256 indexed nonce, bytes32 indexed messageHash, uint256 resultsLength, bytes results + ); /// @notice Emitted when `escapeHatch` is invoked /// @param escapeTo The address to escape to diff --git a/processor/ethereum/router/contracts/Router.sol b/processor/ethereum/router/contracts/Router.sol index c3f6befa..b6ffc3c1 100644 --- a/processor/ethereum/router/contracts/Router.sol +++ b/processor/ethereum/router/contracts/Router.sol @@ -376,14 +376,13 @@ contract Router is IRouterWithoutCollisions { */ function transferOut(address to, address coin, uint256 amount) private returns (bool success) { if (coin == address(0)) { - // Enough gas to service the transfer and a minimal amount of logic - uint256 _gas = 5_000; // This uses assembly to prevent return bombs // slither-disable-next-line assembly assembly { success := call( - _gas, + // explicit gas + 0, to, amount, // calldata @@ -512,7 +511,7 @@ contract Router is IRouterWithoutCollisions { } if (success) { - results[i / 8] |= bytes1(uint8(1 << (7 - (i % 8)))); + results[i / 8] |= bytes1(uint8(1 << (i % 8))); } } @@ -521,7 +520,7 @@ contract Router is IRouterWithoutCollisions { This is an effect after interactions yet we have a reentrancy guard making this safe. */ - emit Batch(nonceUsed, message, results); + emit Batch(nonceUsed, message, outs.length, results); // Transfer the fee to the relayer transferOut(msg.sender, coin, fee);