Commit Graph

297 Commits

Author SHA1 Message Date
Tamara
87d6ead4c7 Merge branch 'main' into router/tnl/rename-dispatcher-methods 2025-04-28 08:56:08 -04:00
TAMARA LIPOWSKI
1b003dc483 feat: Clear transient storage after swap call
- This was originally remaining if no callback was performed, possible resulting in unexpected behaviour and an increased attack surface.
- Also specify nonzero slot for transient storage in order to reduce the risk of dangerous slot collision.
2025-04-25 21:39:09 -04:00
TAMARA LIPOWSKI
8b55d90608 chore: rename dispatcher methods for clarity 2025-04-25 21:07:48 -04:00
TAMARA LIPOWSKI
732450670f chore: remove outdated docstring 2025-04-25 18:33:14 -04:00
TAMARA LIPOWSKI
4de1d10406 feat: Add security check for callback selector
- Do not allow any callback to be chosen, for security and clarity purposes
2025-04-25 11:02:12 -04:00
TAMARA LIPOWSKI
3fb17c71da fix: Remove tload from executor
- Store the executor address when deploying instead.
- We would like to keep all instances of tload and tstore within the callback mechanism of our main TychoRouter contract for security reasons and to prevent any unexpected behaviour
- This way it's easy to reason that UniswapV4Executor will only ever execute a delegatecall to itself. Before it could in theory execute a delegatecall to any address. One had to look at all occurences of tstore(0, x) to ensure the address was constrained.
2025-04-24 16:57:08 -04:00
Diana Carvalho
fa872f5f0e chore: move single tests to TychoRouterProtocolIntegration.t.sol
They were in TychoRouterSplitSwap.t.sol
Add docs to _balancerOf

Took 2 hours 8 minutes


Took 18 seconds
2025-04-24 13:06:50 +01:00
TAMARA LIPOWSKI
d5d6e37041 fix: Changes after rebase 2025-04-23 12:31:53 +01:00
TAMARA LIPOWSKI
af68016223 fix: Tighten max feeBps in USV2 executor
Value was too lenient. We are assuming no forks will have higher fees than the original USV2.
2025-04-23 12:31:53 +01:00
TAMARA LIPOWSKI
4f9785fdac fix: Configurable fee on USV2 executor.
- This fee is not the same depending on the fork. For example, Pancake V2 uses a 0.25% fee, while the USV2 fee is 0.3%. We were wrongly hard-coding this fee to 0.3%.
2025-04-23 12:31:53 +01:00
Diana Carvalho
7614e36f18 Merge branch 'refs/heads/main' into feature/gas-optimization
# Conflicts:
#	foundry/src/Dispatcher.sol
#	foundry/test/executors/CurveExecutor.t.sol

Took 4 minutes

Took 12 seconds
2025-04-23 12:31:51 +01:00
TAMARA LIPOWSKI
5562dd210e feat: Make USV3 callback work with direct executor call
- We have decided to now support calling our executors normally (without using delegatecalls) since they now support specifying token transfers.
- This was disabled for UniswapV3 in the past also because of data decoding issues. This seems to be the solution, though.
2025-04-23 12:31:42 +01:00
Diana Carvalho
eb2c17d0ba docs: Add comment to delegatecall in UniV4 executor
--- don't change below this line ---
ENG-4437 Took 8 minutes
2025-04-23 12:31:42 +01:00
Diana Carvalho
4a61de56b7 feat: Support using the TransferType in uniswap v4
Update tests

--- don't change below this line ---
ENG-4437 Took 1 hour 3 minutes

Took 2 minutes
2025-04-23 12:31:42 +01:00
Diana Carvalho
cd608cb8e9 feat: Do not use V4Router for uniswap v4
Do our own implementation. In the end this is much cleaner than I expected and I was able to do a few improvements:
- we don't need to use actions. using function selectors and delegate call instead
- we don't need to convert into V4 Router types
- we don't need to check balances to get the amount out, we can just use the returned value

--- don't change below this line ---
ENG-4437 Took 3 hours 56 minutes


Took 3 minutes

Took 11 minutes
2025-04-23 12:31:42 +01:00
Diana Carvalho
eb1aa6cdcd chore: Correct typo in all balancerAfter/Before (again)
--- don't change below this line ---
ENG-4314 Took 1 hour 14 minutes
2025-04-23 12:31:41 +01:00
Diana Carvalho
d447551e20 fix: Bring back receiver address zero check
Add small docs and rename variables

