Skip to content

Commit 79c5d89

Browse files
authored
Feat/int 510/executemultisend (#7)
* feat: abstract & contract for EIP7702 * fix: FeeSplitter tests * chore: fix GitHub Action * chore: run forge fmt
1 parent 4c8f7a5 commit 79c5d89

56 files changed

Lines changed: 831 additions & 622 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,31 @@
11
PRIVATE_KEY=
22

3-
ETHEREUM_RPC_URL=
4-
ARBITRUM_RPC_URL=
5-
OPTIMISM_RPC_URL=
6-
POLYGON_RPC_URL=
3+
# Network RPC URLs
4+
ARBITRUM_RPC_URL=https://endpoints.omniatech.io/v1/arbitrum/one/public
5+
AVALANCHE_RPC_URL=https://api.avax.network/ext/bc/C/rpc
6+
BASE_RPC_URL=https://base.llamarpc.com
7+
BERACHAIN_RPC_URL=https://rpc.berachain.com
78
BSC_RPC_URL=https://bsc-dataseed.binance.org/
9+
ETHEREUM_RPC_URL=https://ethereum-rpc.publicnode.com
810
GNOSIS_RPC_URL=https://rpc.gnosischain.com/
9-
AVALANCHE_RPC_URL=https://api.avax.network/ext/bc/C/rpc
10-
FANTOM_RPC_URL=https://rpc.ankr.com/fantom/
11-
AURORA_RPC_URL=https://mainnet.aurora.dev
11+
HYPER_RPC_URL=https://rpc.hyperliquid.xyz/evm
12+
LINEA_RPC_URL=https://rpc.linea.build
13+
OPTIMISM_RPC_URL=https://optimism.rpc.subquery.network/public
14+
POLYGON_RPC_URL=https://endpoints.omniatech.io/v1/matic/mainnet/public
15+
SONIC_RPC_URL=https://rpc.soniclabs.com
16+
ZKSYNC_RPC_URL=https://1rpc.io/zksync2-era
1217

13-
ETHERSCAN_API_KEY=
18+
# Block Explorer Credentials
19+
ARBITRUM_BLOCKSCAN_KEY=
20+
AVALANCHE_BLOCKSCAN_KEY=
21+
BASE_BLOCKSCAN_KEY=
22+
BERACHAIN_BLOCKSCAN_KEY=
23+
BSC_BLOCKSCAN_KEY=
24+
ETHEREUM_BLOCKSCAN_KEY=
25+
GNOSIS_BLOCKSCAN_KEY=
26+
HYPER_BLOCKSCAN_KEY=
27+
LINEA_BLOCKSCAN_KEY=
28+
OPTIMISM_BLOCKSCAN_KEY=
29+
POLYGON_BLOCKSCAN_KEY=
30+
SONIC_BLOCKSCAN_KEY=
31+
ZKSYNC_BLOCKSCAN_KEY=

.github/workflows/ci.yml

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches:
6+
- "*" # Trigger on any push to any branch
7+
8+
pull_request:
9+
branches:
10+
- main # Trigger on any PR to the main branch
11+
types:
12+
- opened
13+
- synchronize
14+
- reopened # Trigger only on non-draft PRs (draft PRs are not included)
15+
16+
env:
17+
FOUNDRY_PROFILE: ci
18+
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
19+
ARBITRUM_RPC_URL: ${{ secrets.ARBITRUM_RPC_URL }}
20+
AVALANCHE_RPC_URL: ${{ secrets.AVALANCHE_RPC_URL }}
21+
BASE_RPC_URL: ${{ secrets.BASE_RPC_URL }}
22+
BERACHAIN_RPC_URL: ${{ secrets.BERACHAIN_RPC_URL }}
23+
BSC_RPC_URL: ${{ secrets.BSC_RPC_URL }}
24+
ETHEREUM_RPC_URL: ${{ secrets.ETHEREUM_RPC_URL }}
25+
GNOSIS_RPC_URL: ${{ secrets.GNOSIS_RPC_URL }}
26+
HYPER_RPC_URL: ${{ secrets.HYPER_RPC_URL }}
27+
LINEA_RPC_URL: ${{ secrets.LINEA_RPC_URL }}
28+
OPTIMISM_RPC_URL: ${{ secrets.OPTIMISM_RPC_URL }}
29+
POLYGON_RPC_URL: ${{ secrets.POLYGON_RPC_URL }}
30+
SONIC_RPC_URL: ${{ secrets.SONIC_RPC_URL }}
31+
ZKSYNC_RPC_URL: ${{ secrets.ZKSYNC_RPC_URL }}
32+
33+
jobs:
34+
check:
35+
name: Foundry project
36+
runs-on: ubuntu-latest
37+
steps:
38+
- name: Checkout code
39+
uses: actions/checkout@v4
40+
with:
41+
submodules: recursive
42+
43+
- name: Install Foundry
44+
uses: foundry-rs/foundry-toolchain@v1
45+
with:
46+
version: stable
47+
48+
- name: Show Forge version
49+
run: forge --version
50+
51+
- name: Build contracts
52+
run: forge build --sizes
53+
54+
- name: Run tests
55+
run: forge test -vvv

.github/workflows/test.yml

Lines changed: 0 additions & 40 deletions
This file was deleted.

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
branch = v1.9.6
55
[submodule "lib/enso-weiroll"]
66
path = lib/enso-weiroll
7-
url = ../enso-weiroll.git
7+
url = https://github.com/EnsoBuild/enso-weiroll.git
88
[submodule "lib/safe-tools"]
99
path = lib/safe-tools
1010
url = https://github.com/colinnielsen/safe-tools

foundry.toml

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,59 @@
11
[profile.default]
2-
src = 'src'
3-
out = 'out'
4-
libs = ['lib']
5-
via_ir = true
6-
solc = '0.8.28'
2+
auto_detect_solc = false
3+
# NOTE: by excluding the metadata hash we make sure future contracts can be partially modified without altering their bytecode.
4+
bytecode_hash = "none" # Disables the metadata
5+
cbor_metadata = false # Diasbles the metadata
6+
evm_version = "prague"
7+
libs = ["lib"]
8+
optimizer = true
79
optimizer-runs = 200
10+
out = "out"
11+
script = "script"
12+
solc = "0.8.28"
13+
src = "src"
14+
test = "test"
15+
via_ir = true
16+
17+
[fmt]
18+
bracket_spacing = true
19+
contract_new_lines = false
20+
int_types = "long"
21+
line_length = 120
22+
multiline_func_header = "all"
23+
number_underscore = "thousands"
24+
quote_style = "double"
25+
sort_imports = true
26+
tab_width = 4
27+
wrap_comments = true
828

929
[rpc_endpoints]
10-
mainnet = "${ETHEREUM_RPC_URL}"
1130
arbitrum = "${ARBITRUM_RPC_URL}"
12-
optimism = "${OPTIMISM_RPC_URL}"
13-
polygon = "${POLYGON_RPC_URL}"
14-
bsc = "${BSC_RPC_URL}"
15-
gnosis = "${GNOSIS_RPC_URL}"
1631
avalanche = "${AVALANCHE_RPC_URL}"
17-
fantom = "${FANTOM_RPC_URL}"
18-
aurora = "${AURORA_RPC_URL}"
19-
goerli = "${GOERLI_RPC_URL}"
2032
base = "${BASE_RPC_URL}"
33+
berachain = "${BERACHAIN_RPC_URL}"
34+
bsc = "${BSC_RPC_URL}"
35+
gnosis = "${GNOSIS_RPC_URL}"
36+
hyper = "${HYPER_RPC_URL}"
2137
linea = "${LINEA_RPC_URL}"
38+
mainnet = "${ETHEREUM_RPC_URL}"
39+
optimism = "${OPTIMISM_RPC_URL}"
40+
polygon = "${POLYGON_RPC_URL}"
41+
sonic = "${SONIC_RPC_URL}"
42+
zksync = "${ZKSYNC_RPC_URL}"
2243

2344
[etherscan]
24-
mainnet = { key = "${ETHEREUM_BLOCKSCAN_KEY}" }
2545
arbitrum = { key = "${ARBITRUM_BLOCKSCAN_KEY}" }
26-
optimism = { key = "${OPTIMISM_BLOCKSCAN_KEY}" }
27-
polygon = { key = "${POLYGON_BLOCKSCAN_KEY}" }
46+
avalanche = { key = "${AVALANCHE_BLOCKSCAN_KEY}" }
47+
base = { key = "${BASE_BLOCKSCAN_KEY}" }
48+
berachain = { key = "${BERACHAIN_BLOCKSCAN_KEY}" }
2849
bsc = { key = "${BSC_BLOCKSCAN_KEY}" }
2950
gnosis = { key = "${GNOSIS_BLOCKSCAN_KEY}" }
30-
avalanche = { key = "${AVALANCHE_BLOCKSCAN_KEY}" }
51+
hyper = { key = "${HYPER_BLOCKSCAN_KEY}" }
52+
linea = { key = "${LINEA_BLOCKSCAN_KEY}" }
53+
mainnet = { key = "${ETHEREUM_BLOCKSCAN_KEY}" }
54+
optimism = { key = "${OPTIMISM_BLOCKSCAN_KEY}" }
55+
polygon = { key = "${POLYGON_BLOCKSCAN_KEY}" }
56+
sonic = { key = "${SONIC_BLOCKSCAN_KEY}" }
57+
zksync = { key = "${ZKSYNC_BLOCKSCAN_KEY}" }
3158

3259
# See more config options https://github.com/foundry-rs/foundry/tree/master/config

remappings.txt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
1-
@ensdomains/=lib/shortcuts-contracts/node_modules/@ensdomains/
2-
@ensofinance/=lib/shortcuts-contracts/node_modules/@ensofinance/
31
@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/
42
@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/
53
@layerzerolabs/lz-evm-oapp-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/oapp/
6-
@openzeppelin/=lib/shortcuts-contracts/node_modules/@openzeppelin/
7-
@rari-capital/=lib/shortcuts-contracts/node_modules/@rari-capital/
84
@uniswap/v4-core/=lib/v4-core/
95
@uniswap/v4-periphery/=lib/v4-periphery/
10-
clones-with-immutable-args/=lib/shortcuts-contracts/node_modules/clones-with-immutable-args/
116
devtools/=lib/devtools/packages/toolbox-foundry/src/
127
ds-test/=lib/forge-std/lib/ds-test/src/
138
enso-weiroll/=lib/enso-weiroll/contracts/
149
erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/
15-
eth-gas-reporter/=lib/shortcuts-contracts/node_modules/eth-gas-reporter/
1610
forge-std/=lib/forge-std/src/
1711
halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/
18-
hardhat-deploy/=lib/shortcuts-contracts/node_modules/hardhat-deploy/
19-
hardhat/=lib/shortcuts-contracts/node_modules/hardhat/
2012
layerzero-v2/=lib/layerzero-v2/
2113
openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/
2214
safe-contracts/=lib/safe-tools/lib/safe-contracts/contracts/
2315
safe-tools/=lib/safe-tools/src/
24-
shortcuts-contracts/=lib/shortcuts-contracts/contracts/
2516
solady/=lib/solady/src/
2617
solmate/=lib/solady/lib/solmate/src/
18+
@ensdomains/=lib/v4-core/node_modules/@ensdomains/
19+
@openzeppelin/=lib/v4-core/lib/openzeppelin-contracts/
20+
forge-gas-snapshot/=lib/v4-periphery/lib/permit2/lib/forge-gas-snapshot/src/
21+
hardhat/=lib/v4-core/node_modules/hardhat/
22+
permit2/=lib/v4-periphery/lib/permit2/
23+
v4-core/=lib/v4-core/src/
24+
v4-periphery/=lib/v4-periphery/

script/BaseSolverDeployer.s.sol

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity ^0.8.28;
33

4-
import "forge-std/Script.sol";
54
import "../src/solvers/BaseSolver.sol";
5+
import "forge-std/Script.sol";
66

77
struct BaseSolverResult {
88
BaseSolver shortcuts;
@@ -13,9 +13,6 @@ contract BaseSolverDeployer is Script {
1313
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
1414

1515
vm.broadcast(deployerPrivateKey);
16-
result.shortcuts = new BaseSolver{salt: "BaseSolver"}(
17-
vm.envAddress("OWNER"),
18-
vm.envAddress("EXECUTOR")
19-
);
16+
result.shortcuts = new BaseSolver{ salt: "BaseSolver" }(vm.envAddress("OWNER"), vm.envAddress("EXECUTOR"));
2017
}
2118
}

script/BebopSolverDeployer.s.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity ^0.8.28;
33

4-
import "forge-std/Script.sol";
54
import "../src/solvers/BebopSolver.sol";
5+
import "forge-std/Script.sol";
66

77
struct BebopSolverResult {
88
BebopSolver shortcuts;
@@ -13,7 +13,7 @@ contract BebopSolverDeployer is Script {
1313
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
1414

1515
vm.broadcast(deployerPrivateKey);
16-
result.shortcuts = new BebopSolver{salt: "BebopSolver"}(
16+
result.shortcuts = new BebopSolver{ salt: "BebopSolver" }(
1717
vm.envAddress("OWNER"),
1818
0xbEbEbEb035351f58602E0C1C8B59ECBfF5d5f47b, // Bebop Jam Settlement
1919
vm.envAddress("RELAYER")

script/ClientDeployer.s.sol

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity ^0.8.28;
33

4-
import "forge-std/Script.sol";
54
import "../src/EnsoShortcuts.sol";
6-
import "../src/router/EnsoRouter.sol";
5+
76
import "../src/delegate/DelegateEnsoShortcuts.sol";
7+
import "../src/router/EnsoRouter.sol";
8+
import "forge-std/Script.sol";
89

910
struct DeployerResult {
1011
EnsoRouter router;
@@ -18,9 +19,9 @@ contract Deployer is Script {
1819

1920
vm.startBroadcast(deployerPrivateKey);
2021

21-
result.router = new EnsoRouter{salt: "EnsoRouter"}();
22+
result.router = new EnsoRouter{ salt: "EnsoRouter" }();
2223
result.shortcuts = EnsoShortcuts(payable(result.router.shortcuts()));
23-
result.delegate = new DelegateEnsoShortcuts{salt: "DelegateEnsoShortcuts"}();
24+
result.delegate = new DelegateEnsoShortcuts{ salt: "DelegateEnsoShortcuts" }();
2425

2526
vm.stopBroadcast();
2627
}

script/DelegateDeployer.s.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: GPL-3.0-only
22
pragma solidity ^0.8.28;
33

4-
import "forge-std/Script.sol";
54
import "../src/delegate/DelegateEnsoShortcuts.sol";
5+
import "forge-std/Script.sol";
66

77
struct DelegateDeployerResult {
88
DelegateEnsoShortcuts delegate;
@@ -14,7 +14,7 @@ contract DelegateDeployer is Script {
1414

1515
vm.startBroadcast(deployerPrivateKey);
1616

17-
result.delegate = new DelegateEnsoShortcuts{salt: "DelegateEnsoShortcuts"}();
17+
result.delegate = new DelegateEnsoShortcuts{ salt: "DelegateEnsoShortcuts" }();
1818

1919
vm.stopBroadcast();
2020
}

0 commit comments

Comments
 (0)