- Needed to add ekubo and uniswap v4 to callback-limited protocols.
- I had to bump the fork block in all of our integration tests: The way it was before meant that certain integration tests were using certain executor addresses, and others were using different ones, because of the redeployment. This was a pain to account for on the rust side. Instead, all tests now use an Ekubo-compatible fork block. Values needed to be updated because of price changes between blocks.
## [1.0.0](https://github.com/propeller-heads/tycho-execution/compare/0.81.0...1.0.0) (2025-04-22)
### Features
* (WIP) Support selection of transfer into router ([528bd74](528bd746f7))
* Add sequential swap methods ([2e3ffa2](2e3ffa2c70))
* Add SequentialSwap integration test with regular approvals ([8836598](8836598e53))
* Add SingleSwap integration test and fix bug in method signatures ([9c4dfef](9c4dfef80d))
* Add TokenTransfer class to BalancerV2 ([8e7dd0b](8e7dd0b9e7))
* Add TokenTransfer class to Curve ([0e0dff7](0e0dff7f5a))
* Add transfer out for Curve ([005c5a6](005c5a6207))
* Add transfer out for Uniswap V4 ([534e4f0](534e4f00db))
* Allow for token_in_already_in_router ([655c0b2](655c0b2635))
* allow to pass msg.sender to USV3 callback ([bf4b229](bf4b229268))
* allow to pass msg.sender to USV3 callback ([e71a0bb](e71a0bb354))
* Decode single and sequential swaps in LibSwap ([9be4845](9be48456e5))
* Delete EVMStrategyEncoder (this is now unnecessary) ([1fabef7](1fabef7a97))
* Do not use V4Router for uniswap v4 ([09b5a73](09b5a732ef))
* ExecutorTransferMethods helper contract ([abd9db9](abd9db937d))
* ExecutorTransferMethods in UniswapV3Executor ([dbbd30e](dbbd30e596))
* ExecutorTransferMethods in UniswapV3Executor ([e5426f3](e5426f3038))
* Fix rollFork usage for Ekubo test ([d7b5e6d](d7b5e6dba5))
* Make USV3 callback work with direct executor call ([51a7910](51a7910844))
* No more fee taking ([89f9121](89f9121e4c))
* Optimize transfer to first pool ([bf63696](bf63696142))
* Proper USV2Executor transfer decoding + tests ([b7ff870](b7ff870a7c))
* Proper USV2Executor transfer decoding + tests ([9dce2c7](9dce2c7465))
* Proper USV3Executor transfer decoding + tests ([1e37320](1e37320087))
* Refactor callback for pancakeV3 and Ekubo to use transient storage ([deb10b8](deb10b82de))
* Refactor callback to use transient storage ([af44956](af449562b0))
* Refactor TychoEncoder ([1996fd3](1996fd39e8))
* sequential swap solution validation ([efa5096](efa5096661))
* Single swap methods. ([72ccadc](72ccadcaae))
* SingleSwapStrategyEncoder ([5efeb8b](5efeb8b305))
* SingleSwapStrategyEncoder ([03f6961](03f6961b13))
* SingleSwapStrategyEncoder ([dbf5d1d](dbf5d1ddda))
* Support in between swaps optimizations ([83d3721](83d3721bf1))
* Support out transfer straight to the receiver ([d28c254](d28c254225))
* Support returning values from the callback ([fb35a53](fb35a5305a))
* Support using the TransferType in uniswap v4 ([2ecbabe](2ecbabeafc))
* **tycho-router-encoder:** Select strategy depending on the solution ([7f14f1a](7f14f1a4ff))
* Use TokenTransfer optimization helper in Ekubo ([d4e8642](d4e864272d))
### Bug Fixes
* Add slither ignore for loop call ([15f4ed5](15f4ed5d36))
* After rebase fixes ([ae30218](ae30218842))
* bad merge ([03ef744](03ef744373))
* Bring back receiver address zero check ([8e60b6b](8e60b6beba))
* Calldata size for Ekubo pay callback ([fb855d0](fb855d00a4))
* Conscious slither silencing ([a645fc7](a645fc72ab))
* consider wrapping scenario when getting transfer type ([028e860](028e8605a1))
* Fix after merge with main ([3de5a19](3de5a192b6))
* Fix executor address in test and remove duplicated test ([9456dc7](9456dc7b0b))
* Fix integration tests with transfer in method support ([0f3a910](0f3a9101b9))
* fix slither CI action ([7431b26](7431b266e1))
* Fixes after merge with feature branch ([26e6c6c](26e6c6c266))
* Integration tests after merge ([55242fb](55242fb8c4))
* No more EVMStrategyEncoder ([fbbc4c5](fbbc4c5277))
* Post rebase fixes ([01483c4](01483c4407))
* Prevent multiple callbacks ([f91b101](f91b101a94))
* properly add ekubo_v2 to constants ([24dd814](24dd814098))
* Remove --ignore-compile flag for slither ([353667e](353667e565))
* Remove router_address from Solution object ([9eb18f4](9eb18f4474))
* Rename constants and update docstrings for clarity ([11dffdc](11dffdcb28))
* test fix after rebase ([e05ffed](e05ffedd5d))
* Test+formatting fixes after rebase. ([6cf0f52](6cf0f523c1))
* TransferType renaming after rebase ([12c410b](12c410bb03))
* unsupported protocols for chained swaps are always unsupported ([9ce6fc0](9ce6fc0153))
* USV3 encoding/decoding after rebase ([2d0a3ac](2d0a3ac3fd))
- 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%.
- 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.
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
Only the first swap of a SwapGroup would actually get a transfer in, so we don't need to do this inside of the swaps loop
Rename in_token and out_token to token_in and token_out in SwapGroup
--- don't change below this line ---
ENG-4446 Took 22 minutes
In both encoding and contracts:
- Make sure that the tests names/encoder match what is happening (we had test_split_... that was only a single swap).
- Made modules inside the encodings tests
- In swap_encoders: there is one module per protocol
- In strategy_encoders: there is one module per strategy and an extra protocol_integration module. Inside the sequential module there is another module called chained_swaps
- In contracts, each strategy has its own file. Integration tests per strategy should also be here. Renamed TychoRouterIntegration to TychoRouterProtocolIntegration. Only protocol integration tests should be in this file
--- don't change below this line ---
ENG-4327 Took 1 hour 13 minutes
- 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
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
- 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.
- 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
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
- 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
- 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