Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 12 additions & 10 deletions deploy.sh → .bash/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,22 @@ fi
if [[ $network_upper == "POLYGON" ]]; then
params+=(--gas-estimate-multiplier 300)
fi
if [ $broadcast == "broadcast" ]; then
if [ "$broadcast" == "broadcast" ]; then
params+=(--broadcast)
if [ -n "$verifier" ]; then
params+=(--verify)
params+=(--verifier "${verifier}")
if [ $verifier == "etherscan" ]; then
params+=(--etherscan-api-key ${!blockscan_key})
elif [ $verifier == "routescan" ]; then
if [ "$verifier" == "etherscan" ]; then
params+=(--etherscan-api-key "${!blockscan_key}")
elif [ "$verifier" == "routescan" ]; then
params+=(--verifier-url "https://api.routescan.io/v2/network/mainnet/evm/80094/etherscan")
params+=(--etherscan-api-key "verifyContract")
elif [ $verifier == "blockscout" ]; then
if [ $network_upper == "INK"]; then
elif [ "$verifier" == "blockscout" ]; then
if [ "$network_upper" == "INK" ]; then
params+=(--verifier-url "https://explorer.inkonchain.com/api")
elif [ $network_upper == "PLUME"]; then
elif [ "$network_upper" == "PLUME" ]; then
params+=(--verifier-url "https://explorer.plume.org/api")
elif [ $network_upper == "KATANA"]; then
elif [ "$network_upper" == "KATANA" ]; then
params+=(--verifier-url "https://explorer.katanarpc.com/api")
else
params+=(--verifier-url "https://${network}.blockscout.com/api")
Expand All @@ -49,5 +49,7 @@ if [ $broadcast == "broadcast" ]; then
params+=(-vvvv)
fi

set -x
forge script script/${script} --private-key $PRIVATE_KEY --rpc-url ${!rpc} "${params[@]}"
{ set +x; } 2>/dev/null

PRIVATE_KEY="$PRIVATE_KEY" \
forge script "script/${script}" --rpc-url "${!rpc}" "${params[@]}"
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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ zkout/

# Dependencies
node_modules/
dependencies/

# Deprecated submodule folder
lib/
Expand Down
1 change: 0 additions & 1 deletion dependencies/@openzeppelin-contracts-5.2.0
Submodule @openzeppelin-contracts-5.2.0 deleted from acd4ff
1 change: 0 additions & 1 deletion dependencies/account-abstraction-v7-0.7.0
Submodule account-abstraction-v7-0.7.0 deleted from 7af70c
1 change: 0 additions & 1 deletion dependencies/devtools-0.0.1
Submodule devtools-0.0.1 deleted from ac8912
1 change: 0 additions & 1 deletion dependencies/enso-weiroll-1.4.1
Submodule enso-weiroll-1.4.1 deleted from 900250
1 change: 0 additions & 1 deletion dependencies/forge-std-1.9.7
Submodule forge-std-1.9.7 deleted from 77041d
1 change: 0 additions & 1 deletion dependencies/layerzero-v2-2.0.2
Submodule layerzero-v2-2.0.2 deleted from 9a4049
1 change: 0 additions & 1 deletion dependencies/safe-smart-account-1.5.0
Submodule safe-smart-account-1.5.0 deleted from dc437e
1 change: 0 additions & 1 deletion dependencies/safe-tools-0.2.0
Submodule safe-tools-0.2.0 deleted from ce6c65
1 change: 0 additions & 1 deletion dependencies/solady-0.1.22
Submodule solady-0.1.22 deleted from 65e87c
1 change: 0 additions & 1 deletion dependencies/v4-core-4.0.0
Submodule v4-core-4.0.0 deleted from e50237
1 change: 0 additions & 1 deletion dependencies/v4-periphery-4.0.0
Submodule v4-periphery-4.0.0 deleted from 9628c3
98 changes: 98 additions & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,114 @@ src = "src"
test = "test"
via_ir = true

[profile.default.fuzz]
max_test_rejects = 1_000_000 # Number of times `vm.assume` can fail
runs = 1_000

[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 +132,8 @@ 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"}
chainlink-evm = { version = "1.5.0", git = "https://github.com/smartcontractkit/chainlink-evm.git", rev = "86aa5a1d34b20eda8d18fe6eb0e4882948e545ba"}
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
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
"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_ccip:unit": "forge test --match-path 'test/unit/concrete/{bridge/ensoCCIPReceiver,libraries/ccipMessageDecoder,fuzz/libraries/ccipMessageDecoder}/*.t.sol'",
"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
10 changes: 9 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,12 @@ 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/
chainlink-evm=dependencies/chainlink-evm-1.5.0/contracts/src/v0.8/
chainlink-evm-1.5.0/=dependencies/chainlink-evm-1.5.0/contracts/src/v0.8/
@chainlink/=dependencies/chainlink-evm-1.5.0/
@openzeppelin/[email protected]/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.

@openzeppelin/[email protected]/utils/introspection/ERC165Checker.sol=dependencies/@openzeppelin-contracts-5.2.0/contracts/utils/introspection/ERC165Checker.sol
@openzeppelin/[email protected]/token/ERC20/utils/SafeERC20.sol=dependencies/@openzeppelin-contracts-5.2.0/contracts/token/ERC20/utils/SafeERC20.sol
@openzeppelin/[email protected]/token/ERC20/IERC20.sol=dependencies/@openzeppelin-contracts-5.2.0/contracts/token/ERC20/IERC20.sol
Loading