--- don't change below this line ---
ENG-4314 Took 1 hour 39 minutes
2025-04-23 12:31:41 +01:00
Diana Carvalho
8145f416b7 fix: After rebase fixes
- In Tycho Router
  - Fix integration tests
  - If the trade is cyclical, we can't do the balance check for the correctness of the amountOut transfers
- In encoding,
  - if it is a wrap trade, the transfer should be just a normal Transfer (not TransferFrom nor a Permit2Transfer)
  - add test names to println! statements

--- don't change below this line ---
ENG-4315 Took 1 hour 0 minutes

Took 30 seconds

Took 21 seconds

Took 16 seconds


Took 17 seconds
2025-04-23 12:31:41 +01:00
Diana Carvalho
ec87969aa6 feat: Add transfer out for Uniswap V4
Add transfer in Executor and pass receiver address in encoding
This is done by using the TAKE action instead of TAKE_ALL

--- don't change below this line ---
ENG-4315 Took 1 hour 36 minutes

Took 2 minutes
2025-04-23 12:31:41 +01:00
Diana Carvalho
328a281a44 feat: Add transfer out for Curve
Add transfer in Executor and pass receiver address in encoding
Remove integration test with StETH pool because we don't support it at simulation level and there is something weird with the amounts (that it is not worth it to investigate now)

--- don't change below this line ---
ENG-4315 Took 34 minutes

Took 2 minutes
2025-04-23 12:31:41 +01:00
Diana Carvalho
9bcb58e5aa feat: Support out transfer straight to the receiver
- The out transfer is now a responsibility of the Executors -> remove this from router methods
- Also adding a check that the receiver got the full amount out
- In encoding, if it is the last swap, pass the receiver as the trade receiver and not the router address (fix encoding tests)
- Fixed some solidity tests (after rebasing with a PR that is still open, I will fix them all)

TODO: Adapt curve and uniswap v4 to support this

--- don't change below this line ---
ENG-4315 Took 3 hours 7 minutes

Took 20 minutes

Took 59 seconds


Took 7 minutes
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
860bba4b7a fix: Add slither ignore for loop call
- This started being an issue only with slither upgrade in the CI. We accept the risk here, and have for some time.
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
be65c890bb fix: Calldata size for Ekubo pay callback
- And doc clarification
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
d9066d0a09 feat: Use TokenTransfer optimization helper in Ekubo 2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
30dc3f7682 chore: renamings for clarity
- Also added a check for length in the Curve executor.
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
3a73fef933 feat: Add TokenTransfer class to BalancerV2
- This needed to be in BalancerV2 so that the executor can also take care of transfers from the user into the tycho router, to avoid having transfer actions mixed between the router and executors
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
462be5463b feat: Add TokenTransfer class to Curve
- This needed to be in Curve so that the executor can also take care of transfers from the user into the tycho router, to avoid having transfer actions mixed between the router and executors
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
e18e38af74 chore: forge fmt.
Somehow missed.
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
e96ea1b10b fix: Test+formatting fixes after rebase. 2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
a301a1cef3 feat: (WIP) Support selection of transfer into router
- For protocols like Balancer and Curve, which expect funds to be in the router at the time of swap, we must support also transferring funds from the user into the router. Doing this in the router would mean we are dealing with transfers in two different places: in the router main methods and in the executors. To avoid this, we are now performing transfers just in the executors, and two transfer types have been added to support transfers into the router.

TODO:
- Add this for Balancer and Curve (only added for USV4 atm).
- TODO consider renaming TRANSFER_FROM and TRANSFER_PERMIT2 to include "pool" in the name
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
ee7495551e chore: Renamings + comment fixes
- Renamed ExecutorTransferMethods to TokenTransfer to avoid leaking information about how the transfer happens into the executor. The executor shouldn't care if there are multiple methods or one single method that takes care of everything.
- Also renamed TransferMethod to TransferType to match the rust encoding
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
a37805d046 feat: allow to pass msg.sender to USV3 callback
- So that we can possibly do a transferFrom
- This should still be safe since the user can't control what is passed here
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
f3c4128eda fix: USV3 encoding/decoding after rebase
- Also do some renamings and comment improvements:
transfer method -> type
- Remove integration tests since we no longer support direct calls to USV3 executor, even for testing.
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
7e98145ad7 fix: bad merge
fn should be view, not pure
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
4bc29f283b chore: Renamings + comment fixes
- Renamed ExecutorTransferMethods to TokenTransfer to avoid leaking information about how the transfer happens into the executor. The executor shouldn't care if there are multiple methods or one single method that takes care of everything.
- Also renamed TransferMethod to TransferType to match the rust encoding
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
4a20fa6215 fix: Conscious slither silencing
- This arbitrary sender should be same, since the sender is always set to be msg.sender from within the contract (no calldata can be sent specifying otherwise). This is just used to circumvent msg.sender being the pool/protocol during callbacks.
2025-04-23 12:31:41 +01:00
TAMARA LIPOWSKI
e3ac394d27 feat: Proper USV3Executor transfer decoding + tests
- Properly decode, update tests with proper decoding
- Added test case for each transfer method
- Also fully tested permit2 transferFrom and it works perfectly.

