diff --git a/.github/workflows/tests-and-lints-template.yaml b/.github/workflows/tests-and-lints-template.yaml index e39c451..70f431b 100644 --- a/.github/workflows/tests-and-lints-template.yaml +++ b/.github/workflows/tests-and-lints-template.yaml @@ -25,7 +25,7 @@ permissions: env: CARGO_TERM_COLOR: always - ETH_RPC_URL: ${{ secrets.eth_rpc_url }} + RPC_URL: ${{ secrets.eth_rpc_url }} jobs: compile_and_test: diff --git a/CHANGELOG.md b/CHANGELOG.md index c305037..0dce5ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ +## [0.58.1](https://github.com/propeller-heads/tycho-execution/compare/0.58.0...0.58.1) (2025-03-04) + + +### Bug Fixes + +* add amountIn in error TychoRouter__AmountInDiffersFromConsumed ([a3bffd4](https://github.com/propeller-heads/tycho-execution/commit/a3bffd4f75e8644997970a45c6a8f2b896a30394)) +* inequality check for amountConsumed and amountIn ([6f421eb](https://github.com/propeller-heads/tycho-execution/commit/6f421eb374b798e9521a2a345558fae53f77dae3)) + +## [0.58.0](https://github.com/propeller-heads/tycho-execution/compare/0.57.0...0.58.0) (2025-03-03) + + +### Features + +* Rename ETH_RPC_URL -> RPC_URL ([9bb0d9b](https://github.com/propeller-heads/tycho-execution/commit/9bb0d9bc8495f4fff9006d9ed7e353042c023c9c)) + +## [0.57.0](https://github.com/propeller-heads/tycho-execution/compare/0.56.0...0.57.0) (2025-03-03) + + +### Features + +* Rename shortcut methods of encoder builder ([6f572ee](https://github.com/propeller-heads/tycho-execution/commit/6f572eed01552f4a43181187cfef0c49d0fd9d80)) + ## [0.56.0](https://github.com/propeller-heads/tycho-execution/compare/0.55.0...0.56.0) (2025-02-28) diff --git a/Cargo.lock b/Cargo.lock index 5bbf4c4..30d948b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4340,7 +4340,7 @@ dependencies = [ [[package]] name = "tycho-execution" -version = "0.56.0" +version = "0.58.1" dependencies = [ "alloy", "alloy-primitives", diff --git a/Cargo.toml b/Cargo.toml index d542afa..fba29e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tycho-execution" -version = "0.56.0" +version = "0.58.1" edition = "2021" [[bin]] diff --git a/examples/encoding-example/main.rs b/examples/encoding-example/main.rs index 7c0ca51..48ee12b 100644 --- a/examples/encoding-example/main.rs +++ b/examples/encoding-example/main.rs @@ -23,7 +23,7 @@ fn main() { // Initialize the encoder let encoder = EVMEncoderBuilder::new() .chain(Chain::Ethereum) - .tycho_router_with_permit2(None, swapper_pk) + .initialize_tycho_router_with_permit2(swapper_pk) .expect("Failed to create encoder builder") .build() .expect("Failed to build encoder"); diff --git a/foundry/src/TychoRouter.sol b/foundry/src/TychoRouter.sol index d250695..3194c2e 100644 --- a/foundry/src/TychoRouter.sol +++ b/foundry/src/TychoRouter.sol @@ -59,7 +59,9 @@ error TychoRouter__AddressZero(); error TychoRouter__AmountZero(); error TychoRouter__EmptySwaps(); error TychoRouter__NegativeSlippage(uint256 amount, uint256 minAmount); -error TychoRouter__AmountInNotFullySpent(uint256 leftoverAmount); +error TychoRouter__AmountInDiffersFromConsumed( + uint256 amountIn, uint256 amountConsumed +); error TychoRouter__MessageValueMismatch(uint256 value, uint256 amount); error TychoRouter__InvalidDataLength(); @@ -163,9 +165,10 @@ contract TychoRouter is AccessControl, Dispatcher, Pausable, ReentrancyGuard { uint256 amountConsumed = initialBalance - currentBalance; - if (amountConsumed < amountIn) { - uint256 leftoverAmount = amountIn - amountConsumed; - revert TychoRouter__AmountInNotFullySpent(leftoverAmount); + if (amountConsumed != amountIn) { + revert TychoRouter__AmountInDiffersFromConsumed( + amountIn, amountConsumed + ); } if (fee > 0) { diff --git a/foundry/test/TychoRouter.t.sol b/foundry/test/TychoRouter.t.sol index fd80824..571a060 100644 --- a/foundry/test/TychoRouter.t.sol +++ b/foundry/test/TychoRouter.t.sol @@ -983,7 +983,9 @@ contract TychoRouterTest is TychoRouterTestSetup { vm.expectRevert( abi.encodeWithSelector( - TychoRouter__AmountInNotFullySpent.selector, 400000000000000000 + TychoRouter__AmountInDiffersFromConsumed.selector, + 1000000000000000000, + 600000000000000000 ) ); diff --git a/src/bin/tycho-encode.rs b/src/bin/tycho-encode.rs index 2178269..06cbe7b 100644 --- a/src/bin/tycho-encode.rs +++ b/src/bin/tycho-encode.rs @@ -42,27 +42,21 @@ use tycho_execution::encoding::{ pub struct Cli { #[command(subcommand)] pub command: Commands, + #[arg(short, long)] + executors_file_path: Option, } #[derive(Subcommand)] pub enum Commands { /// Use the Tycho router encoding strategy - TychoRouter { - #[arg(short, long)] - config_path: Option, - }, + TychoRouter, /// Use the Tycho router encoding strategy with Permit2 approval and token in transfer TychoRouterPermit2 { - #[arg(short, long)] - config_path: Option, #[arg(short, long)] swapper_pk: String, }, /// Use the direct execution encoding strategy - DirectExecution { - #[arg(short, long)] - config_path: Option, - }, + DirectExecution, } fn main() -> Result<(), Box> { @@ -82,12 +76,16 @@ fn main() -> Result<(), Box> { let mut builder = EVMEncoderBuilder::new().chain(chain); + if let Some(config_path) = cli.executors_file_path { + builder = builder.executors_file_path(config_path); + } + builder = match cli.command { - Commands::TychoRouter { config_path } => builder.tycho_router(config_path)?, - Commands::TychoRouterPermit2 { config_path, swapper_pk } => { - builder.tycho_router_with_permit2(config_path, swapper_pk)? + Commands::TychoRouter => builder.initialize_tycho_router()?, + Commands::TychoRouterPermit2 { swapper_pk } => { + builder.initialize_tycho_router_with_permit2(swapper_pk)? } - Commands::DirectExecution { config_path } => builder.direct_execution(config_path)?, + Commands::DirectExecution => builder.initialize_direct_execution()?, }; let encoder = builder.build()?; let transactions = encoder.encode_router_calldata(vec![solution])?; diff --git a/src/encoding/evm/approvals/permit2.rs b/src/encoding/evm/approvals/permit2.rs index 9eb6c3e..f1a5153 100644 --- a/src/encoding/evm/approvals/permit2.rs +++ b/src/encoding/evm/approvals/permit2.rs @@ -269,7 +269,7 @@ mod tests { /// This test actually calls the permit method on the Permit2 contract to verify the encoded /// data works. It requires an Anvil fork, so please run with the following command: anvil - /// --fork-url And set up the following env var as ETH_RPC_URL=127.0.0.1:8545 + /// --fork-url And set up the following env var as RPC_URL=127.0.0.1:8545 /// Use an account from anvil to fill the anvil_account and anvil_private_key variables #[test] #[cfg_attr(not(feature = "fork-tests"), ignore)] diff --git a/src/encoding/evm/approvals/protocol_approvals_manager.rs b/src/encoding/evm/approvals/protocol_approvals_manager.rs index d239f73..4b06a85 100644 --- a/src/encoding/evm/approvals/protocol_approvals_manager.rs +++ b/src/encoding/evm/approvals/protocol_approvals_manager.rs @@ -75,8 +75,8 @@ impl ProtocolApprovalsManager { /// Gets the client used for interacting with the EVM-compatible network. pub async fn get_client() -> Result>, EncodingError> { dotenv().ok(); - let eth_rpc_url = env::var("ETH_RPC_URL") - .map_err(|_| EncodingError::FatalError("Missing ETH_RPC_URL in environment".to_string()))?; + let eth_rpc_url = env::var("RPC_URL") + .map_err(|_| EncodingError::FatalError("Missing RPC_URL in environment".to_string()))?; let client = ProviderBuilder::new() .on_builtin(ð_rpc_url) .await diff --git a/src/encoding/evm/encoder_builder.rs b/src/encoding/evm/encoder_builder.rs index f7dfa56..11a5f2e 100644 --- a/src/encoding/evm/encoder_builder.rs +++ b/src/encoding/evm/encoder_builder.rs @@ -16,6 +16,7 @@ use crate::encoding::{ pub struct EVMEncoderBuilder { strategy: Option>, chain: Option, + executors_file_path: Option, } impl Default for EVMEncoderBuilder { @@ -26,13 +27,20 @@ impl Default for EVMEncoderBuilder { impl EVMEncoderBuilder { pub fn new() -> Self { - EVMEncoderBuilder { chain: None, strategy: None } + EVMEncoderBuilder { chain: None, strategy: None, executors_file_path: None } } pub fn chain(mut self, chain: Chain) -> Self { self.chain = Some(chain); self } + /// Sets the `executors_file_path` manually. + /// If it's not set, the default path will be used (config/executor_addresses.json) + pub fn executors_file_path(mut self, executors_file_path: String) -> Self { + self.executors_file_path = Some(executors_file_path); + self + } + /// Sets the `strategy_encoder` manually. /// /// **Note**: This method should not be used in combination with `tycho_router` or @@ -44,12 +52,17 @@ impl EVMEncoderBuilder { /// Shortcut method to initialize a `SplitSwapStrategyEncoder` without any approval nor token in /// transfer. **Note**: Should not be used at the same time as `strategy_encoder`. - pub fn tycho_router(self, executors_file_path: Option) -> Result { + pub fn initialize_tycho_router(self) -> Result { if let Some(chain) = self.chain { - let swap_encoder_registry = SwapEncoderRegistry::new(executors_file_path, chain)?; + let swap_encoder_registry = + SwapEncoderRegistry::new(self.executors_file_path.clone(), chain)?; let strategy = Box::new(SplitSwapStrategyEncoder::new(chain, swap_encoder_registry, None)?); - Ok(EVMEncoderBuilder { chain: Some(chain), strategy: Some(strategy) }) + Ok(EVMEncoderBuilder { + chain: Some(chain), + strategy: Some(strategy), + executors_file_path: self.executors_file_path, + }) } else { Err(EncodingError::FatalError( "Please set the chain before setting the tycho router".to_string(), @@ -59,19 +72,23 @@ impl EVMEncoderBuilder { /// Shortcut method to initialize a `SplitSwapStrategyEncoder` with Permit2 approval and token /// in transfer. **Note**: Should not be used at the same time as `strategy_encoder`. - pub fn tycho_router_with_permit2( + pub fn initialize_tycho_router_with_permit2( self, - executors_file_path: Option, swapper_pk: String, ) -> Result { if let Some(chain) = self.chain { - let swap_encoder_registry = SwapEncoderRegistry::new(executors_file_path, chain)?; + let swap_encoder_registry = + SwapEncoderRegistry::new(self.executors_file_path.clone(), chain)?; let strategy = Box::new(SplitSwapStrategyEncoder::new( chain, swap_encoder_registry, Some(swapper_pk), )?); - Ok(EVMEncoderBuilder { chain: Some(chain), strategy: Some(strategy) }) + Ok(EVMEncoderBuilder { + chain: Some(chain), + strategy: Some(strategy), + executors_file_path: self.executors_file_path, + }) } else { Err(EncodingError::FatalError( "Please set the chain before setting the tycho router".to_string(), @@ -81,14 +98,16 @@ impl EVMEncoderBuilder { /// Shortcut method to initialize an `ExecutorStrategyEncoder`. /// **Note**: Should not be used at the same time as `strategy_encoder`. - pub fn direct_execution( - self, - executors_file_path: Option, - ) -> Result { + pub fn initialize_direct_execution(self) -> Result { if let Some(chain) = self.chain { - let swap_encoder_registry = SwapEncoderRegistry::new(executors_file_path, chain)?; + let swap_encoder_registry = + SwapEncoderRegistry::new(self.executors_file_path.clone(), chain)?; let strategy = Box::new(ExecutorStrategyEncoder::new(swap_encoder_registry)); - Ok(EVMEncoderBuilder { chain: Some(chain), strategy: Some(strategy) }) + Ok(EVMEncoderBuilder { + chain: Some(chain), + strategy: Some(strategy), + executors_file_path: self.executors_file_path, + }) } else { Err(EncodingError::FatalError( "Please set the chain before setting the strategy".to_string(),