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
16 changes: 16 additions & 0 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,3 +108,19 @@ jobs:
name: verification-reports
path: /tmp/euler-verifier/results/
retention-days: 30

- name: Commit reports to verify/
run: |
cp /tmp/euler-verifier/results/*.md verify/ 2>/dev/null || true
rm -f verify/*_test.md

git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"

git add verify/
if git diff --staged --quiet; then
echo "No changes to verification reports"
else
git commit -m "Update verification reports [skip ci]"
git push
fi
51 changes: 51 additions & 0 deletions verify/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Euler Contract Verification Reports

## Production Networks

| Network | Chain ID | Status | Contracts | Notes |
|---------|----------|--------|-----------|-------|
| [Mainnet](mainnet.md) | 1 | ✅ 100% | 26/26 | |
| [Arbitrum](arbitrum.md) | 42161 | ✅ 100% | 26/26 | |
| [Base](base.md) | 8453 | ✅ 100% | 26/26 | |
| [BSC](bsc.md) | 56 | ✅ 100% | 26/26 | |
| [Avalanche](avalanche.md) | 43114 | ✅ 100% | 26/26 | |
| [Linea](linea.md) | 59144 | ⚠️ 96% | 25/26 | eulerEarnFactory: 24KB optimizations |
| [Swell](swell.md) | 1923 | ✅ 100% | 26/26 | |
| [Sonic](sonic.md) | 146 | ✅ 100% | 26/26 | |
| [Bob](bob.md) | 60808 | ✅ 100% | 26/26 | |
| [Berachain](berachain.md) | 80094 | ✅ 100% | 26/26 | |
| [Unichain](unichain.md) | 130 | ✅ 100% | 26/26 | |
| [Monad](monad.md) | 143 | ✅ 100% | 21/21 | |
| [TAC](tac.md) | 239 | ✅ 100% | 26/26 | |
| [Plasma](plasma.md) | 9745 | ⚠️ 27% | 7/26 | Most contracts not verified on explorer |

## Report Structure

Each report contains:

1. **Summary table** — all contracts with address, source repo, deployment commit, evk-periphery ref, and file match count
2. **Changes Since Deployment** — diffs between the deployment commit and current `master`, scoped to only the files that are part of each deployed contract

## Running Verification

```bash
# Verify a single network
uv run python verify.py mainnet

# Verify all production networks
uv run python verify.py --all

# Deep search through git history
uv run python verify.py mainnet --exhaustive

# List available networks
uv run python verify.py --list
```

## Notes

### Linea (96%)
- **eulerEarnFactory**: Deployed with 24KB size optimizations (commented out `setName`/`setSymbol`)

### Plasma (27%)
- Most contracts are not yet verified on the Plasma block explorer
243 changes: 243 additions & 0 deletions verify/arbitrum.md

Large diffs are not rendered by default.

210 changes: 210 additions & 0 deletions verify/avalanche.md

Large diffs are not rendered by default.

280 changes: 280 additions & 0 deletions verify/base.md

Large diffs are not rendered by default.

322 changes: 322 additions & 0 deletions verify/berachain.md

Large diffs are not rendered by default.

355 changes: 355 additions & 0 deletions verify/bob.md

Large diffs are not rendered by default.

210 changes: 210 additions & 0 deletions verify/bsc.md

Large diffs are not rendered by default.

338 changes: 338 additions & 0 deletions verify/linea.md

Large diffs are not rendered by default.

281 changes: 281 additions & 0 deletions verify/mainnet.md

Large diffs are not rendered by default.

195 changes: 195 additions & 0 deletions verify/monad.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
# Monad Contract Verification Report

## Summary

| Status | Count |
|--------|-------|
| ✓ Verified (exact match) | 21 |
| ✗ No exact commit found | 0 |
| ~ Standalone with diff | 0 |
| - Error | 0 |
| **Total** | **21** |

## Verified Contracts

| Contract | Address | Source Repo | Source Commit | evk-periphery | Files |
|----------|---------|-------------|---------------|---------------|-------|
| ✓ adaptiveCurveIRMFactory | [`0x967803d8...`](https://monadvision.com/address/0x967803d884DF006A7150Bc3fCD416b813fbCbF4A) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | [`master`](https://github.com/euler-xyz/evk-periphery) | 6/6 |
| ✓ balanceTracker | [`0xa231DccE...`](https://monadvision.com/address/0xa231DccE58EA5A43E69EF351D89ea4212Ec0f30b) | [reward-streams](https://github.com/euler-xyz/reward-streams) | [`9eb7b8a7`](https://github.com/euler-xyz/reward-streams/tree/9eb7b8a7fa31c275d688063c4abd07165b50b89f) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 17/17 |
| ✓ eulerEarnFactory | [`0xF463d4Ac...`](https://monadvision.com/address/0xF463d4Acb650cc6C4E1D6cD4D0d1b0cb224094cF) | [euler-earn](https://github.com/euler-xyz/euler-earn) | [`master`](https://github.com/euler-xyz/euler-earn/tree/master) | - | 37/37 |
| ✓ eulerEarnPublicAllocator | [`0x65A66F24...`](https://monadvision.com/address/0x65A66F24a25E8CF651C9e31D296623298C80F742) | [euler-earn](https://github.com/euler-xyz/euler-earn) | [`master`](https://github.com/euler-xyz/euler-earn/tree/master) | - | 14/14 |
| ✓ eulerSwapV1Factory | [`0x34f8f028...`](https://monadvision.com/address/0x34f8f028c6a446a464c10a135f44fc6fb2cee1a9) | [euler-swap](https://github.com/euler-xyz/euler-swap) | [`5d270c7`](https://github.com/euler-xyz/euler-swap/tree/5d270c7) | - | 55/55 |
| ✓ eulerSwapV1Implementation | [`0xbfd5c7bb...`](https://monadvision.com/address/0xbfd5c7bb1c208fec761284af7db6ff1f4314372c) | [euler-swap](https://github.com/euler-xyz/euler-swap) | [`5d270c7`](https://github.com/euler-xyz/euler-swap/tree/5d270c7) | - | 46/46 |
| ✓ eulerSwapV1Periphery | [`0xd1f69cf9...`](https://monadvision.com/address/0xd1f69cf959c1a3aae7bee5ec677222d259585b27) | [euler-swap](https://github.com/euler-xyz/euler-swap) | [`98c05c5`](https://github.com/euler-xyz/euler-swap/tree/98c05c5) | - | 9/9 |
| ✓ eulOFTAdapter | [`0x831257BF...`](https://monadvision.com/address/0x831257BFa5478111d2327e08c4068ec37Ac14B81) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`392c7bd0`](https://github.com/euler-xyz/evk-periphery/tree/392c7bd0) | [`392c7bd0`](https://github.com/euler-xyz/evk-periphery/tree/392c7bd0) | 63/63 |
| ✓ eVaultFactory | [`0xba4Dd672...`](https://monadvision.com/address/0xba4Dd672062dE8FeeDb665DD4410658864483f1E) | [euler-vault-kit](https://github.com/euler-xyz/euler-vault-kit) | [`422bf244`](https://github.com/euler-xyz/euler-vault-kit/tree/422bf2447047d32aa9f4e5bab4be16ab3ea67ec2) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 3/3 |
| ✓ eVaultImplementation | [`0xef17750D...`](https://monadvision.com/address/0xef17750D3a162E28a302E266c474ff8989d60ECD) | [euler-vault-kit](https://github.com/euler-xyz/euler-vault-kit) | [`422bf244`](https://github.com/euler-xyz/euler-vault-kit/tree/422bf2447047d32aa9f4e5bab4be16ab3ea67ec2) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 52/52 |
| ✓ evc | [`0x7a9324E8...`](https://monadvision.com/address/0x7a9324E8f270413fa2E458f5831226d99C7477CD) | [ethereum-vault-connector](https://github.com/euler-xyz/ethereum-vault-connector) | [`a7d3c29e`](https://github.com/euler-xyz/ethereum-vault-connector/tree/a7d3c29ef7e4964736e47675e0588630d6afbfd7) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 9/9 |
| ✓ feeFlowController | [`0x9527062A...`](https://monadvision.com/address/0x9527062A472666410DC7193A966709105dF2f147) | [fee-flow](https://github.com/euler-xyz/fee-flow) | [`4a419c94`](https://github.com/euler-xyz/fee-flow/tree/4a419c94e9cd68f65e11f07da9a69f726177cb9c) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 6/6 |
| ✓ fixedCyclicalBinaryIRMFactory | [`0x6F1228b0...`](https://monadvision.com/address/0x6F1228b0A111173Dd3A295D32b5157fA3410de96) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | [`master`](https://github.com/euler-xyz/evk-periphery) | 6/6 |
| ✓ governorAccessControlEmergencyFactory | [`0x21BFce0c...`](https://monadvision.com/address/0x21BFce0c4E9411cd6c7F6D28edC9244f89bFEe63) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | [`master`](https://github.com/euler-xyz/evk-periphery) | 48/48 |
| ✓ kinkIRMFactory | [`0x05Cccb5d...`](https://monadvision.com/address/0x05Cccb5d0f1e1D568804453B82453a719Dc53758) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | [`master`](https://github.com/euler-xyz/evk-periphery) | 6/6 |
| ✓ kinkyIRMFactory | [`0x3512f50B...`](https://monadvision.com/address/0x3512f50B3f0cA8725CcCBb6DDcc7307Ed2c17feb) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | [`master`](https://github.com/euler-xyz/evk-periphery) | 6/6 |
| ✓ oracleRouterFactory | [`0xdDA3cBC1...`](https://monadvision.com/address/0xdDA3cBC18e90606A83FBae6F798991af06dFA902) | [euler-price-oracle](https://github.com/euler-xyz/euler-price-oracle) | [`f52cb43b`](https://github.com/euler-xyz/euler-price-oracle/tree/f52cb43b587c7fa90a7e722d52698003451feb62) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 13/13 |
| ✓ protocolConfig | [`0x94A2d1d1...`](https://monadvision.com/address/0x94A2d1d175F1d828935a374091e2009CF1cED858) | [euler-vault-kit](https://github.com/euler-xyz/euler-vault-kit) | [`422bf244`](https://github.com/euler-xyz/euler-vault-kit/tree/422bf2447047d32aa9f4e5bab4be16ab3ea67ec2) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 2/2 |
| ✓ rEUL | [`0xff074349...`](https://monadvision.com/address/0xff074349C8b89bB7362bD25c58742896D817A862) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | [`master`](https://github.com/euler-xyz/evk-periphery) | 21/21 |
| ✓ sequenceRegistry | [`0x39F81037...`](https://monadvision.com/address/0x39F81037f20AC6068CbCd30f748094c58bfE7d7b) | [euler-vault-kit](https://github.com/euler-xyz/euler-vault-kit) | [`422bf244`](https://github.com/euler-xyz/euler-vault-kit/tree/422bf2447047d32aa9f4e5bab4be16ab3ea67ec2) | [`master`](https://github.com/euler-xyz/evk-periphery/tree/master) | 2/2 |
| ✓ swapVerifier | [`0x65bF068c...`](https://monadvision.com/address/0x65bF068c88e0f006f76b871396B4DB1150dd9EAD) | [evk-periphery](https://github.com/euler-xyz/evk-periphery) | [`2b087370`](https://github.com/euler-xyz/evk-periphery/tree/2b087370) | [`2b087370`](https://github.com/euler-xyz/evk-periphery/tree/2b087370) | 3/3 |


## Changes Since Deployment

This section shows what has changed in the source code between the deployment commit and current `master`.
These diffs help identify any changes made to the codebase after deployment.

### ethereum-vault-connector @ `a7d3c29e`

**Contracts:** evc

- **Deployed from:** [`a7d3c29e`](https://github.com/euler-xyz/ethereum-vault-connector/tree/a7d3c29e)
- **Compare to master:** [`a7d3c29e...master`](https://github.com/euler-xyz/ethereum-vault-connector/compare/a7d3c29e...master)
- **evk-periphery:** [`master`](https://github.com/euler-xyz/evk-periphery/tree/master)

_No diff available - see GitHub compare link above._

### euler-price-oracle @ `f52cb43b`

**Contracts:** oracleRouterFactory

- **Deployed from:** [`f52cb43b`](https://github.com/euler-xyz/euler-price-oracle/tree/f52cb43b)
- **Compare to master:** [`f52cb43b...master`](https://github.com/euler-xyz/euler-price-oracle/compare/f52cb43b...master)
- **evk-periphery:** [`master`](https://github.com/euler-xyz/evk-periphery/tree/master)

_No diff available - see GitHub compare link above._

### euler-vault-kit @ `422bf244`

**Contracts:** eVaultFactory, eVaultImplementation, protocolConfig, sequenceRegistry

- **Deployed from:** [`422bf244`](https://github.com/euler-xyz/euler-vault-kit/tree/422bf244)
- **Compare to master:** [`422bf244...master`](https://github.com/euler-xyz/euler-vault-kit/compare/422bf244...master)
- **evk-periphery:** [`master`](https://github.com/euler-xyz/evk-periphery/tree/master)

_No diff available - see GitHub compare link above._

### evk-periphery @ `2b087370`

**Contracts:** swapVerifier

- **Deployed from:** [`2b087370`](https://github.com/euler-xyz/evk-periphery/tree/2b087370)
- **Compare to master:** [`2b087370...master`](https://github.com/euler-xyz/evk-periphery/compare/2b087370...master)

```diff
diff --git a/src/Swaps/SwapVerifier.sol b/src/Swaps/SwapVerifier.sol
index e4972629..4688cda3 100644
--- a/src/Swaps/SwapVerifier.sol
+++ b/src/Swaps/SwapVerifier.sol
@@ -2,18 +2,27 @@

pragma solidity ^0.8.0;

-import {IEVault, IERC20} from "evk/EVault/IEVault.sol";
+import {IEVault} from "evk/EVault/IEVault.sol";
+import {TransferFromSender} from "./TransferFromSender.sol";
+import {IEVault, IERC4626} from "evk/EVault/IEVault.sol";
+import {SafeERC20, IERC20} from "openzeppelin-contracts/token/ERC20/utils/SafeERC20.sol";

/// @title SwapVerifier
/// @custom:security-contact security@euler.xyz
/// @author Euler Labs (https://www.eulerlabs.com/)
-/// @notice Simple contract used to verify post swap conditions
+/// @notice Simple contract used to verify post swap conditions. Includes TransferFromSender helper for gas savings.
/// @dev This contract is the only trusted code in the EVK swap periphery
-contract SwapVerifier {
+contract SwapVerifier is TransferFromSender {
error SwapVerifier_skimMin();
+ error SwapVerifier_depositMin();
error SwapVerifier_debtMax();
error SwapVerifier_pastDeadline();

+ /// @notice Contract constructor
+ /// @param evc Address of the EthereumVaultConnector contract
+ /// @param permit2 Address of the Permit2 contract
+ constructor(address evc, address permit2) TransferFromSender(evc, permit2) {}
+
/// @notice Verify results of a regular swap, when bought tokens are sent to the vault and skim for the buyer
/// @param vault The EVault to query
/// @param receiver Account to skim to
@@ -23,7 +32,6 @@ contract SwapVerifier {
/// @dev Calling this function is then necessary to perform slippage check and claim the output for the buyer
function verifyAmountMinAndSkim(address vault, address receiver, uint256 amountMin, uint256 deadline) external {
if (deadline < block.timestamp) revert SwapVerifier_pastDeadline();
- if (amountMin == 0) return;

uint256 cash = IEVault(vault).cash();
uint256 balance = IERC20(IEVault(vault).asset()).balanceOf(vault);
@@ -35,6 +43,25 @@ contract SwapVerifier {
IEVault(vault).skim(type(uint256).max, receiver);
}

+ /// @notice Verify results of a regular swap, when bought tokens are sent to the verifier, and deposit for the buyer
+ /// @param vault The ERC4626 vault to deposit to
+ /// @param receiver Account to deposit for
+ /// @param amountMin Minimum amount of assets that should be available for deposit
+ /// @param deadline Timestamp after which the swap transaction is outdated
+ /// @dev Swapper contract will send bought assets to the verifier in certain situations.
+ /// @dev Calling this function is then necessary to perform slippage check and claim the output for the buyer
+ function verifyAmountMinAndDeposit(address vault, address receiver, uint256 amountMin, uint256 deadline) external {
+ if (deadline < block.timestamp) revert SwapVerifier_pastDeadline();
+
+ IERC20 asset = IERC20(IERC4626(vault).asset());
+ uint256 balance = asset.balanceOf(address(this));
+
+ if (balance < amountMin) revert SwapVerifier_depositMin();
+
+ SafeERC20.forceApprove(asset, vault, balance);
+ IERC4626(vault).deposit(balance, receiver);
+ }
+
/// @notice Verify results of a swap and repay operation, when debt is repaid down to a requested target
/// @param vault The EVault to query
/// @param account User account to query
```

### evk-periphery @ `392c7bd0`

**Contracts:** eulOFTAdapter

- **Deployed from:** [`392c7bd0`](https://github.com/euler-xyz/evk-periphery/tree/392c7bd0)
- **Compare to master:** [`392c7bd0...master`](https://github.com/euler-xyz/evk-periphery/compare/392c7bd0...master)

```diff
diff --git a/src/ERC20/deployed/ERC20BurnableMintable.sol b/src/ERC20/deployed/ERC20BurnableMintable.sol
index 82413624..19bb8e81 100644
--- a/src/ERC20/deployed/ERC20BurnableMintable.sol
+++ b/src/ERC20/deployed/ERC20BurnableMintable.sol
@@ -45,7 +45,7 @@ contract ERC20BurnableMintable is AccessControlEnumerable, ERC20Burnable, ERC20P
/// @notice Mints new tokens and assigns them to an account
/// @param _account The address that will receive the minted tokens
/// @param _amount The amount of tokens to mint
- function mint(address _account, uint256 _amount) external onlyRole(MINTER_ROLE) {
+ function mint(address _account, uint256 _amount) external virtual onlyRole(MINTER_ROLE) {
_mint(_account, _amount);
}
```

### fee-flow @ `4a419c94`

**Contracts:** feeFlowController

- **Deployed from:** [`4a419c94`](https://github.com/euler-xyz/fee-flow/tree/4a419c94)
- **Compare to master:** [`4a419c94...master`](https://github.com/euler-xyz/fee-flow/compare/4a419c94...master)
- **evk-periphery:** [`master`](https://github.com/euler-xyz/evk-periphery/tree/master)

_No diff available - see GitHub compare link above._

### reward-streams @ `9eb7b8a7`

**Contracts:** balanceTracker

- **Deployed from:** [`9eb7b8a7`](https://github.com/euler-xyz/reward-streams/tree/9eb7b8a7)
- **Compare to master:** [`9eb7b8a7...master`](https://github.com/euler-xyz/reward-streams/compare/9eb7b8a7...master)
- **evk-periphery:** [`master`](https://github.com/euler-xyz/evk-periphery/tree/master)

_No diff available - see GitHub compare link above._

Loading