NOTE:
UniswapV3 doesn't support NONE as a transfer method.

TODO:
- Fix integration tests once encoding is implemented.
2025-04-23 12:31:40 +01:00
TAMARA LIPOWSKI
30557e7e54 refactor: create Permit2TestHelper
- To avoid duplicating permit2 setup code for TychoRouter and executor tests.
2025-04-23 12:31:40 +01:00
TAMARA LIPOWSKI
ca1d474f08 feat: Proper USV2Executor transfer decoding + tests
- Properly decode, update tests with proper decoding
- Added test case for each transfer method
- Also fully tested permit2 transferFrom and it works perfectly.

TODO:
- Fix integration tests once encoding is implemented.
2025-04-23 12:31:40 +01:00
TAMARA LIPOWSKI
8969186654 feat: allow to pass msg.sender to USV3 callback
- So that we can possibly do a transferFrom
- This should still be safe since the user can't control what is passed here
2025-04-23 12:31:40 +01:00
TAMARA LIPOWSKI
389009901e feat: ExecutorTransferMethods in UniswapV3Executor 2025-04-23 12:31:40 +01:00
TAMARA LIPOWSKI
147ba68392 feat: ExecutorTransferMethods helper contract
- Also sketch its use in USV2 (missing proper decoding)
2025-04-23 12:31:40 +01:00
TAMARA LIPOWSKI
6f2e5ac10e feat: No more fee taking
- This required an extra transfer into the router at the end of the swap sequence, costing an unnecessary 40k gas or more for certain protocols.
2025-04-23 12:31:40 +01:00
Diana Carvalho
b391c0e2f3 Merge branch 'refs/heads/feature/gas-optimization' into router/dc/ENG-4411-refactor-callback-transient-storage
# Conflicts:
#	foundry/test/TychoRouter.t.sol
#	src/encoding/evm/strategy_encoder/strategy_encoders.rs

Took 5 minutes

Took 35 seconds
2025-04-23 12:31:38 +01:00
Diana Carvalho
35441456ac Merge branch 'refs/heads/main' into feature/gas-optimization
# Conflicts:
#	foundry/test/TychoRouter.t.sol
#	src/encoding/evm/strategy_encoder/strategy_encoders.rs
#	src/encoding/evm/utils.rs

Took 3 minutes

Took 35 seconds
2025-04-23 12:30:46 +01:00
Tamara
db89a99826 Merge branch 'main' into feature/gas-optimization 2025-04-23 12:30:13 +01:00
TAMARA LIPOWSKI
3d01158bbb chore: merge main
Took 3 minutes
2025-04-23 12:29:36 +01:00
TAMARA LIPOWSKI
1dad4afb6b feat: Decode single and sequential swaps in LibSwap
- The old way was useful when we just had split swaps. Unfortunately, we now have split, sequential, and single swaps, which don't always require token indices or split percentages, so we need to decode differently for each case.
2025-04-23 12:26:31 +01:00
TAMARA LIPOWSKI
3ae9d3ad67 feat: Add sequential swap methods
- Add some basic tests (will add more in next commits)
- Adapt sequential tests (which originally tested split swap)
- Adapt a forgotten single swap test

TODO:
- Fix encoding of single and sequential swaps to not expect the split sawp format every time (the split and the token indices are not necessary and consume unnecessary gas).
2025-04-23 12:26:31 +01:00
TAMARA LIPOWSKI
49e0c49828 chore: (single swap) remove unnecessary cycle check
- It's not possible to have a single cyclical swap.
2025-04-23 12:26:31 +01:00