Merge branch 'refs/heads/main' into audit/dc/one-transfer-from-only

# Conflicts:
#	foundry/src/executors/TokenTransfer.sol

Took 38 seconds
This commit is contained in:
Diana Carvalho
2025-05-15 14:53:18 +01:00

View File

@@ -486,15 +486,14 @@ contract TychoRouter is
Address.sendValue(payable(receiver), amountOut); Address.sendValue(payable(receiver), amountOut);
} }
if (tokenIn != tokenOut) { _verifyAmountOutWasReceived(
uint256 currentBalanceTokenOut = _balanceOf(tokenOut, receiver); tokenIn,
uint256 userAmount = currentBalanceTokenOut - initialBalanceTokenOut; tokenOut,
if (userAmount != amountOut) { initialBalanceTokenOut,
revert TychoRouter__AmountOutNotFullyReceived( amountOut,
userAmount, amountOut receiver,
); amountIn
} );
}
} }
/** /**
@@ -543,15 +542,14 @@ contract TychoRouter is
Address.sendValue(payable(receiver), amountOut); Address.sendValue(payable(receiver), amountOut);
} }
if (tokenIn != tokenOut) { _verifyAmountOutWasReceived(
uint256 currentBalanceTokenOut = _balanceOf(tokenOut, receiver); tokenIn,
uint256 userAmount = currentBalanceTokenOut - initialBalanceTokenOut; tokenOut,
if (userAmount != amountOut) { initialBalanceTokenOut,
revert TychoRouter__AmountOutNotFullyReceived( amountOut,
userAmount, amountOut receiver,
); amountIn
} );
}
} }
/** /**
@@ -596,16 +594,14 @@ contract TychoRouter is
_unwrapETH(amountOut); _unwrapETH(amountOut);
Address.sendValue(payable(receiver), amountOut); Address.sendValue(payable(receiver), amountOut);
} }
_verifyAmountOutWasReceived(
if (tokenIn != tokenOut) { tokenIn,
uint256 currentBalanceTokenOut = _balanceOf(tokenOut, receiver); tokenOut,
uint256 userAmount = currentBalanceTokenOut - initialBalanceTokenOut; initialBalanceTokenOut,
if (userAmount != amountOut) { amountOut,
revert TychoRouter__AmountOutNotFullyReceived( receiver,
userAmount, amountOut amountIn
); );
}
}
} }
/** /**
@@ -834,4 +830,27 @@ contract TychoRouter is
return return
token == address(0) ? owner.balance : IERC20(token).balanceOf(owner); token == address(0) ? owner.balance : IERC20(token).balanceOf(owner);
} }
/**
* @dev Verifies that the expected amount of output tokens was received by the receiver.
* It also handles the case of arbitrage swaps where the input and output tokens are the same.
*/
function _verifyAmountOutWasReceived(
address tokenIn,
address tokenOut,
uint256 initialBalanceTokenOut,
uint256 amountOut,
address receiver,
uint256 amountIn
) internal view {
uint256 currentBalanceTokenOut = _balanceOf(tokenOut, receiver);
if (tokenIn == tokenOut) {
// If it is an arbitrage, we need to remove the amountIn from the initial balance to get a correct userAmount
initialBalanceTokenOut -= amountIn;
}
uint256 userAmount = currentBalanceTokenOut - initialBalanceTokenOut;
if (userAmount != amountOut) {
revert TychoRouter__AmountOutNotFullyReceived(userAmount, amountOut);
}
}
} }