Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
5 changes: 5 additions & 0 deletions .bash/forge-fmt.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh
set -e

echo "🔎 Running forge fmt (default profile in foundry.toml)..."
forge fmt
29 changes: 29 additions & 0 deletions .bash/forge-lint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/bin/sh
set -eu

echo "🔎 Running forge lint (default profile in foundry.toml)..."

# Capture BOTH stdout and stderr, but don't fail on forge's exit code
set +e
RAW_OUTPUT="$(forge lint --color never 2>&1)"
set -e

# Show raw linter output (so CI logs display everything)
printf '%s\n' "$RAW_OUTPUT"

# Normalize line endings (remove any CRs from CRLF)
SANITIZED="$(printf '%s\n' "$RAW_OUTPUT" | tr -d '\r')"

# Extract diagnostic lines that start with a severity (allow optional leading spaces),
# and ignore codesize warnings
DIAGNOSTICS="$(printf '%s\n' "$SANITIZED" \
| grep -a -E '^[[:space:]]*(high|med|low|info|gas|warning|note)\[' \
| grep -vF '[codesize]' \
|| true)"

if [ -n "$DIAGNOSTICS" ]; then
echo "❌ Linting failed: either fix or disable [high|med|low|info|gas|warning|note] before committing."
exit 1
fi

echo "✅ Pre-commit checks passed."
57 changes: 49 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: CI
on:
push:
branches:
- "*" # Trigger on any push to any branch
- '*' # Trigger on any push to any branch

pull_request:
branches:
Expand All @@ -24,12 +24,19 @@ env:
ETHEREUM_RPC_URL: ${{ secrets.ETHEREUM_RPC_URL }}
GNOSIS_RPC_URL: ${{ secrets.GNOSIS_RPC_URL }}
HYPER_RPC_URL: ${{ secrets.HYPER_RPC_URL }}
INK_RPC_URL: ${{ secrets.INK_RPC_URL }}
KATANA_RPC_URL: ${{ secrets.KATANA_RPC_URL }}
LINEA_RPC_URL: ${{ secrets.LINEA_RPC_URL }}
OPTIMISM_RPC_URL: ${{ secrets.OPTIMISM_RPC_URL }}
PLASMA_RPC_URL: ${{ secrets.PLASMA_RPC_URL }}
PLUME_RPC_URL: ${{ secrets.PLUME_RPC_URL }}
POLYGON_RPC_URL: ${{ secrets.POLYGON_RPC_URL }}
SONIC_RPC_URL: ${{ secrets.SONIC_RPC_URL }}
SONEIUM_RPC_URL: ${{ secrets.SONEIUM_RPC_URL }}
UNICHAIN_RPC_URL: ${{ secrets.UNICHAIN_RPC_URL }}
WORLD_RPC_URL: ${{ secrets.WORLD_RPC_URL }}
ZKSYNC_RPC_URL: ${{ secrets.ZKSYNC_RPC_URL }}
PLUME_RPC_URL: ${{ secrets.PLUME_RPC_URL }}
SEPOLIA_RPC_URL: ${{ secrets.SEPOLIA_RPC_URL }}

jobs:
check:
Expand All @@ -39,19 +46,53 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4

- name: Install pnpm 10.11.0
uses: pnpm/action-setup@v4
with:
version: 10.11.0

- name: Install Node.js 22.x
uses: actions/setup-node@v3
with:
node-version: 22.x
registry-url: 'https://registry.npmjs.org'

- name: Install Node dependencies
run: |
pnpm install --frozen-lockfile --ignore-scripts
id: pnpm

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: stable

- name: Show Forge version
run: forge --version
run: |
forge --version
id: version

- name: Install Forge dependencies
run: forge soldeer update
run: |
forge soldeer update
id: soldeer

- name: Run Forge fmt
run: |
forge fmt --check
id: fmt

- name: Run Forge lint
run: |
bash .bash/forge-lint.sh
id: lint

- name: Build contracts
run: forge build --sizes
- name: Run Forge build
run: |
forge build --sizes
id: build

