diff --git a/.github/workflows/evm-foundry-ci.yml b/.github/workflows/evm-foundry-ci.yml index 8c4a98e..67647d7 100644 --- a/.github/workflows/evm-foundry-ci.yml +++ b/.github/workflows/evm-foundry-ci.yml @@ -15,6 +15,7 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: + ref: ${{ github.event.pull_request.head.sha }} submodules: recursive - name: Install Foundry diff --git a/CHANGELOG.md b/CHANGELOG.md index e5594d4..a7bcc68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [0.75.0](https://github.com/propeller-heads/tycho-execution/compare/0.74.0...0.75.0) (2025-04-03) + + +### Features + +* Unichain deployment ([d05e118](https://github.com/propeller-heads/tycho-execution/commit/d05e1183d4e85eb57c139b1fd5411833efea92fc)) + + +### Bug Fixes + +* Run foundry tests on PR branch (not main) ([43f1a07](https://github.com/propeller-heads/tycho-execution/commit/43f1a0701707d2dbf5bfa4f6ccde50aea48e46a1)) +* Set native and wrapped tokens for Unichain ([4878229](https://github.com/propeller-heads/tycho-execution/commit/4878229e1d60a317b0f2d97ea57886e64cc70cb5)) + ## [0.74.0](https://github.com/propeller-heads/tycho-execution/compare/0.73.0...0.74.0) (2025-04-02) diff --git a/Cargo.lock b/Cargo.lock index dd8cc6b..1653da2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4341,7 +4341,7 @@ dependencies = [ [[package]] name = "tycho-execution" -version = "0.74.0" +version = "0.75.0" dependencies = [ "alloy", "alloy-primitives", diff --git a/Cargo.toml b/Cargo.toml index 168b2fa..cde194e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tycho-execution" -version = "0.74.0" +version = "0.75.0" edition = "2021" description = "Provides tools for encoding and executing swaps against Tycho router and protocol executors." repository = "https://github.com/propeller-heads/tycho-execution" diff --git a/config/executor_addresses.json b/config/executor_addresses.json index 522356c..6943a1d 100644 --- a/config/executor_addresses.json +++ b/config/executor_addresses.json @@ -24,5 +24,10 @@ }, "tenderly_base": { "uniswap_v3": "0x7c7E06d7317e620a185078e236879D2a87fC8d22" + }, + "unichain": { + "uniswap_v2": "0x2E80FBD880379744b46C2aB7249D2949E6696353", + "uniswap_v3": "0x7ba9149EaCC5801279FF8B4d7ECa020bbef18F90", + "uniswap_v4": "0x475EB503D630C2919DC8B24cB6603E17e69Bfe35" } } diff --git a/config/router_addresses.json b/config/router_addresses.json index bac76ba..391aa56 100644 --- a/config/router_addresses.json +++ b/config/router_addresses.json @@ -1,4 +1,5 @@ { "ethereum": "0x0178f471f219737c51d6005556d2f44de011a08a", - "base": "0xC2C23b0199525DE070D126860133dc3badaD2EEb" + "base": "0xC2C23b0199525DE070D126860133dc3badaD2EEb", + "unichain": "0x9BDC3bE75440dBE563527CB39BB11cFBD1E21b09" } diff --git a/foundry/hardhat.config.js b/foundry/hardhat.config.js index f1395ae..ad1c611 100644 --- a/foundry/hardhat.config.js +++ b/foundry/hardhat.config.js @@ -35,6 +35,11 @@ module.exports = { url: process.env.RPC_URL, accounts: [process.env.PRIVATE_KEY], chainId: 8453 + }, + unichain: { + url: process.env.RPC_URL, + accounts: [process.env.PRIVATE_KEY], + chainId: 130 } }, @@ -45,6 +50,20 @@ module.exports = { }, etherscan: { - apiKey: process.env.BLOCKCHAIN_EXPLORER_API_KEY, + apiKey: { + unichain: process.env.BLOCKCHAIN_EXPLORER_API_KEY, + base: process.env.BLOCKCHAIN_EXPLORER_API_KEY, + ethereum: process.env.BLOCKCHAIN_EXPLORER_API_KEY, + }, + customChains: [ + { + network: "unichain", + chainId: 130, + urls: { + apiURL: "https://api.uniscan.xyz/api", + browserURL: "https://www.uniscan.xyz/" + } + } + ] } }; diff --git a/foundry/scripts/deploy-executors.js b/foundry/scripts/deploy-executors.js index 6c0f55b..fa32960 100644 --- a/foundry/scripts/deploy-executors.js +++ b/foundry/scripts/deploy-executors.js @@ -36,6 +36,7 @@ const executors_to_deploy = { // Args: Ekubo core contract {exchange: "EkuboExecutor", args: [ "0xe0e0e08A6A4b9Dc7bD67BCB7aadE5cF48157d444" + ]} ], "base":[ // Args: Factory, Pool Init Code Hash @@ -67,6 +68,20 @@ const executors_to_deploy = { {exchange: "UniswapV4Executor", args: ["0x498581ff718922c3f8e6a244956af099b2652b2b"]}, {exchange: "BalancerV2Executor", args: []}, ], + "unichain":[ + // Args: Factory, Pool Init Code Hash + {exchange: "UniswapV2Executor", args: [ + "0x1f98400000000000000000000000000000000002", + "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" + ]}, + // USV3 - Args: Factory, Pool Init Code Hash + {exchange: "UniswapV3Executor", args: [ + "0x1f98400000000000000000000000000000000003", + "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54" + ]}, + // Args: Pool manager + {exchange: "UniswapV4Executor", args: ["0x1f98400000000000000000000000000000000004"]}, + ], } async function main() { diff --git a/foundry/scripts/deploy-router.js b/foundry/scripts/deploy-router.js index 87e0f15..103fd0d 100644 --- a/foundry/scripts/deploy-router.js +++ b/foundry/scripts/deploy-router.js @@ -13,6 +13,10 @@ async function main() { // permit2 address is the same as on ethereum permit2 = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; weth = "0x4200000000000000000000000000000000000006"; + } else if (network === "unichain") { + // permit2 address is the same as on ethereum + permit2 = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; + weth = "0x4200000000000000000000000000000000000006"; } else { throw new Error(`Unsupported network: ${network}`); } diff --git a/foundry/scripts/roles.json b/foundry/scripts/roles.json index 3a7ad7a..2d477fe 100644 --- a/foundry/scripts/roles.json +++ b/foundry/scripts/roles.json @@ -58,5 +58,20 @@ "FUND_RESCUER_ROLE": [ "0xb0A77f867Fcec1e9b271Ee17354bC6bBC0dD5662" ] + }, + "unichain": { + "EXECUTOR_SETTER_ROLE": [ + "0x810A00Fa9287700871ba0f870Cd89D7Eac08D48C" + ], + "FEE_SETTER_ROLE": [], + "PAUSER_ROLE": [ + "0x810A00Fa9287700871ba0f870Cd89D7Eac08D48C" + ], + "UNPAUSER_ROLE": [ + "0x810A00Fa9287700871ba0f870Cd89D7Eac08D48C" + ], + "FUND_RESCUER_ROLE": [ + "0x810A00Fa9287700871ba0f870Cd89D7Eac08D48C" + ] } } \ No newline at end of file diff --git a/src/bin/tycho-encode.rs b/src/bin/tycho-encode.rs index 8cc3bd6..c0216fa 100644 --- a/src/bin/tycho-encode.rs +++ b/src/bin/tycho-encode.rs @@ -35,7 +35,6 @@ use tycho_execution::encoding::{ /// "token_out": "0x...", /// "split": 0.0 /// }], -/// "router_address": "0x..." /// } /// ``` #[command(author, version, about, long_about = None)] diff --git a/src/encoding/evm/constants.rs b/src/encoding/evm/constants.rs index 0b6eb48..b3d33fc 100644 --- a/src/encoding/evm/constants.rs +++ b/src/encoding/evm/constants.rs @@ -12,6 +12,6 @@ pub static GROUPABLE_PROTOCOLS: LazyLock> = LazyLock::new( let mut set = HashSet::new(); set.insert("uniswap_v4"); set.insert("balancer_v3"); - set.insert("ekubo"); + set.insert("ekubo_v2"); set }); diff --git a/src/encoding/models.rs b/src/encoding/models.rs index a8fce6a..43af861 100644 --- a/src/encoding/models.rs +++ b/src/encoding/models.rs @@ -148,6 +148,7 @@ impl Chain { self.decode_hex("0000000000000000000000000000000000000000", decode_err_msg) } 324 => self.decode_hex("000000000000000000000000000000000000800A", decode_err_msg), + 130 => self.decode_hex("0000000000000000000000000000000000000000", decode_err_msg), _ => Err(EncodingError::InvalidInput(format!( "Native token not set for chain {:?}. Double check the chain is supported.", self.name @@ -162,6 +163,7 @@ impl Chain { 8453 => self.decode_hex("4200000000000000000000000000000000000006", decode_err_msg), 324 => self.decode_hex("5AEa5775959fBC2557Cc8789bC1bf90A239D9a91", decode_err_msg), 42161 => self.decode_hex("82aF49447D8a07e3bd95BD0d56f35241523fBab1", decode_err_msg), + 130 => self.decode_hex("4200000000000000000000000000000000000006", decode_err_msg), _ => Err(EncodingError::InvalidInput(format!( "Wrapped token not set for chain {:?}. Double check the chain is supported.", self.name