- name: Run tests
run: forge test -vvv
- name: Run Forge tests
run: |
forge test -vvv --no-match-test "invariant_.*"
id: test
1 change: 1 addition & 0 deletions dependencies/chainlink-ccip-1.6.2
Submodule chainlink-ccip-1.6.2 added at 0e3e0f
93 changes: 93 additions & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,107 @@ via_ir = true
[fmt]
bracket_spacing = true
contract_new_lines = false
ignore = [
# --- Already audited contracts START ---
'src/bridge/LayerZeroReceiver.sol',
'src/bridge/interfaces/layerzero/IPool.sol',
'src/delegate/DelegateEnsoShortcuts.sol',
'src/delegate/EIP7702EnsoShortcuts.sol',
'src/delegate/EnsoReceiver.sol',
'src/factory/interfaces/IEnsoRouter.sol',
'src/factory/ERC4337CloneFactory.sol',
'src/helpers/BalancerHelpers.sol',
'src/helpers/DecimalHelpers.sol',
'src/helpers/EnsoShortcutsHelpers.sol',
'src/helpers/ERC20Helpers.sol',
'src/helpers/MathHelpers.sol',
'src/helpers/MaverickV2Helpers.sol',
'src/helpers/PercentageMathHelpers.sol',
'src/helpers/SignedMathHelpers.sol',
'src/helpers/SommelierHelpers.sol',
'src/helpers/SwapHelpers.sol',
'src/helpers/TupleHelpers.sol',
'src/helpers/UniswapV4Helpers.sol',
'src/helpers/WeirollVerifier.sol',
'src/interfaces/IEnsoRouter.sol',
'src/libraries/DataTypes.sol',
'src/paymaster/SignaturePaymaster.sol',
'src/router/EnsoRouter.sol',
'src/solvers/BaseSolver.sol',
'src/solvers/BebopSolver.sol',
'src/solvers/MinimalWallet.sol',
'src/utils/Withdrawable.sol',
'src/AbstractEnsoShortcuts.sol',
'src/AbstractMultiSend.sol',
'src/EnsoShortcuts.sol',
# --- Already audited contracts FINISH ---
]
int_types = "long"
line_length = 120
multiline_func_header = "all"
number_underscore = "thousands"
quote_style = "double"
single_line_statement_blocks = "multi"
sort_imports = true
tab_width = 4
wrap_comments = true

[lint]
lint_on_build = false
ignore = [
'script/BaseSolverDeployer.s.sol',
'script/BebopSolverDeployer.s.sol',
'script/ClientDeployer.s.sol',
'script/DelegateDeployer.s.sol',
'script/EIP7702EnsoShortcutsDeployer.s.sol',
'script/ERC20HelpersDeployer.s.sol',
'script/EnsoReceiverAndPaymasterDeployer.s.sol',
'script/EnsoReceiverDeployer.s.sol',
'script/EnsoRouterDeployer.s.sol',
'script/FullDeployer.s.sol',
'script/HelpersDeployer.s.sol',
'script/HyperCoreHelpersDeployer.s.sol',
'script/LayerZeroDeployer.s.sol',
'script/MaverickV2HelpersDeployer.s.sol',
'script/SocketDeployer.s.sol',
'script/SwapHelpersDeployer.s.sol',
'script/UniswapV4Deployer.s.sol',
# --- Already audited contracts START ---
'src/bridge/LayerZeroReceiver.sol',
'src/bridge/interfaces/layerzero/IPool.sol',
'src/delegate/DelegateEnsoShortcuts.sol',
'src/delegate/EIP7702EnsoShortcuts.sol',
'src/delegate/EnsoReceiver.sol',
'src/factory/interfaces/IEnsoRouter.sol',
'src/factory/ERC4337CloneFactory.sol',
'src/helpers/BalancerHelpers.sol',
'src/helpers/DecimalHelpers.sol',
'src/helpers/EnsoShortcutsHelpers.sol',
'src/helpers/ERC20Helpers.sol',
'src/helpers/MathHelpers.sol',
'src/helpers/MaverickV2Helpers.sol',
'src/helpers/PercentageMathHelpers.sol',
'src/helpers/SignedMathHelpers.sol',
'src/helpers/SommelierHelpers.sol',
'src/helpers/SwapHelpers.sol',
'src/helpers/TupleHelpers.sol',
'src/helpers/UniswapV4Helpers.sol',
'src/helpers/WeirollVerifier.sol',
'src/interfaces/IEnsoRouter.sol',
'src/libraries/DataTypes.sol',
'src/paymaster/SignaturePaymaster.sol',
'src/router/EnsoRouter.sol',
'src/solvers/BaseSolver.sol',
'src/solvers/BebopSolver.sol',
'src/solvers/MinimalWallet.sol',
'src/utils/Withdrawable.sol',
'src/AbstractEnsoShortcuts.sol',
'src/AbstractMultiSend.sol',
'src/EnsoShortcuts.sol',
# --- Already audited contracts FINISH ---
'test/**/*.sol',
]

[soldeer]
recursive_deps = true
remappings_generate = false # NB: temporary disabled to avoid compilation issues
Expand All @@ -36,6 +128,7 @@ remappings_location = "txt"

[dependencies]
account-abstraction-v7 = { version = "0.7.0", git = "https://github.com/eth-infinitism/account-abstraction.git", rev = "7af70c8993a6f42973f520ae0752386a5032abe7" }
chainlink-ccip = { version = "1.6.2", git = "https://github.com/smartcontractkit/chainlink-ccip.git", rev = "0e3e0fc5c0f70f0d50dca66b139142ddf3009294"}
devtools = { version = "0.0.1", git = "https://github.com/LayerZero-Labs/devtools.git", rev = "ac8912867862f6dd737b0febabd8d3cb8f142df7" }
enso-weiroll = { version = "1.4.1", git = "https://github.com/EnsoBuild/enso-weiroll.git", rev = "900250114203727ff236d3f6313673c17c2d90dd" }
forge-std = { version = "1.9.7", git = "https://github.com/foundry-rs/forge-std.git", tag = "v1.9.7" }
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
"scripts": {
"foundry:update": "foundryup && forge soldeer update && forge remappings",
"prepare": "husky",
"format": "prettier --check .",
"format:fix": "prettier --write .",
"format:fix:sol": "forge fmt",
"format": "prettier --check . && forge fmt --check",
"format:fix": "prettier --write . && forge fmt",
"lint:fix": "prettier --write . && ./.bash/forge-lint.sh",
"test:enso_checkout:fork": "forge test --match-path 'test/fork/enso-checkout/*.t.sol'",
"test:enso_checkout:unit": "forge test --match-path 'test/unit/concrete/{delegate/ensoReceiver,factory/erc4337CloneFactory,paymaster/signaturePaymaster}/*.t.sol'",
"test:enso_checkout:mutation": "node scripts/runEnsoCheckoutMutationTests.mjs"
Expand Down
4 changes: 3 additions & 1 deletion remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ safe-tools/=dependencies/safe-tools-0.2.0/src/
solady/=dependencies/solady-0.1.22/src/
solmate/=dependencies/solady-0.1.22/lib/solmate/src/
@ensdomains/=dependencies/v4-core-4.0.0/node_modules/@ensdomains/
@openzeppelin/=dependencies/@openzeppelin-contracts-5.2.0/
forge-gas-snapshot/=dependencies/v4-periphery-4.0.0/lib/permit2/lib/forge-gas-snapshot/src/
hardhat/=dependencies/v4-core-4.0.0/node_modules/hardhat/
permit2/=dependencies/v4-periphery-4.0.0/lib/permit2/
Expand All @@ -34,3 +33,6 @@ safe-tools-0.2.0/=dependencies/safe-tools-0.2.0/src/
solady-0.1.22/=dependencies/solady-0.1.22/src/
v4-core-4.0.0/=dependencies/v4-core-4.0.0/src/
v4-periphery-4.0.0/=dependencies/v4-periphery-4.0.0/src/
chainlink-ccip=dependencies/chainlink-ccip-1.6.2/chains/evm/contracts/
chainlink-ccip-1.6.2/=dependencies/chainlink-ccip-1.6.2/chains/evm/contracts/
@openzeppelin/contracts@5.0.2/utils/introspection/IERC165.sol=dependencies/@openzeppelin-contracts-5.2.0/contracts/utils/introspection/IERC165.sol
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@PeterMPhillips this remapping is a bit hacky but I wanted to solve Chainlink CCIPReceiver.sol dependency to OZ 5.0.2 without having to install 5.0.2 (IERC165.sol doesn't change between 5.0.2 and 5.2.0 - what we have installed). No problem installing OZ 5.0.2.

6 changes: 6 additions & 0 deletions soldeer.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ version = "0.7.0"
git = "https://github.com/eth-infinitism/account-abstraction.git"
rev = "7af70c8993a6f42973f520ae0752386a5032abe7"

[[dependencies]]
name = "chainlink-ccip"
version = "1.6.2"
git = "https://github.com/smartcontractkit/chainlink-ccip.git"
rev = "0e3e0fc5c0f70f0d50dca66b139142ddf3009294"

[[dependencies]]
name = "devtools"
version = "0.0.1"
Expand Down
Loading
Loading