diff --git a/.claude/skills/debug-diff/SKILL.md b/.claude/skills/debug-diff/SKILL.md index e9cd847..b59a2b6 100644 --- a/.claude/skills/debug-diff/SKILL.md +++ b/.claude/skills/debug-diff/SKILL.md @@ -41,7 +41,7 @@ ls digest//diffs// - Missing or wrong constructor arguments -- see `constructor_calldata` or `constructor_args` under the `bytecode_comparison` config key - Missing libraries -- check if the contract uses external libraries that need addresses in `bytecode_comparison.libraries` - Wrong EVM version -- the explorer may report a different version than expected -- Immutable variables -- `deep_match_bytecode()` in `diffyscan/utils/binary_verifier.py` compares instruction-by-instruction and tolerates differences that fall within known immutable reference regions. If all diffs are in immutable positions it logs a warning and returns `False` (still reported as a non-match — use `--allow-bytecode-diff 0xAddr` to accept). Differences outside immutable regions raise `BinVerifierError` +- Immutable variables -- `deep_match_bytecode()` in `diffyscan/utils/binary_verifier.py` compares instruction-by-instruction and tolerates differences that fall within known immutable reference regions. If all diffs are in immutable positions it logs a warning and returns `False` (still reported as a non-match — use `--allow-bytecode-diff 0xAddr` to accept). Differences outside immutable regions raise `BinVerifierError`, which `process_config` catches and records as a non-match (`match=False`) — it does not abort the run - Optimizer settings mismatch -- the solcInput from the explorer includes optimizer settings; the GitHub recompilation must match - Flat-source contracts -- see **Known limitations** section below @@ -68,8 +68,13 @@ ls digest//diffs// | `"Failed to infer source path for library '...' from explorer metadata"` | Add library addresses to `bytecode_comparison.libraries` keyed by `"path/to/File.sol": {"LibName": "0xAddr"}` | | All files show diffs | Wrong `commit` or `relative_root` in `github_repo` | | Single contract fails | May need a per-contract `constructor_calldata` or `constructor_args` entry | -| `"Bytecodes have differences not on the immutable reference position"` | Real bytecode mismatch -- check compiler version, optimizer settings, EVM version, and library addresses | +| `"Failed in binary comparison: Bytecodes have differences not on the immutable reference position"` | Real bytecode mismatch -- check compiler version, optimizer settings, EVM version, and library addresses | | `"Exiting with non-zero code due to unallowed diffs"` | Either fix the diffs or use `--allow-source-diff 0xAddr` / `--allow-bytecode-diff 0xAddr` for known acceptable diffs | +| `"Contract name in config does not match with blockchain explorer ... !="` | Contract not verified on explorer — comment it out or verify it on the explorer first | +| `"Failed to get calldata: Explorer metadata has empty constructor calldata for 0x..."` | Factory-created contract — Etherscan has no constructor args. Add `constructor_calldata` manually (extract via `getsourcecode` API `ConstructorArguments`, `debug_traceTransaction` trace, or cross-chain reuse) | +| `"HTTP error: 404 ... contents/.sol"` | Missing or wrong `dependencies` entry — the explorer source uses a path prefix not covered by config dependencies. Add a mapping for that prefix | +| `"err: intrinsic gas too low"` | Chain gas model needs a higher deployment gas cap (known on Mantle) — set `deployment_gas_limit` in the config (e.g. `30000000000`) | +| All proxy bytecode diffs say "immutable reference position" | Normal for TransparentUpgradeableProxy — ProxyAdmin address baked in as immutable. Use `--allow-bytecode-diff` or accept as expected | ### 4. Suggest a re-run command After fixing, suggest: diff --git a/.claude/skills/new-config/SKILL.md b/.claude/skills/new-config/SKILL.md index e22b6d5..9b26d7b 100644 --- a/.claude/skills/new-config/SKILL.md +++ b/.claude/skills/new-config/SKILL.md @@ -51,8 +51,10 @@ YAML gotcha: addresses and hex strings MUST be quoted (`"0xabc..."`) — unquote - `constructor_args` — typed args per address: `{"0xAddr": ["0xarg1", true, 42]}` - `libraries` — per source path: `{"contracts/lib/Foo.sol": {"Foo": "0xLibAddr"}}` - `hardhat_config_name` — (deprecated) name of a hardhat config file -- `fail_on_bytecode_comparison_error` — set to `true` for strict mode +- `fail_on_bytecode_comparison_error` — defaults to `true`; when `false`, a per-contract exception (e.g. failing to fetch/verify a contract from the explorer) is logged and the run continues instead of aborting. Despite the name, an actual error inside `run_bytecode_diff` is always caught and recorded as a mismatch (`match=False`) regardless of this flag. - `source_comparison` — set to `false` to skip source diffs (bytecode-only check) +- `rpc_url_env_var` — name of the env var holding the RPC URL for bytecode comparison (defaults to `REMOTE_RPC_URL`; e.g. `MANTLE_RPC_URL`, `PLASMA_RPC_URL`) +- `deployment_gas_limit` — optional gas limit for the `eth_call` deployment simulation (helps on chains where the default reverts with "intrinsic gas too low") - `explorer_hostname_env_var` — config convention for external CI/tooling to pass the explorer hostname via env var (used for soneium, unichain). Note: diffyscan itself does NOT resolve this at runtime — `get_explorer_hostname()` only reads `explorer_hostname`. External scripts must set `explorer_hostname` before invoking diffyscan. - `audit_url` — optional link to an audit report for documentation purposes - `metadata` — optional object for deployment metadata (e.g. `chain_name`, `deployment_date`, `timelock_address`, `timelock_requirements`) @@ -119,9 +121,46 @@ Save configs to `config_samples///` following existing naming co - **Include `audit_url`** — link to the relevant audit report when available for cross-reference - **Keep configs strict** — prefer explicit over implicit; include all fields even if optional, so verification is as thorough as possible +## Extracting proxy constructor calldata + +Factory-created proxies (e.g. TransparentUpgradeableProxy) often need `constructor_calldata` for bytecode comparison. Three methods, in order of preference: + +**Method 1: Etherscan v2 API** (preferred) +```bash +curl -s "https://api.etherscan.io/v2/api?chainid=&module=contract&action=getsourcecode&address=&apikey=" \ + | python3 -c "import sys,json; print(json.load(sys.stdin)['result'][0].get('ConstructorArguments',''))" +``` +Factory-created contracts sometimes return empty — fall through to Method 2. + +**Method 2: debug_traceTransaction** (when Etherscan has empty args) +1. Get creation tx hash via `getcontractcreation` API +2. Trace with `{"tracer": "callTracer"}` to find CREATE/CREATE2 opcodes +3. Constructor args are appended to initcode in the CREATE2 input. Find the implementation address (padded to 32 bytes) in the hex input — everything from that point on is the constructor args. +4. Alternatively, if you know the exact initcode size (e.g. from a reference deployment on another chain), slice at that offset. + +**Method 3: Cross-chain reuse** (when traces unavailable) +CREATE2 with same factory + same init code + same salt = same address on every chain. If a proxy has the same address on two chains, its constructor calldata is identical. Copy from the chain where you already have it. + +### Verifying proxy implementations +Always verify implementations on-chain before writing the config: +```bash +cast implementation --rpc-url +``` + +### Chain-specific RPC limitations +- Some chains (Arbitrum, Mantle) do NOT support `debug_traceTransaction` on public RPCs — use Etherscan API or cross-chain reuse instead. +- Mantle's gas model causes `eth_call` to fail with "intrinsic gas too low" for large deployment simulations — use `--skip-binary-comparison`. +- Unverified contracts on a chain's explorer should be commented out in the config. + +### Dependencies: matching explorer source paths +If diffyscan fails with 404 fetching a GitHub file, the explorer source uses a path prefix that isn't covered by `dependencies`. Each key in `dependencies` maps a source path prefix → a GitHub repo. Check the explorer source file paths and add the missing prefix mapping. + ## Workflow 1. Gather required info from user (ask for missing pieces) 2. Look at existing configs in the same chain directory for reference patterns -3. Create the config file -4. Suggest running: `uv run diffyscan --yes --cache-explorer --cache-github` +3. Verify implementations on-chain with `cast implementation` +4. Extract constructor calldata (Etherscan API → trace → cross-chain reuse) +5. Create the config file with all needed dependencies +6. Run: `uv run diffyscan --yes --cache-explorer --cache-github` +7. Expected: source diffs = 0; bytecode diffs on proxies (immutable reference) is normal diff --git a/.env.example b/.env.example index 61a972d..50df99a 100644 --- a/.env.example +++ b/.env.example @@ -4,17 +4,14 @@ GITHUB_API_TOKEN=github_pat_xxx # Explorer API tokens (set the ones you need for your target chains) ETHERSCAN_TOKEN= ETHERSCAN_EXPLORER_TOKEN= -BSCSCAN_TOKEN= -OPTISCAN_EXPLORER_TOKEN= -LINEA_EXPLORER_TOKEN= -INK_API_KEY= -MEGAETH_API_KEY= -PLASMA_API_KEY= # Explorer hostnames (used when hostname is not hardcoded in config) L1_EXPLORER_API_HOSTNAME= L2_EXPLORER_API_HOSTNAME= # RPC URLs (required for bytecode comparison) -LOCAL_RPC_URL=http://127.0.0.1:7545 -REMOTE_RPC_URL= +REMOTE_RPC_URL=https://eth.drpc.org +ETHEREUM_RPC_URL=https://eth.drpc.org +MANTLE_RPC_URL=https://rpc.mantle.xyz +PLASMA_RPC_URL=https://rpc.plasma.to +BASE_RPC_URL=https://base.drpc.org diff --git a/CLAUDE.md b/CLAUDE.md index 9c255f8..c6acc96 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Diffyscan verifies deployed EVM smart contracts match their GitHub source by: 1. Fetching verified source from blockchain explorers (Etherscan, Blockscout, zkSync, Mantle) -2. Diffing against GitHub repo sources (HTML diff reports saved to `digest/`) +2. Diffing against GitHub repo sources (HTML diff reports saved under `digest//diffs/`) 3. Optionally recompiling from GitHub and comparing bytecode against on-chain bytecode, handling constructor args, libraries, and immutable references ## Commands diff --git a/README.md b/README.md index 2a33c57..6970e17 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,13 @@ diffyscan /path/to/config.json diffyscan /path/to/config.yaml ``` +To check only specific contracts (can be passed multiple times): + +```bash +diffyscan /path/to/config.json -C 0xContractAddress +diffyscan /path/to/config.json -C 0xFirst -C 0xSecond +``` + To skip binary comparison (which is enabled by default): ```bash diff --git a/config_samples/base/mainnet/meta/meta_core_config.yaml b/config_samples/base/mainnet/meta/meta_core_config.yaml new file mode 100644 index 0000000..838e446 --- /dev/null +++ b/config_samples/base/mainnet/meta/meta_core_config.yaml @@ -0,0 +1,135 @@ +# Core implementations and factories — Base deployment +# + +contracts: + # Factory + "0x00000000741292C88f9fF5050b07051C4f592EBf": TransparentUpgradeableProxy + "0x0000000072BAfCeAff1AD0237Ea58f06cfc4467F": Factory + + # Consensus + "0xAfef40968b5304135677f0C89203948e1A145105": TransparentUpgradeableProxy + "0x000000007e6b679B9196a1609e5Bc2405eDFd6Aa": Consensus + + # DepositQueue + "0xF429ba2a8437E7de85078CF7481E8Ad52df7E58c": TransparentUpgradeableProxy + "0x00000000B2d2373aAF1C370cFE4e1Ee8BDE7C546": DepositQueue + "0x000000001CC8c3E40856E956db870095EF6C98bd": SyncDepositQueue + "0x000000000Af33501e5BDAF9B481Ad2712a024727": SignatureDepositQueue + + # FeeManager + "0x52d56c20B0C8d403888880d0A1610e5ed17addA8": TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": FeeManager + + # Oracle + "0x727c295b5D99b15280Ca8736b6F97ABA6aEd0E88": TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": Oracle + + # RedeemQueue + "0xe08dc488bD6756323F8bf478869529D03db627ef": TransparentUpgradeableProxy + "0x0000000045d70ee8145135f08309fF5B1A63d43F": RedeemQueue + "0x000000008D14Ef3658805765107d9F12776f4138": SignatureRedeemQueue + + # RiskManager + "0x9885215ef8DB25C87466E73018061e532784D716": TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": RiskManager + + # ShareManager + "0xDA2a7aE07B6803feF9d95E47Ab83c8a5A09929F0": TransparentUpgradeableProxy + "0x00000000861e8B90B81f35C18cA14858Cc91d1Df": TokenizedShareManager + "0x00000000e5F0cddA56447b2a29e2847A52c8725D": BasicShareManager + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": BurnableTokenizedShareManager + + # Subvault + "0xA64e324DFF04e3C0613ff0706867868C7b370a45": TransparentUpgradeableProxy + "0x00000000CA30010B8417f791250AE221FdaD5920": Subvault + + # Verifier + "0x9fBAF5AEB9F52bA57E1cC1D3050eac6d75Df8ae7": TransparentUpgradeableProxy + "0x000000007e86a96e279662108cc19bA4c32EdE3C": Verifier + + # Vault + "0xBBCD2aC50aF2EA12Cc9cb7B16dBDa85859BeB3da": TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": Vault + + # SwapModule + "0xC5a52E4bB718Dfe86938e5cB967362EdA1E62698": TransparentUpgradeableProxy + "0x0000000022B540Fe06d7a9c32d81163971b583D6": SwapModule + + "0x0000000009E9368ad21fc19DCE1cFcf9Af6dE339": BitmaskVerifier + + # ERC20Verifier + "0x711F6236e325634AA8c1F692b5312bfF3A8558D0": TransparentUpgradeableProxy + "0x00000000ACD80376E999Af8c424e5e33BD224A08": ERC20Verifier + + "0x0000000005a67199ABE0f9C995EAB9DaDfA31Ccd": VaultConfigurator + + # Hooks + "0x00000000176dD23550c3845746b2036E90DC5912": BasicRedeemHook + "0x0000000024ABbd08686Abb2987831dEa88eF1180": RedirectingDepositHook + + "0x000000007d2552AD746Af5c13f91B5e72f97c2B7": OracleHelper + + # MellowAccount + "0x870DB41df0905cc5a790f6582a3dA99A4A33F923": TransparentUpgradeableProxy + "0x00000000860913f37fab81ce8ce4E5BD1f664482": MellowAccountV1 + +rpc_url_env_var: BASE_RPC_URL +explorer_hostname: api.etherscan.io +explorer_token_env_var: ETHERSCAN_EXPLORER_TOKEN +explorer_chain_id: 8453 + +github_repo: + url: https://github.com/mellow-finance/flexible-vaults + commit: c9c71818f0a8bead183f9860db3b8bbceb7b8f37 + relative_root: "" + +dependencies: + lib/contracts: + url: https://github.com/cowprotocol/contracts + commit: c94c595a791681cf8ba7495117dcde397b932885 + relative_root: "" + lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts + commit: e4f70216d759d8e6a64144a9e1f7bbeed78e7079 + relative_root: contracts + # version 5.3.0 + lib/openzeppelin-contracts-upgradeable/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable + commit: 60b305a8f3ff0c7688f02ac470417b6bbf1c4d27 + relative_root: contracts + # version 5.3.0 + +bytecode_comparison: + constructor_calldata: + "0x00000000741292C88f9fF5050b07051C4f592EBf": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000072BAfCeAff1AD0237Ea58f06cfc4467F": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Factory + "0xAfef40968b5304135677f0C89203948e1A145105": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000007e6b679B9196a1609e5Bc2405eDFd6Aa": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Consensus + "0xF429ba2a8437E7de85078CF7481E8Ad52df7E58c": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000B2d2373aAF1C370cFE4e1Ee8BDE7C546": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # DepositQueue + "0x000000000Af33501e5BDAF9B481Ad2712a024727": "00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000afef40968b5304135677f0c89203948e1a14510500000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SignatureDepositQueue + "0x52d56c20B0C8d403888880d0A1610e5ed17addA8": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # FeeManager + "0x727c295b5D99b15280Ca8736b6F97ABA6aEd0E88": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Oracle + "0xe08dc488bD6756323F8bf478869529D03db627ef": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000045d70ee8145135f08309fF5B1A63d43F": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RedeemQueue + "0x000000008D14Ef3658805765107d9F12776f4138": "00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000afef40968b5304135677f0c89203948e1a14510500000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SignatureRedeemQueue + "0x9885215ef8DB25C87466E73018061e532784D716": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RiskManager + "0xDA2a7aE07B6803feF9d95E47Ab83c8a5A09929F0": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000861e8B90B81f35C18cA14858Cc91d1Df": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # TokenizedShareManager + "0x00000000e5F0cddA56447b2a29e2847A52c8725D": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BasicShareManager + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BurnableTokenizedShareManager + "0xA64e324DFF04e3C0613ff0706867868C7b370a45": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000CA30010B8417f791250AE221FdaD5920": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Subvault + "0x9fBAF5AEB9F52bA57E1cC1D3050eac6d75Df8ae7": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000007e86a96e279662108cc19bA4c32EdE3C": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Verifier + "0xBBCD2aC50aF2EA12Cc9cb7B16dBDa85859BeB3da": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": "00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f429ba2a8437e7de85078cf7481e8ad52df7e58c000000000000000000000000e08dc488bd6756323f8bf478869529d03db627ef000000000000000000000000a64e324dff04e3c0613ff0706867868c7b370a450000000000000000000000009fbaf5aeb9f52ba57e1cc1d3050eac6d75df8ae700000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Vault + "0xC5a52E4bB718Dfe86938e5cB967362EdA1E62698": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x711F6236e325634AA8c1F692b5312bfF3A8558D0": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000ACD80376E999Af8c424e5e33BD224A08": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # ERC20Verifier + "0x0000000005a67199ABE0f9C995EAB9DaDfA31Ccd": "000000000000000000000000da2a7ae07b6803fef9d95e47ab83c8a5a09929f000000000000000000000000052d56c20b0c8d403888880d0a1610e5ed17adda80000000000000000000000009885215ef8db25c87466e73018061e532784d716000000000000000000000000727c295b5d99b15280ca8736b6f97aba6aed0e88000000000000000000000000bbcd2ac50af2ea12cc9cb7b16dbda85859beb3da" # VaultConfigurator + "0x870DB41df0905cc5a790f6582a3dA99A4A33F923": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000001CC8c3E40856E956db870095EF6C98bd": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SyncDepositQueue diff --git a/config_samples/base/meta/meta_usdc_base_config.yaml b/config_samples/base/mainnet/meta/meta_usdc_base_config.yaml similarity index 99% rename from config_samples/base/meta/meta_usdc_base_config.yaml rename to config_samples/base/mainnet/meta/meta_usdc_base_config.yaml index 85ee9bf..cf3772d 100644 --- a/config_samples/base/meta/meta_usdc_base_config.yaml +++ b/config_samples/base/mainnet/meta/meta_usdc_base_config.yaml @@ -43,6 +43,7 @@ contracts: "0x0555306F5063f62a3A7896A9eaBA0754c1185a67": TimelockController "0x8A6a1648A39C7F3dE64282e8bF2fcD783CCF08b0": OracleSubmitter +rpc_url_env_var: BASE_RPC_URL explorer_hostname: api.etherscan.io explorer_token_env_var: ETHERSCAN_EXPLORER_TOKEN explorer_chain_id: 8453 diff --git a/config_samples/ethereum/mainnet/meta/meta_core_config.yaml b/config_samples/ethereum/mainnet/meta/meta_core_config.yaml index ac05087..d06ba5d 100644 --- a/config_samples/ethereum/mainnet/meta/meta_core_config.yaml +++ b/config_samples/ethereum/mainnet/meta/meta_core_config.yaml @@ -138,3 +138,12 @@ bytecode_comparison: "0x000000028be48f9E62E13403480B60C4822C5aa5": "000000000000000000000000952f39aa62e94db3ad0d1c7d1e43c1a8519e45d8000000000000000000000000f7223356819ea48f25880b6c2ab3e907cc336d45000000000000000000000000a51e4fa916b939fa451520d2b7600c740d86e5a00000000000000000000000000cdff250c7a071fdc72340d820c5c8e29507aaad0000000000000000000000004e38f679e46b3216f0bd4b314e9c429affb1dee3" # VaultConfigurator "0x000000065d1A7bD71f52886910aaBE6555b7317c": "0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000004d3b17e5391eb571ddb8fdf95646ca827" # LidoDepositHook "0xCa027f59521E808EFdaF6f338D4269833451118A": "0000000000000000000000000000000397b71c8f3182fd40d247330d218fdc7200000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + # Core implementations with constructor args (calldata mirrors meta_usd shared implementations) + "0x0000000615B2771511dAa693aC07BE5622869E01": "00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bb92a7b9695750e1234bab18f83b73686dd09854000000000000000000000000fe76b5fd238553d65ce6dd0a572c0fda629f842100000000000000000000000075fe0d73d3c64cdc1c6449d9f977be6857c4d01100000000000000000000000004b30b1e98950e6a13550d84e991be0d734c2c6100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Vault + "0x00000006dA9f179BFE250Dd1c51cD2d3581930c8": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # DepositQueue + "0x0000000F0d3D1c31b72368366A4049C05E291D58": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Oracle + "0x0000000E8eb7173fA1a3ba60eCA325bcB6aaf378": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # TokenizedShareManager + "0x0000000dE74e5D51651326E0A3e1ACA94bEAF6E1": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # FeeManager + "0x0000000714cf2851baC1AE2f41871862e9D216fD": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RiskManager + "0x0000000E535B4E063f8372933A55470e67910a66": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Subvault + "0x000000047Fc878662006E78D5174FB4285637966": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Verifier diff --git a/config_samples/ethereum/mainnet/meta/meta_usd_config.yaml b/config_samples/ethereum/mainnet/meta/meta_usd_config.yaml index f2a5efc..f4979e8 100644 --- a/config_samples/ethereum/mainnet/meta/meta_usd_config.yaml +++ b/config_samples/ethereum/mainnet/meta/meta_usd_config.yaml @@ -33,6 +33,22 @@ contracts: "0xD0e9094E7E26ff133C349ACd9993743DCc15cA5c": TimelockController "0x03852b7138c6704F8F46e87768399616D31Cf733": OracleSubmitter + # earnUSDe (Experimental) + "0x0cC65147BF7F615A8dD9E78e2c53158F8E01754d": TransparentUpgradeableProxy # Vault + "0xC99DaA2dC366cFd115130a0b7D21Df01CB5FcF7b": TransparentUpgradeableProxy # SwapModule 0 + "0x31B7d5A2B1CE1871Dd642F6aeCC0Ef68d126B95A": TransparentUpgradeableProxy # Subvault 0 + "0x87631dbf0224234107B593c874f63f577e1336Da": TransparentUpgradeableProxy # Verifier 0 + "0xBb647898e0CF0aE81Ac480d04A8a9973763eBD2D": TransparentUpgradeableProxy # SyncDepositQueue (USDC) + "0x8B857170F2a6C10Ce64ec8b920428ca977fb7710": TransparentUpgradeableProxy # RedeemQueue (USDC) + "0xa01aEfeC7A3384C8440e99084458030BDbdD7404": TransparentUpgradeableProxy # SyncDepositQueue (USDT) + "0xAcb2E510e8FcdaB3808cC5B9d206374cAB527947": TransparentUpgradeableProxy # SyncDepositQueue (USDe) + "0xBcdFaf92783B2C391A1c80682e75Bb6EF47B9c3C": TransparentUpgradeableProxy # Oracle + "0x3D561e1E0204d47b45C23B65356a4536c36d1AF6": TransparentUpgradeableProxy # ShareManager + "0xE90b8D7DfFB816b2895DE67307b4A8f9061CEF52": TransparentUpgradeableProxy # FeeManager + "0x5D7e237BD77d3671fFb33FC9bC8c37d49aAE6153": TransparentUpgradeableProxy # RiskManager + "0x7589b8645F61F151D6c28Eaf8cE2fD9F23E09AbF": TimelockController + "0xDa5508789B5f93fb49b644c87Ef9D8CddB699d59": OracleSubmitter + # Shared implementations "0x0000000615B2771511dAa693aC07BE5622869E01": Vault "0x00000006dA9f179BFE250Dd1c51cD2d3581930c8": DepositQueue @@ -70,6 +86,12 @@ dependencies: url: https://github.com/cowprotocol/contracts commit: c94c595a791681cf8ba7495117dcde397b932885 relative_root: src/contracts + lib/aave-v3-core: + url: https://github.com/aave/aave-v3-core + commit: b74526a7bc67a3a117a1963fc871b3eb8cea8435 + relative_root: "" + # version v1.19.4 + # Audits: https://github.com/aave/aave-v3-core/tree/master/audits bytecode_comparison: constructor_calldata: @@ -114,3 +136,19 @@ bytecode_comparison: "0x0000000E535B4E063f8372933A55470e67910a66": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Subvault "0x000000047Fc878662006E78D5174FB4285637966": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Verifier "0x00000000d681E85e5783588f87A9573Cb97Eda01": "00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe0110000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SwapModule + # earnUSDe proxies — Etherscan reports empty ctor args (CREATE2); args taken from creation bytecode tail + "0x0cC65147BF7F615A8dD9E78e2c53158F8E01754d": "0000000000000000000000000000000615b2771511daa693ac07be5622869e0100000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000644439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e0000000000000000000000003d561e1e0204d47b45c23b65356a4536c36d1af6000000000000000000000000e90b8d7dffb816b2895de67307b4a8f9061cef520000000000000000000000005d7e237bd77d3671ffb33fc9bc8c37d49aae6153000000000000000000000000bcdfaf92783b2c391a1c80682e75bb6ef47b9c3c00000000000000000000000000000004d3b17e5391eb571ddb8fdf95646ca8270000000000000000000000000000000637f1b1ccda4af2db6cddf5e5ec45fd930000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000132b2a32ecca586a148d15aea321ddbb421a2a3ac6b4d56c0a9ad9de32e84cf5c4000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10253eb39d0edc77da10bbc4bcaa23c44e40e3c67ed649fbecb18a3f7c51bfbb10000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef104a899e3e648ea55418d9c99177e5c522df621b1953c0ad7e99da3711043ba1c1000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef1094b8a54d503c6b752e707c591f9345ae8ccc138255588e460ee15622d499fdba000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10a7ecfd54b0ab6ce6ecc88746fe62beba4e9a103dbb00d88cfedffbc0c6069ce8000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10877766a829235d063c3ba37802a4874fcf1b575d310fbe898df17d8ebabee4630000000000000000000000009745f161b0160a99924845befce1d7b9daee689968895691ff006f290ca74825ce06ed17fffab55af49f0274f49b7424f752583a0000000000000000000000009745f161b0160a99924845befce1d7b9daee689932a781031f04cc60b32394e40124d1e87f54273bf26d0532a115a424f6a932980000000000000000000000009745f161b0160a99924845befce1d7b9daee689978b235a1fa2fd5e00dba7867d599bed6f088684010a7fee7b9fe05fa1082d01e0000000000000000000000007589b8645f61f151d6c28eaf8ce2fd9f23e09abffc199f685d023b44b528c5fcb9cebfe292e64340dd5729b20761da4ad1e930240000000000000000000000007589b8645f61f151d6c28eaf8ce2fd9f23e09abf6618a6d92147bbcacfb2ef2375976fc4c529eeeaeb72a66048296571370c69460000000000000000000000007589b8645f61f151d6c28eaf8ce2fd9f23e09abf78b235a1fa2fd5e00dba7867d599bed6f088684010a7fee7b9fe05fa1082d01e000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a358258f737b9cea9d7da81a3a12943f800a9668a2494235fec0d84cc60ad04cff000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a36788636e7899d6d227901dc9f8c4c785401c0991724cf908dc65388af686da6f000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a385c2023fdfb1e93dedf5d18f9bc0e79347e071d12740ba71aeb84a4fcbdc4b79000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3fc199f685d023b44b528c5fcb9cebfe292e64340dd5729b20761da4ad1e93024000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a34a899e3e648ea55418d9c99177e5c522df621b1953c0ad7e99da3711043ba1c1000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3253eb39d0edc77da10bbc4bcaa23c44e40e3c67ed649fbecb18a3f7c51bfbb10000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # Vault + "0x31B7d5A2B1CE1871Dd642F6aeCC0Ef68d126B95A": "0000000000000000000000000000000e535b4e063f8372933a55470e67910a6600000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab910000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000087631dbf0224234107b593c874f63f577e1336da0000000000000000000000000cc65147bf7f615a8dd9e78e2c53158f8e01754d00000000000000000000000000000000000000000000000000000000" # Subvault 0 + "0x87631dbf0224234107B593c874f63f577e1336Da": "000000000000000000000000000000047fc878662006e78d5174fb428563796600000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000cc65147bf7f615a8dd9e78e2c53158f8e01754d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # Verifier 0 + "0xBb647898e0CF0aE81Ac480d04A8a9973763eBD2D": "000000000000000000000000000000000b98f77a017b5d3468400c5c597a3bde00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000cc65147bf7f615a8dd9e78e2c53158f8e01754d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000" # SyncDepositQueue (USDC) + "0x8B857170F2a6C10Ce64ec8b920428ca977fb7710": "000000000000000000000000000000000c139266ba06170ed1deaca6d11903c100000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c4439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000cc65147bf7f615a8dd9e78e2c53158f8e01754d0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # RedeemQueue (USDC) + "0xa01aEfeC7A3384C8440e99084458030BDbdD7404": "000000000000000000000000000000000b98f77a017b5d3468400c5c597a3bde00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000cc65147bf7f615a8dd9e78e2c53158f8e01754d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000" # SyncDepositQueue (USDT) + "0xAcb2E510e8FcdaB3808cC5B9d206374cAB527947": "000000000000000000000000000000000b98f77a017b5d3468400c5c597a3bde00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b30000000000000000000000000cc65147bf7f615a8dd9e78e2c53158f8e01754d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000" # SyncDepositQueue (USDe) + "0xBcdFaf92783B2C391A1c80682e75Bb6EF47B9c3C": "0000000000000000000000000000000f0d3d1c31b72368366a4049c05e291d5800000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c4439fab910000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000001027e72f1f128130880000000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000119400000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000002a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b300000000000000000000000000000000000000000000000000000000" # Oracle + "0x3D561e1E0204d47b45C23B65356a4536c36d1AF6": "000000000000000000000000000000000c79d2b5cd58ae545afc83030233d7b600000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000124439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000144578706572696d656e74616c206561726e55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000086561726e5553446500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # ShareManager + "0xE90b8D7DfFB816b2895DE67307b4A8f9061CEF52": "0000000000000000000000000000000de74e5d51651326e0a3e1aca94beaf6e100000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3000000000000000000000000ccf2daba8bb04a232a2fda0d01010d4ef6c69b85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # FeeManager + "0x5D7e237BD77d3671fFb33FC9bC8c37d49aAE6153": "0000000000000000000000000000000714cf2851bac1ae2f41871862e9d216fd00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000203fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000" # RiskManager + # earnUSDe OracleSubmitter — Etherscan reports empty ctor args (CREATE2); args taken from creation bytecode tail + "0xDa5508789B5f93fb49b644c87Ef9D8CddB699d59": "000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000093a797643d74fc81e7a51f3f84a9d78f930435d10000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e000000000000000000000000bcdfaf92783b2c391a1c80682e75bb6ef47b9c3c" # OracleSubmitter + # earnUSDe SwapModule 0 proxy — Etherscan reports empty ctor args (CREATE2); args taken from creation bytecode tail + "0xC99DaA2dC366cFd115130a0b7D21Df01CB5FcF7b": "00000000000000000000000000000000d681e85e5783588f87a9573cb97eda0100000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000444439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e00000000000000000000000031b7d5a2b1ce1871dd642f6aecc0ef68d126b95a00000000000000000000000054586be62e3c3580375ae3723c145253060ca0c20000000000000000000000000000000000000000000000000000000005ee3fe000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000009745f161b0160a99924845befce1d7b9daee6899000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a34970000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b3000000000000000000000000356b8d89c1e1239cbbb9de4815c39a1474d5ba7d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000009d39a5de30e57443bff2a8307a4256c8797a34970000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b3000000000000000000000000356b8d89c1e1239cbbb9de4815c39a1474d5ba7d0000000000000000000000006131b5fae19ea4f9d964eac0408e4408b66337b5000000000000000000000000000000000000000000000000000000000000000caef53ff2a64da421565efa45c50a96f070d7bb66ffc4ca806c77c72a0e763f6635f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb9d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c253159a256c4d42df67b80d5d3fdaf91897a0d929e43a43a5f8e1a88cbd1476e5d9000000000000000000000000000000000000000000000000000000000" # SwapModule 0 proxy diff --git a/config_samples/mantle/mainnet/meta/meta_core_config.yaml b/config_samples/mantle/mainnet/meta/meta_core_config.yaml new file mode 100644 index 0000000..98891f3 --- /dev/null +++ b/config_samples/mantle/mainnet/meta/meta_core_config.yaml @@ -0,0 +1,141 @@ +# Core implementations and factories — Mantle deployment +# + +contracts: + # Factory + "0x00000000741292C88f9fF5050b07051C4f592EBf": TransparentUpgradeableProxy + "0x0000000072BAfCeAff1AD0237Ea58f06cfc4467F": Factory + + # Consensus + "0xAfef40968b5304135677f0C89203948e1A145105": TransparentUpgradeableProxy + "0x000000007e6b679B9196a1609e5Bc2405eDFd6Aa": Consensus + + # DepositQueue + "0xF429ba2a8437E7de85078CF7481E8Ad52df7E58c": TransparentUpgradeableProxy + "0x00000000B2d2373aAF1C370cFE4e1Ee8BDE7C546": DepositQueue + "0x000000001CC8c3E40856E956db870095EF6C98bd": SyncDepositQueue + "0x000000000Af33501e5BDAF9B481Ad2712a024727": SignatureDepositQueue + + # FeeManager + "0x52d56c20B0C8d403888880d0A1610e5ed17addA8": TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": FeeManager + + # Oracle + "0x727c295b5D99b15280Ca8736b6F97ABA6aEd0E88": TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": Oracle + + # RedeemQueue + "0xe08dc488bD6756323F8bf478869529D03db627ef": TransparentUpgradeableProxy + "0x0000000045d70ee8145135f08309fF5B1A63d43F": RedeemQueue + "0x000000008D14Ef3658805765107d9F12776f4138": SignatureRedeemQueue + + # RiskManager + "0x9885215ef8DB25C87466E73018061e532784D716": TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": RiskManager + + # ShareManager + "0xDA2a7aE07B6803feF9d95E47Ab83c8a5A09929F0": TransparentUpgradeableProxy + "0x00000000861e8B90B81f35C18cA14858Cc91d1Df": TokenizedShareManager + "0x00000000e5F0cddA56447b2a29e2847A52c8725D": BasicShareManager + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": BurnableTokenizedShareManager + + # Subvault + "0xA64e324DFF04e3C0613ff0706867868C7b370a45": TransparentUpgradeableProxy + "0x00000000CA30010B8417f791250AE221FdaD5920": Subvault + + # Verifier + "0x9fBAF5AEB9F52bA57E1cC1D3050eac6d75Df8ae7": TransparentUpgradeableProxy + "0x000000007e86a96e279662108cc19bA4c32EdE3C": Verifier + + # Vault + "0xBBCD2aC50aF2EA12Cc9cb7B16dBDa85859BeB3da": TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": Vault + + # SwapModule + "0xC5a52E4bB718Dfe86938e5cB967362EdA1E62698": TransparentUpgradeableProxy + "0x0000000042E248f84Df6BA1E768F878b1f2Bae9f": SwapModule + + "0x0000000009E9368ad21fc19DCE1cFcf9Af6dE339": BitmaskVerifier + + # ERC20Verifier + "0x711F6236e325634AA8c1F692b5312bfF3A8558D0": TransparentUpgradeableProxy + "0x00000000ACD80376E999Af8c424e5e33BD224A08": ERC20Verifier + + "0x0000000005a67199ABE0f9C995EAB9DaDfA31Ccd": VaultConfigurator + + # Hooks + "0x00000000176dD23550c3845746b2036E90DC5912": BasicRedeemHook + "0x0000000024ABbd08686Abb2987831dEa88eF1180": RedirectingDepositHook + + "0x000000007d2552AD746Af5c13f91B5e72f97c2B7": OracleHelper + + # MellowAccount + "0x870DB41df0905cc5a790f6582a3dA99A4A33F923": TransparentUpgradeableProxy + "0x00000000860913f37fab81ce8ce4E5BD1f664482": MellowAccountV1 + +rpc_url_env_var: MANTLE_RPC_URL + +explorer_hostname: api.etherscan.io +explorer_token_env_var: ETHERSCAN_EXPLORER_TOKEN +explorer_chain_id: 5000 + +deployment_gas_limit: 30000000000 # Mantle has inflated gas costs + +github_repo: + url: https://github.com/mellow-finance/flexible-vaults + # See https://docs.lido.fi/earn/audits + # Latest one: https://docs.lido.fi/assets/files/2026-03-02_Nethermind_NM-0758_Mellow-16bc93dbff41496cfb995655c453cf0f.pdf + commit: c9c71818f0a8bead183f9860db3b8bbceb7b8f37 + relative_root: "" + +dependencies: + lib/contracts: + url: https://github.com/cowprotocol/contracts + commit: c94c595a791681cf8ba7495117dcde397b932885 + relative_root: "" + lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts + commit: e4f70216d759d8e6a64144a9e1f7bbeed78e7079 + relative_root: contracts + # version 5.3.0 + lib/openzeppelin-contracts-upgradeable/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable + commit: 60b305a8f3ff0c7688f02ac470417b6bbf1c4d27 + relative_root: contracts + # version 5.3.0 + +bytecode_comparison: + constructor_calldata: + "0x00000000741292C88f9fF5050b07051C4f592EBf": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000072BAfCeAff1AD0237Ea58f06cfc4467F": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Factory + "0xAfef40968b5304135677f0C89203948e1A145105": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000007e6b679B9196a1609e5Bc2405eDFd6Aa": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Consensus + "0xF429ba2a8437E7de85078CF7481E8Ad52df7E58c": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000B2d2373aAF1C370cFE4e1Ee8BDE7C546": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # DepositQueue + "0x000000001CC8c3E40856E956db870095EF6C98bd": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SyncDepositQueue + "0x000000000Af33501e5BDAF9B481Ad2712a024727": "00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000afef40968b5304135677f0c89203948e1a14510500000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SignatureDepositQueue + "0x52d56c20B0C8d403888880d0A1610e5ed17addA8": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # FeeManager + "0x727c295b5D99b15280Ca8736b6F97ABA6aEd0E88": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Oracle + "0xe08dc488bD6756323F8bf478869529D03db627ef": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000045d70ee8145135f08309fF5B1A63d43F": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RedeemQueue + "0x000000008D14Ef3658805765107d9F12776f4138": "00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000afef40968b5304135677f0c89203948e1a14510500000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SignatureRedeemQueue + "0x9885215ef8DB25C87466E73018061e532784D716": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RiskManager + "0xDA2a7aE07B6803feF9d95E47Ab83c8a5A09929F0": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000861e8B90B81f35C18cA14858Cc91d1Df": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # TokenizedShareManager + "0x00000000e5F0cddA56447b2a29e2847A52c8725D": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BasicShareManager + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BurnableTokenizedShareManager + "0xA64e324DFF04e3C0613ff0706867868C7b370a45": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000CA30010B8417f791250AE221FdaD5920": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Subvault + "0x9fBAF5AEB9F52bA57E1cC1D3050eac6d75Df8ae7": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000007e86a96e279662108cc19bA4c32EdE3C": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Verifier + "0xBBCD2aC50aF2EA12Cc9cb7B16dBDa85859BeB3da": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": "00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f429ba2a8437e7de85078cf7481e8ad52df7e58c000000000000000000000000e08dc488bd6756323f8bf478869529d03db627ef000000000000000000000000a64e324dff04e3c0613ff0706867868c7b370a450000000000000000000000009fbaf5aeb9f52ba57e1cc1d3050eac6d75df8ae700000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Vault + "0xC5a52E4bB718Dfe86938e5cB967362EdA1E62698": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000042E248f84Df6BA1E768F878b1f2Bae9f": "00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe011000000000000000000000000078c1b0c915c4faa5fffa6cabf0219da63d7f4cb800000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SwapModule + "0x711F6236e325634AA8c1F692b5312bfF3A8558D0": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000ACD80376E999Af8c424e5e33BD224A08": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # ERC20Verifier + "0x0000000005a67199ABE0f9C995EAB9DaDfA31Ccd": "000000000000000000000000da2a7ae07b6803fef9d95e47ab83c8a5a09929f000000000000000000000000052d56c20b0c8d403888880d0a1610e5ed17adda80000000000000000000000009885215ef8db25c87466e73018061e532784d716000000000000000000000000727c295b5d99b15280ca8736b6f97aba6aed0e88000000000000000000000000bbcd2ac50af2ea12cc9cb7b16dbda85859beb3da" # VaultConfigurator + "0x870DB41df0905cc5a790f6582a3dA99A4A33F923": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy diff --git a/config_samples/mantle/mainnet/meta/meta_usde_mantle_config.yaml b/config_samples/mantle/mainnet/meta/meta_usde_mantle_config.yaml new file mode 100644 index 0000000..3693c71 --- /dev/null +++ b/config_samples/mantle/mainnet/meta/meta_usde_mantle_config.yaml @@ -0,0 +1,98 @@ +# earnUSDe - Experimental earnUSD (earnUSDe) Mantle + +contracts: + # Vault + "0xF9DD401ff0f806b71dE62a936c34B930d0876022": TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": Vault + + # SwapModule + "0x72b4c5Dc7E7e26BD077d78D5417F0Bf5b86a00EA": TransparentUpgradeableProxy # 0 + "0x0000000042E248f84Df6BA1E768F878b1f2Bae9f": SwapModule + + # Subvault + "0x18b50CbAAf4C48855b29E548E4d0248C71A15392": TransparentUpgradeableProxy # 0 + "0x00000000CA30010B8417f791250AE221FdaD5920": Subvault + + # Verifier + "0xd6d0cA0e4d5dE8df1BD3cb9c96E2ae1c473e9bf7": TransparentUpgradeableProxy # 0 + "0x000000007e86a96e279662108cc19bA4c32EdE3C": Verifier + + # Oracle + "0x6020b7dEa8df4C82Fe3EbD202FF76bcdbcBe12BA": TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": Oracle + + # ShareManager + "0x266E1084a88c78D18D42152b6a29873F67F2B586": TransparentUpgradeableProxy + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": BurnableTokenizedShareManager + + # FeeManager + "0x25958e9965B76f0B3a7809FcCc934066Aa80A540": TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": FeeManager + + # RiskManager + "0xc93f1B04CDEFB5C7F86f7F2f3df4CA26c5a098Ce": TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": RiskManager + + # Governance + "0x3032f5eCf95B2F8FA216Df50d588E2aAe4256f33": TimelockController + + # OracleSubmitter + "0xbe580d9C5C24b0A06C19660c058937BB8434BBa5": OracleSubmitter + +rpc_url_env_var: MANTLE_RPC_URL +explorer_hostname: api.etherscan.io +explorer_token_env_var: ETHERSCAN_EXPLORER_TOKEN +explorer_chain_id: 5000 + +deployment_gas_limit: 30000000000 # Mantle has inflated gas costs + +github_repo: + url: https://github.com/mellow-finance/flexible-vaults + commit: c9c71818f0a8bead183f9860db3b8bbceb7b8f37 + relative_root: "" + +dependencies: + contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts + commit: e4f70216d759d8e6a64144a9e1f7bbeed78e7079 + relative_root: contracts + # version 5.3.0 + lib/contracts: + url: https://github.com/cowprotocol/contracts + commit: c94c595a791681cf8ba7495117dcde397b932885 + relative_root: "" + lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts + commit: e4f70216d759d8e6a64144a9e1f7bbeed78e7079 + relative_root: contracts + # version 5.3.0 + lib/openzeppelin-contracts-upgradeable/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable + commit: 60b305a8f3ff0c7688f02ac470417b6bbf1c4d27 + relative_root: contracts + # version 5.3.0 + +bytecode_comparison: + constructor_calldata: + # Implementations (CREATE2 via deterministic deployer) + "0x0000000070f44289ec5ea3E5972f058f75B29801": "00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f429ba2a8437e7de85078cf7481e8ad52df7e58c000000000000000000000000e08dc488bd6756323f8bf478869529d03db627ef000000000000000000000000a64e324dff04e3c0613ff0706867868c7b370a450000000000000000000000009fbaf5aeb9f52ba57e1cc1d3050eac6d75df8ae700000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Vault + "0x0000000042E248f84Df6BA1E768F878b1f2Bae9f": "00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe011000000000000000000000000078c1b0c915c4faa5fffa6cabf0219da63d7f4cb800000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SwapModule + "0x00000000CA30010B8417f791250AE221FdaD5920": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Subvault + "0x000000007e86a96e279662108cc19bA4c32EdE3C": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Verifier + "0x000000009adE4dAE1f868775A3f087945983f062": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Oracle + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BurnableTokenizedShareManager + "0x00000000C18039E1F415fe07C33A316232238648": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # FeeManager + "0x00000000CC26BC741E75B181738Ac2B16156179b": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RiskManager + # Proxies (factory-created) + "0xF9DD401ff0f806b71dE62a936c34B930d0876022": "0000000000000000000000000000000070f44289ec5ea3e5972f058f75b2980100000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000584439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e000000000000000000000000266e1084a88c78d18d42152b6a29873f67f2b58600000000000000000000000025958e9965b76f0b3a7809fccc934066aa80a540000000000000000000000000c93f1b04cdefb5c7f86f7f2f3df4ca26c5a098ce0000000000000000000000006020b7dea8df4c82fe3ebd202ff76bcdbcbe12ba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000102b2a32ecca586a148d15aea321ddbb421a2a3ac6b4d56c0a9ad9de32e84cf5c4000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10253eb39d0edc77da10bbc4bcaa23c44e40e3c67ed649fbecb18a3f7c51bfbb10000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef104a899e3e648ea55418d9c99177e5c522df621b1953c0ad7e99da3711043ba1c1000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef1094b8a54d503c6b752e707c591f9345ae8ccc138255588e460ee15622d499fdba000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10a7ecfd54b0ab6ce6ecc88746fe62beba4e9a103dbb00d88cfedffbc0c6069ce8000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10877766a829235d063c3ba37802a4874fcf1b575d310fbe898df17d8ebabee4630000000000000000000000009745f161b0160a99924845befce1d7b9daee689968895691ff006f290ca74825ce06ed17fffab55af49f0274f49b7424f752583a0000000000000000000000009745f161b0160a99924845befce1d7b9daee689932a781031f04cc60b32394e40124d1e87f54273bf26d0532a115a424f6a932980000000000000000000000009745f161b0160a99924845befce1d7b9daee689978b235a1fa2fd5e00dba7867d599bed6f088684010a7fee7b9fe05fa1082d01e0000000000000000000000003032f5ecf95b2f8fa216df50d588e2aae4256f33fc199f685d023b44b528c5fcb9cebfe292e64340dd5729b20761da4ad1e930240000000000000000000000003032f5ecf95b2f8fa216df50d588e2aae4256f336618a6d92147bbcacfb2ef2375976fc4c529eeeaeb72a66048296571370c69460000000000000000000000003032f5ecf95b2f8fa216df50d588e2aae4256f330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a385c2023fdfb1e93dedf5d18f9bc0e79347e071d12740ba71aeb84a4fcbdc4b79000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3fc199f685d023b44b528c5fcb9cebfe292e64340dd5729b20761da4ad1e93024000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a34a899e3e648ea55418d9c99177e5c522df621b1953c0ad7e99da3711043ba1c1000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3253eb39d0edc77da10bbc4bcaa23c44e40e3c67ed649fbecb18a3f7c51bfbb10000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # Vault proxy + "0x72b4c5Dc7E7e26BD077d78D5417F0Bf5b86a00EA": "0000000000000000000000000000000042e248f84df6ba1e768f878b1f2bae9f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c4439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e00000000000000000000000018b50cbaaf4c48855b29e548e4d0248c71a1539200000000000000000000000047a063cfda980532267970d478ec340c0f80e8df0000000000000000000000000000000000000000000000000000000005ee3fe000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009745f161b0160a99924845befce1d7b9daee6899000000000000000000000000779ded0c9e1022225f8e0630b35a9b54be713736000000000000000000000000211cc4dd073734da055fbf44a2b4667d5e5fe5d20000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef3400000000000000000000000078c1b0c915c4faa5fffa6cabf0219da63d7f4cb8000000000000000000000000779ded0c9e1022225f8e0630b35a9b54be713736000000000000000000000000211cc4dd073734da055fbf44a2b4667d5e5fe5d20000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef3400000000000000000000000078c1b0c915c4faa5fffa6cabf0219da63d7f4cb80000000000000000000000006131b5fae19ea4f9d964eac0408e4408b66337b5000000000000000000000000000000000000000000000000000000000000000aaef53ff2a64da421565efa45c50a96f070d7bb66ffc4ca806c77c72a0e763f6635f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb9d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c253159a256c4d42df67b80d5d3fdaf91897a0d929e43a43a5f8e1a88cbd1476e5d9000000000000000000000000000000000000000000000000000000000" # SwapModule0 proxy + "0x18b50CbAAf4C48855b29E548E4d0248C71A15392": "00000000000000000000000000000000ca30010b8417f791250ae221fdad592000000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000d6d0ca0e4d5de8df1bd3cb9c96e2ae1c473e9bf7000000000000000000000000f9dd401ff0f806b71de62a936c34b930d087602200000000000000000000000000000000000000000000000000000000" # Subvault0 proxy + "0xd6d0cA0e4d5dE8df1BD3cb9c96E2ae1c473e9bf7": "000000000000000000000000000000007e86a96e279662108cc19ba4c32ede3c00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f9dd401ff0f806b71de62a936c34b930d0876022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # Verifier0 proxy + "0x6020b7dEa8df4C82Fe3EbD202FF76bcdbcBe12BA": "000000000000000000000000000000009ade4dae1f868775a3f087945983f06200000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c4439fab910000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000001027e72f1f128130880000000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000119400000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000002a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000779ded0c9e1022225f8e0630b35a9b54be7137360000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef34000000000000000000000000211cc4dd073734da055fbf44a2b4667d5e5fe5d200000000000000000000000000000000000000000000000000000000" # Oracle proxy + "0x266E1084a88c78D18D42152b6a29873F67F2B586": "00000000000000000000000000000000c534b8680e3aa7165dedc3ab8781f60200000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000124439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000144578706572696d656e74616c206561726e55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000086561726e5553446500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # ShareManager proxy + "0x25958e9965B76f0B3a7809FcCc934066Aa80A540": "00000000000000000000000000000000c18039e1f415fe07c33a31623223864800000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3000000000000000000000000ccf2daba8bb04a232a2fda0d01010d4ef6c69b85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # FeeManager proxy + "0xc93f1B04CDEFB5C7F86f7F2f3df4CA26c5a098Ce": "00000000000000000000000000000000cc26bc741e75b181738ac2b16156179b00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000203fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000" # RiskManager proxy + # OracleSubmitter — not yet verified on explorer; ctor args from creation bytecode tail + "0xbe580d9C5C24b0A06C19660c058937BB8434BBa5": "000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000093a797643d74fc81e7a51f3f84a9d78f930435d10000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e0000000000000000000000006020b7dea8df4c82fe3ebd202ff76bcdbcbe12ba" # OracleSubmitter + # TimelockController — explorer returns empty ctor args (CREATE2); args taken from creation bytecode tail + "0x3032f5eCf95B2F8FA216Df50d588E2aAe4256f33": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a916fd5252160a7e56a6405741de76dc0da5a0cd0000000000000000000000006e887af318c6b29cee42ea28953bd0badb3ce638" # TimelockController diff --git a/config_samples/plasma/mainnet/meta/meta_core_config.yaml b/config_samples/plasma/mainnet/meta/meta_core_config.yaml new file mode 100644 index 0000000..d9888c7 --- /dev/null +++ b/config_samples/plasma/mainnet/meta/meta_core_config.yaml @@ -0,0 +1,135 @@ +# Core implementations and factories — Plasma deployment + +contracts: + # Factory + "0x00000000741292C88f9fF5050b07051C4f592EBf": TransparentUpgradeableProxy + "0x0000000072BAfCeAff1AD0237Ea58f06cfc4467F": Factory + + # Consensus + "0xAfef40968b5304135677f0C89203948e1A145105": TransparentUpgradeableProxy + "0x000000007e6b679B9196a1609e5Bc2405eDFd6Aa": Consensus + + # DepositQueue + "0xF429ba2a8437E7de85078CF7481E8Ad52df7E58c": TransparentUpgradeableProxy + "0x00000000B2d2373aAF1C370cFE4e1Ee8BDE7C546": DepositQueue + "0x000000001CC8c3E40856E956db870095EF6C98bd": SyncDepositQueue + "0x000000000Af33501e5BDAF9B481Ad2712a024727": SignatureDepositQueue + + # FeeManager + "0x52d56c20B0C8d403888880d0A1610e5ed17addA8": TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": FeeManager + + # Oracle + "0x727c295b5D99b15280Ca8736b6F97ABA6aEd0E88": TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": Oracle + + # RedeemQueue + "0xe08dc488bD6756323F8bf478869529D03db627ef": TransparentUpgradeableProxy + "0x0000000045d70ee8145135f08309fF5B1A63d43F": RedeemQueue + "0x000000008D14Ef3658805765107d9F12776f4138": SignatureRedeemQueue + + # RiskManager + "0x9885215ef8DB25C87466E73018061e532784D716": TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": RiskManager + + # ShareManager + "0xDA2a7aE07B6803feF9d95E47Ab83c8a5A09929F0": TransparentUpgradeableProxy + "0x00000000861e8B90B81f35C18cA14858Cc91d1Df": TokenizedShareManager + "0x00000000e5F0cddA56447b2a29e2847A52c8725D": BasicShareManager + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": BurnableTokenizedShareManager + + # Subvault + "0xA64e324DFF04e3C0613ff0706867868C7b370a45": TransparentUpgradeableProxy + "0x00000000CA30010B8417f791250AE221FdaD5920": Subvault + + # Verifier + "0x9fBAF5AEB9F52bA57E1cC1D3050eac6d75Df8ae7": TransparentUpgradeableProxy + "0x000000007e86a96e279662108cc19bA4c32EdE3C": Verifier + + # Vault + "0xBBCD2aC50aF2EA12Cc9cb7B16dBDa85859BeB3da": TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": Vault + + # SwapModule + "0xC5a52E4bB718Dfe86938e5cB967362EdA1E62698": TransparentUpgradeableProxy + "0x00000000015fa996bCA8c842AFEdC334616F283A": SwapModule + + "0x0000000009E9368ad21fc19DCE1cFcf9Af6dE339": BitmaskVerifier + + # ERC20Verifier + "0x711F6236e325634AA8c1F692b5312bfF3A8558D0": TransparentUpgradeableProxy + "0x00000000ACD80376E999Af8c424e5e33BD224A08": ERC20Verifier + + "0x0000000005a67199ABE0f9C995EAB9DaDfA31Ccd": VaultConfigurator + + # Hooks + "0x00000000176dD23550c3845746b2036E90DC5912": BasicRedeemHook + "0x0000000024ABbd08686Abb2987831dEa88eF1180": RedirectingDepositHook + + "0x000000007d2552AD746Af5c13f91B5e72f97c2B7": OracleHelper + + # MellowAccount + "0x870DB41df0905cc5a790f6582a3dA99A4A33F923": TransparentUpgradeableProxy + "0x00000000860913f37fab81ce8ce4E5BD1f664482": MellowAccountV1 + +rpc_url_env_var: PLASMA_RPC_URL +explorer_hostname: api.etherscan.io +explorer_token_env_var: ETHERSCAN_EXPLORER_TOKEN +explorer_chain_id: 9745 + +github_repo: + url: https://github.com/mellow-finance/flexible-vaults + commit: c9c71818f0a8bead183f9860db3b8bbceb7b8f37 + relative_root: "" + +dependencies: + lib/contracts: + url: https://github.com/cowprotocol/contracts + commit: c94c595a791681cf8ba7495117dcde397b932885 + relative_root: "" + lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts + commit: e4f70216d759d8e6a64144a9e1f7bbeed78e7079 + relative_root: contracts + # version 5.3.0 + lib/openzeppelin-contracts-upgradeable/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable + commit: 60b305a8f3ff0c7688f02ac470417b6bbf1c4d27 + relative_root: contracts + # version 5.3.0 + +bytecode_comparison: + constructor_calldata: + "0x00000000741292C88f9fF5050b07051C4f592EBf": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000072BAfCeAff1AD0237Ea58f06cfc4467F": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Factory + "0xAfef40968b5304135677f0C89203948e1A145105": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000007e6b679B9196a1609e5Bc2405eDFd6Aa": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Consensus + "0xF429ba2a8437E7de85078CF7481E8Ad52df7E58c": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000B2d2373aAF1C370cFE4e1Ee8BDE7C546": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # DepositQueue + "0x000000001CC8c3E40856E956db870095EF6C98bd": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SyncDepositQueue + "0x000000000Af33501e5BDAF9B481Ad2712a024727": "00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000afef40968b5304135677f0c89203948e1a14510500000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SignatureDepositQueue + "0x52d56c20B0C8d403888880d0A1610e5ed17addA8": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # FeeManager + "0x727c295b5D99b15280Ca8736b6F97ABA6aEd0E88": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Oracle + "0xe08dc488bD6756323F8bf478869529D03db627ef": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000045d70ee8145135f08309fF5B1A63d43F": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RedeemQueue + "0x000000008D14Ef3658805765107d9F12776f4138": "00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000afef40968b5304135677f0c89203948e1a14510500000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SignatureRedeemQueue + "0x9885215ef8DB25C87466E73018061e532784D716": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RiskManager + "0xDA2a7aE07B6803feF9d95E47Ab83c8a5A09929F0": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000861e8B90B81f35C18cA14858Cc91d1Df": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # TokenizedShareManager + "0x00000000e5F0cddA56447b2a29e2847A52c8725D": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BasicShareManager + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BurnableTokenizedShareManager + "0xA64e324DFF04e3C0613ff0706867868C7b370a45": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000CA30010B8417f791250AE221FdaD5920": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Subvault + "0x9fBAF5AEB9F52bA57E1cC1D3050eac6d75Df8ae7": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x000000007e86a96e279662108cc19bA4c32EdE3C": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Verifier + "0xBBCD2aC50aF2EA12Cc9cb7B16dBDa85859BeB3da": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": "00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f429ba2a8437e7de85078cf7481e8ad52df7e58c000000000000000000000000e08dc488bd6756323f8bf478869529d03db627ef000000000000000000000000a64e324dff04e3c0613ff0706867868c7b370a450000000000000000000000009fbaf5aeb9f52ba57e1cc1d3050eac6d75df8ae700000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Vault + "0xC5a52E4bB718Dfe86938e5cB967362EdA1E62698": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x711F6236e325634AA8c1F692b5312bfF3A8558D0": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + "0x00000000ACD80376E999Af8c424e5e33BD224A08": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # ERC20Verifier + "0x0000000005a67199ABE0f9C995EAB9DaDfA31Ccd": "000000000000000000000000da2a7ae07b6803fef9d95e47ab83c8a5a09929f000000000000000000000000052d56c20b0c8d403888880d0a1610e5ed17adda80000000000000000000000009885215ef8db25c87466e73018061e532784d716000000000000000000000000727c295b5d99b15280ca8736b6f97aba6aed0e88000000000000000000000000bbcd2ac50af2ea12cc9cb7b16dbda85859beb3da" # VaultConfigurator + "0x870DB41df0905cc5a790f6582a3dA99A4A33F923": "0000000000000000000000000000000072bafceaff1ad0237ea58f06cfc4467f00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # TransparentUpgradeableProxy + # SwapModule (0x00000000015fa996bCA8c842AFEdC334616F283A) calldata not yet available diff --git a/config_samples/plasma/mainnet/meta/meta_usde_plasma_config.yaml b/config_samples/plasma/mainnet/meta/meta_usde_plasma_config.yaml new file mode 100644 index 0000000..75e32ca --- /dev/null +++ b/config_samples/plasma/mainnet/meta/meta_usde_plasma_config.yaml @@ -0,0 +1,101 @@ +# earnUSDe - Experimental earnUSD (earnUSDe) Plasma +# https://metavaults.mellow.finance/deployments.md + +contracts: + # Vault + "0x49DAb986A4288bE616f44733d56397d3410fD331": TransparentUpgradeableProxy + "0x0000000070f44289ec5ea3E5972f058f75B29801": Vault + + # SwapModule + "0x351C5644D4d8502385b28Fe3Ef36B44C4b4cEb1c": TransparentUpgradeableProxy # 0 + "0x00000000015fa996bCA8c842AFEdC334616F283A": SwapModule + + # Subvault + "0xa11BE438F1961dB47F6660BDAF59b05C0200ADC5": TransparentUpgradeableProxy # 0 + "0xbaaE2F02d3a4f33eC164902e5A9E980Cb4c71afB": TransparentUpgradeableProxy # 1 + "0x00000000CA30010B8417f791250AE221FdaD5920": Subvault + + # Verifier + "0xeF886da65AA032ce51517a555540339d08effd83": TransparentUpgradeableProxy # 0 + "0xDCa60DBDa06418dB843779486D61cc89208634DE": TransparentUpgradeableProxy # 1 + "0x000000007e86a96e279662108cc19bA4c32EdE3C": Verifier + + # Oracle + "0xdB8837c1946f28d9766d9CA7470160B663198DD9": TransparentUpgradeableProxy + "0x000000009adE4dAE1f868775A3f087945983f062": Oracle + + # ShareManager + "0x906703a4e566D04828845b6C2918B1767E24752A": TransparentUpgradeableProxy + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": BurnableTokenizedShareManager + + # FeeManager + "0x4FD8e72bEA84dc3B947672E49734e457a196bbdb": TransparentUpgradeableProxy + "0x00000000C18039E1F415fe07C33A316232238648": FeeManager + + # RiskManager + "0x6B2EaDFD25947b6eD2657f9DCb5bf4413113cc9E": TransparentUpgradeableProxy + "0x00000000CC26BC741E75B181738Ac2B16156179b": RiskManager + + # Governance + "0xFC950F8C0064071a5D762783Cf726Fa0CC2722Fe": TimelockController + + # OracleSubmitter + "0x9d84510ED5dA4adc6Be2726F6C27B3AD68fDAd92": OracleSubmitter + +rpc_url_env_var: PLASMA_RPC_URL +explorer_hostname: api.etherscan.io +explorer_token_env_var: ETHERSCAN_EXPLORER_TOKEN +explorer_chain_id: 9745 + +github_repo: + url: https://github.com/mellow-finance/flexible-vaults + commit: c9c71818f0a8bead183f9860db3b8bbceb7b8f37 + relative_root: "" + +dependencies: + contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts + commit: e4f70216d759d8e6a64144a9e1f7bbeed78e7079 + relative_root: contracts + # version 5.3.0 + lib/contracts: + url: https://github.com/cowprotocol/contracts + commit: c94c595a791681cf8ba7495117dcde397b932885 + relative_root: "" + lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts + commit: e4f70216d759d8e6a64144a9e1f7bbeed78e7079 + relative_root: contracts + # version 5.3.0 + lib/openzeppelin-contracts-upgradeable/contracts: + url: https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable + commit: 60b305a8f3ff0c7688f02ac470417b6bbf1c4d27 + relative_root: contracts + # version 5.3.0 + +bytecode_comparison: + constructor_calldata: + # Implementations (CREATE2 via deterministic deployer) + "0x0000000070f44289ec5ea3E5972f058f75B29801": "00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f429ba2a8437e7de85078cf7481e8ad52df7e58c000000000000000000000000e08dc488bd6756323f8bf478869529d03db627ef000000000000000000000000a64e324dff04e3c0613ff0706867868c7b370a450000000000000000000000009fbaf5aeb9f52ba57e1cc1d3050eac6d75df8ae700000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Vault + "0x00000000015fa996bCA8c842AFEdC334616F283A": "00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe01100000000000000000000000006100e367285b01f48d07953803a2d8dca5d1987300000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # SwapModule + "0x00000000CA30010B8417f791250AE221FdaD5920": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Subvault + "0x000000007e86a96e279662108cc19bA4c32EdE3C": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Verifier + "0x000000009adE4dAE1f868775A3f087945983f062": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # Oracle + "0x00000000C534B8680e3aa7165DeDc3Ab8781f602": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # BurnableTokenizedShareManager + "0x00000000C18039E1F415fe07C33A316232238648": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # FeeManager + "0x00000000CC26BC741E75B181738Ac2B16156179b": "0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000064d656c6c6f770000000000000000000000000000000000000000000000000000" # RiskManager + # Proxies (factory-created) + "0x49DAb986A4288bE616f44733d56397d3410fD331": "0000000000000000000000000000000070f44289ec5ea3e5972f058f75b2980100000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000544439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e000000000000000000000000906703a4e566d04828845b6c2918b1767e24752a0000000000000000000000004fd8e72bea84dc3b947672e49734e457a196bbdb0000000000000000000000006b2eadfd25947b6ed2657f9dcb5bf4413113cc9e000000000000000000000000db8837c1946f28d9766d9ca7470160b663198dd90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000f2b2a32ecca586a148d15aea321ddbb421a2a3ac6b4d56c0a9ad9de32e84cf5c4000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10253eb39d0edc77da10bbc4bcaa23c44e40e3c67ed649fbecb18a3f7c51bfbb10000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef104a899e3e648ea55418d9c99177e5c522df621b1953c0ad7e99da3711043ba1c1000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef1094b8a54d503c6b752e707c591f9345ae8ccc138255588e460ee15622d499fdba000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10a7ecfd54b0ab6ce6ecc88746fe62beba4e9a103dbb00d88cfedffbc0c6069ce8000000000000000000000000982ab69785f5329bb59c36b19cbd4865353fef10877766a829235d063c3ba37802a4874fcf1b575d310fbe898df17d8ebabee4630000000000000000000000009745f161b0160a99924845befce1d7b9daee689968895691ff006f290ca74825ce06ed17fffab55af49f0274f49b7424f752583a0000000000000000000000009745f161b0160a99924845befce1d7b9daee689932a781031f04cc60b32394e40124d1e87f54273bf26d0532a115a424f6a932980000000000000000000000009745f161b0160a99924845befce1d7b9daee689978b235a1fa2fd5e00dba7867d599bed6f088684010a7fee7b9fe05fa1082d01e000000000000000000000000fc950f8c0064071a5d762783cf726fa0cc2722fefc199f685d023b44b528c5fcb9cebfe292e64340dd5729b20761da4ad1e93024000000000000000000000000fc950f8c0064071a5d762783cf726fa0cc2722fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a385c2023fdfb1e93dedf5d18f9bc0e79347e071d12740ba71aeb84a4fcbdc4b79000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3fc199f685d023b44b528c5fcb9cebfe292e64340dd5729b20761da4ad1e93024000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a34a899e3e648ea55418d9c99177e5c522df621b1953c0ad7e99da3711043ba1c1000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3253eb39d0edc77da10bbc4bcaa23c44e40e3c67ed649fbecb18a3f7c51bfbb10000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000000000000000000000000000000000000" # Vault proxy + "0x351C5644D4d8502385b28Fe3Ef36B44C4b4cEb1c": "00000000000000000000000000000000015fa996bca8c842afedc334616f283a00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c4439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e000000000000000000000000a11be438f1961db47f6660bdaf59b05c0200adc500000000000000000000000033e0b3fc976dc9c516926ba48cfc0a9e10a2aaa50000000000000000000000000000000000000000000000000000000005ee3fe000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009745f161b0160a99924845befce1d7b9daee6899000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb000000000000000000000000211cc4dd073734da055fbf44a2b4667d5e5fe5d20000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef34000000000000000000000000c4374775489cb9c56003bf2c9b12495fc64f0771000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb000000000000000000000000211cc4dd073734da055fbf44a2b4667d5e5fe5d20000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef34000000000000000000000000c4374775489cb9c56003bf2c9b12495fc64f07710000000000000000000000006131b5fae19ea4f9d964eac0408e4408b66337b5000000000000000000000000000000000000000000000000000000000000000aaef53ff2a64da421565efa45c50a96f070d7bb66ffc4ca806c77c72a0e763f6635f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb35f08086aac3799af637e5e9fa5ff324170893731444bf3a9d1edc368bcbfaeb9d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c25319d556436fc766d4a6d24fe48c90073bc03600d7556265a3217def4578d7c253159a256c4d42df67b80d5d3fdaf91897a0d929e43a43a5f8e1a88cbd1476e5d9000000000000000000000000000000000000000000000000000000000" # SwapModule0 proxy + "0xa11BE438F1961dB47F6660BDAF59b05C0200ADC5": "00000000000000000000000000000000ca30010b8417f791250ae221fdad592000000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ef886da65aa032ce51517a555540339d08effd8300000000000000000000000049dab986a4288be616f44733d56397d3410fd33100000000000000000000000000000000000000000000000000000000" # Subvault0 proxy + "0xbaaE2F02d3a4f33eC164902e5A9E980Cb4c71afB": "00000000000000000000000000000000ca30010b8417f791250ae221fdad592000000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab9100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000dca60dbda06418db843779486d61cc89208634de00000000000000000000000049dab986a4288be616f44733d56397d3410fd33100000000000000000000000000000000000000000000000000000000" # Subvault1 proxy + "0xeF886da65AA032ce51517a555540339d08effd83": "000000000000000000000000000000007e86a96e279662108cc19ba4c32ede3c00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab910000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000049dab986a4288be616f44733d56397d3410fd331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # Verifier0 proxy + "0xDCa60DBDa06418dB843779486D61cc89208634DE": "000000000000000000000000000000007e86a96e279662108cc19ba4c32ede3c00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084439fab910000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000049dab986a4288be616f44733d56397d3410fd331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # Verifier1 proxy + "0xdB8837c1946f28d9766d9CA7470160B663198DD9": "000000000000000000000000000000009ade4dae1f868775a3f087945983f06200000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e4439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000001027e72f1f128130880000000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000119400000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000002a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb0000000000000000000000005d3a1ff2b6bab83b63cd9ad0787074081a52ef34000000000000000000000000211cc4dd073734da055fbf44a2b4667d5e5fe5d2000000000000000000000000c4374775489cb9c56003bf2c9b12495fc64f077100000000000000000000000000000000000000000000000000000000" # Oracle proxy + "0x906703a4e566D04828845b6C2918B1767E24752A": "00000000000000000000000000000000c534b8680e3aa7165dedc3ab8781f60200000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000124439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000144578706572696d656e74616c206561726e55534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000086561726e5553446500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # ShareManager proxy + "0x4FD8e72bEA84dc3B947672E49734e457a196bbdb": "00000000000000000000000000000000c18039e1f415fe07c33a31623223864800000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a3000000000000000000000000ccf2daba8bb04a232a2fda0d01010d4ef6c69b85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" # FeeManager proxy + "0x6B2EaDFD25947b6eD2657f9DCb5bf4413113cc9E": "00000000000000000000000000000000cc26bc741e75b181738ac2b16156179b00000000000000000000000081698f87c6482bf1ce9bfcfc0f103c4a0adf0af000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064439fab91000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000203fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000" # RiskManager proxy + # OracleSubmitter + "0x9d84510ED5dA4adc6Be2726F6C27B3AD68fDAd92": "000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a300000000000000000000000093a797643d74fc81e7a51f3f84a9d78f930435d10000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e000000000000000000000000db8837c1946f28d9766d9ca7470160b663198dd9" # OracleSubmitter + # TimelockController — verified on Plasma but explorer returns empty ctor args (CREATE2); args taken from creation bytecode tail + "0xFC950F8C0064071a5D762783Cf726Fa0CC2722Fe": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000dd73341d6158a72b4d224541f1094188f57076e000000000000000000000000e98be1e5538fcbd716c506052eb1fd5d6fc495a30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a916fd5252160a7e56a6405741de76dc0da5a0cd0000000000000000000000006e887af318c6b29cee42ea28953bd0badb3ce638" # TimelockController diff --git a/diffyscan/diffyscan.py b/diffyscan/diffyscan.py index 6d41b14..48f60ab 100644 --- a/diffyscan/diffyscan.py +++ b/diffyscan/diffyscan.py @@ -172,7 +172,11 @@ def run_bytecode_diff( ) deployment_call_data = _append_calldata(contract_creation_code, calldata) - local_deployed_bytecode = simulate_deployment(deployment_call_data, remote_rpc_url) + gas_limit = config.get("deployment_gas_limit") + extra = {"gas_limit": gas_limit} if gas_limit else {} + local_deployed_bytecode = simulate_deployment( + deployment_call_data, remote_rpc_url, **extra + ) is_fully_matched = local_deployed_bytecode == remote_deployed_bytecode @@ -354,8 +358,9 @@ def _load_explorer_token(config: dict) -> str: def _setup_binary_comparison(config: dict) -> str: - """Load REMOTE_RPC_URL and configure exception handling for bytecode comparison.""" - remote_rpc_url = load_env("REMOTE_RPC_URL", masked=True, required=True) + """Load RPC URL and configure exception handling for bytecode comparison.""" + rpc_env_var = config.get("rpc_url_env_var", "REMOTE_RPC_URL") + remote_rpc_url = load_env(rpc_env_var, masked=True, required=True) ExceptionHandler.initialize(config.get("fail_on_bytecode_comparison_error", True)) return remote_rpc_url @@ -413,6 +418,7 @@ def process_config( cache_explorer: bool, cache_github: bool, skip_user_input: bool = False, + contract_filter: list[str] | None = None, ): """Process a config file and run source + bytecode comparisons.""" # Reset exception handler to default before each config @@ -441,6 +447,7 @@ def process_config( # Statistics tracking source_stats = [] bytecode_stats = [] + matched_count = 0 try: if enable_binary_comparison: @@ -448,7 +455,15 @@ def process_config( remote_chain_id = get_chain_id(remote_rpc_url) logger.okay("Remote chain ID", remote_chain_id) + # Apply contract filter if specified + filter_set = ( + set(addr.lower() for addr in contract_filter) if contract_filter else None + ) + for contract_address, contract_name in config["contracts"].items(): + if filter_set and contract_address.lower() not in filter_set: + continue + matched_count += 1 try: contract_code = get_contract_from_explorer( explorer_token, @@ -511,6 +526,7 @@ def process_config( "source_stats": source_stats, "bytecode_stats": bytecode_stats, "config_path": path, + "matched_count": matched_count, } @@ -582,6 +598,14 @@ def parse_arguments() -> argparse.Namespace: help="Hide info messages, show okay/warn/error (shorthand for --log-level okay)", action="store_true", ) + parser.add_argument( + "--contract", + "-C", + dest="contract_filter", + action="append", + default=[], + help="Only check specific contract address (0x...). Can be passed multiple times.", + ) return parser.parse_args() @@ -670,7 +694,6 @@ def main() -> None: """Main entry point for the diffyscan application.""" load_dotenv() args = parse_arguments() - skip_user_input = args.yes if args.quiet: logger.set_level("okay") else: @@ -726,10 +749,19 @@ def main() -> None: enable_binary_comparison, args.cache_explorer, args.cache_github, - skip_user_input, + args.yes, + args.contract_filter, ) all_results.append(result) + # A contract filter that matches nothing across all configs is a usage error + if args.contract_filter and sum(r["matched_count"] for r in all_results) == 0: + logger.error( + "No contracts matched the --contract filter", + ", ".join(args.contract_filter), + ) + sys.exit(1) + execution_time = time.time() - START_TIME # Determine what comparisons were enabled (check first result) diff --git a/diffyscan/utils/constants.py b/diffyscan/utils/constants.py index ad6802b..86dc5b9 100644 --- a/diffyscan/utils/constants.py +++ b/diffyscan/utils/constants.py @@ -35,9 +35,11 @@ def _get_cache_home() -> str: 0x3C: 'EXTCODECOPY', 0x3D: 'RETURNDATASIZE', 0x3E: 'RETURNDATACOPY', 0x3F: 'EXTCODEHASH', 0x40: 'BLOCKHASH', 0x41: 'COINBASE', 0x42: 'TIMESTAMP', 0x43: 'NUMBER', 0x44: 'PREVRANDAO', 0x45: 'GASLIMIT', 0x46: 'CHAINID', 0x47: 'SELFBALANCE', 0x48: 'BASEFEE', + 0x49: 'BLOBHASH', 0x4A: 'BLOBBASEFEE', # Cancun — EIP-4844, EIP-7516 0x50: 'POP', 0x51: 'MLOAD', 0x52: 'MSTORE', 0x53: 'MSTORE8', 0x54: 'SLOAD', 0x55: 'SSTORE', 0x56: 'JUMP', 0x57: 'JUMPI', 0x58: 'PC', 0x59: 'MSIZE', 0x5A: 'GAS', 0x5B: 'JUMPDEST', + 0x5C: 'TLOAD', 0x5D: 'TSTORE', 0x5E: 'MCOPY', # Cancun — EIP-1153, EIP-5656 0x5F: 'PUSH0', 0x60: 'PUSH1', 0x61: 'PUSH2', 0x62: 'PUSH3', 0x63: 'PUSH4', 0x64: 'PUSH5', 0x65: 'PUSH6', 0x66: 'PUSH7', 0x67: 'PUSH8', 0x68: 'PUSH9', 0x69: 'PUSH10', 0x6A: 'PUSH11', 0x6B: 'PUSH12', 0x6C: 'PUSH13', 0x6D: 'PUSH14', 0x6E: 'PUSH15', 0x6F: 'PUSH16', 0x70: 'PUSH17', diff --git a/diffyscan/utils/node_handler.py b/diffyscan/utils/node_handler.py index a112854..97eb89a 100644 --- a/diffyscan/utils/node_handler.py +++ b/diffyscan/utils/node_handler.py @@ -5,7 +5,7 @@ from .custom_exceptions import NodeError DEFAULT_CALLER = "0x0000000000000000000000000000000000000000" -DEPLOYMENT_SIMULATION_GAS_LIMIT = 100_000_000 +DEFAULT_DEPLOYMENT_GAS_LIMIT = 100_000_000 def _rpc_call(rpc_url: str, method: str, params: list): @@ -44,7 +44,12 @@ def get_chain_id(rpc_url: str) -> int: return chain_id -def simulate_deployment(data: str, rpc_url: str, caller: str = DEFAULT_CALLER) -> str: +def simulate_deployment( + data: str, + rpc_url: str, + caller: str = DEFAULT_CALLER, + gas_limit: int = DEFAULT_DEPLOYMENT_GAS_LIMIT, +) -> str: """Simulate contract deployment via eth_call and return deployed runtime bytecode.""" logger.info(f'Simulating deployment via eth_call on "{mask_text(rpc_url)}" ...') @@ -55,7 +60,7 @@ def simulate_deployment(data: str, rpc_url: str, caller: str = DEFAULT_CALLER) - { "from": caller, "to": None, - "gas": hex(DEPLOYMENT_SIMULATION_GAS_LIMIT), + "gas": hex(gas_limit), "data": data, }, "latest", diff --git a/tests/test_binary_verifier.py b/tests/test_binary_verifier.py index 90d75bb..1784eef 100644 --- a/tests/test_binary_verifier.py +++ b/tests/test_binary_verifier.py @@ -1,6 +1,7 @@ import pytest -from diffyscan.utils.binary_verifier import deep_match_bytecode +from diffyscan.utils.binary_verifier import deep_match_bytecode, parse +from diffyscan.utils.constants import OPCODES, PUSH0, PUSH32 from diffyscan.utils.custom_exceptions import BinVerifierError @@ -25,3 +26,57 @@ def test_non_immutable_diff_raises(): with pytest.raises(BinVerifierError, match="differences not on the immutable"): deep_match_bytecode(actual, expected, immutables={}) + + +# --- Opcode parsing --- + + +@pytest.mark.parametrize( + "code,name", + sorted(OPCODES.items()), + ids=[f"0x{code:02x}_{name}" for code, name in sorted(OPCODES.items())], +) +def test_parse_every_opcode(code, name): + """Every opcode in the OPCODES table should be parsed without unknown warnings.""" + if PUSH0 <= code <= PUSH32: + # PUSHn needs n bytes of immediate data after the opcode + n = code - PUSH0 + bytecode = format(code, "02x") + "00" * n + else: + bytecode = format(code, "02x") + + instructions, unknown = parse(bytecode) + assert unknown == set(), f"opcode 0x{code:02x} ({name}) flagged as unknown" + assert len(instructions) == 1 + assert instructions[0]["op"]["name"] == name + assert instructions[0]["op"]["code"] == code + + +@pytest.mark.parametrize("n", range(0, 33), ids=[f"PUSH{n}" for n in range(0, 33)]) +def test_push_consumes_n_bytes(n): + """PUSH0..PUSH32 should consume exactly 1 + n bytes.""" + code = PUSH0 + n + immediate = "ab" * n + bytecode = format(code, "02x") + immediate + + instructions, unknown = parse(bytecode) + assert unknown == set() + assert len(instructions) == 1 + assert instructions[0]["length"] == 1 + n + assert instructions[0]["start"] == 0 + + +def test_parse_unknown_opcode_detected(): + # 0x0C is not a valid EVM opcode + instructions, unknown = parse("0c") + assert unknown == {"0xc"} + assert instructions[0]["op"]["name"] == "INVALID" + + +def test_parse_mixed_sequence(): + # STOP, ADD, PUSH1 0xff, TLOAD, MCOPY, BLOBHASH, JUMP + bytecode = "000160ff5c5e4956" + instructions, unknown = parse(bytecode) + assert unknown == set() + names = [i["op"]["name"] for i in instructions] + assert names == ["STOP", "ADD", "PUSH1", "TLOAD", "MCOPY", "BLOBHASH", "JUMP"] diff --git a/tests/test_bytecode_metadata.py b/tests/test_bytecode_metadata.py index 2a06de0..bf5fdfe 100644 --- a/tests/test_bytecode_metadata.py +++ b/tests/test_bytecode_metadata.py @@ -105,6 +105,34 @@ def fake_pull(rpc_url, payload, headers): assert captured["payload"]["params"][0]["data"] == "0x6001600055" +def test_simulate_deployment_uses_default_gas_limit(monkeypatch): + captured = {} + + def fake_pull(rpc_url, payload, headers): + captured["payload"] = json.loads(payload) + return DummyResponse({"result": "0x6001"}) + + monkeypatch.setattr("diffyscan.utils.node_handler.pull", fake_pull) + + simulate_deployment("0x6001", "https://rpc.example") + + assert captured["payload"]["params"][0]["gas"] == hex(100_000_000) + + +def test_simulate_deployment_uses_custom_gas_limit(monkeypatch): + captured = {} + + def fake_pull(rpc_url, payload, headers): + captured["payload"] = json.loads(payload) + return DummyResponse({"result": "0x6001"}) + + monkeypatch.setattr("diffyscan.utils.node_handler.pull", fake_pull) + + simulate_deployment("0x6001", "https://rpc.example", gas_limit=1_000_000_000) + + assert captured["payload"]["params"][0]["gas"] == hex(1_000_000_000) + + def test_simulate_deployment_surfaces_rpc_errors(monkeypatch): def fake_pull(rpc_url, payload, headers): return DummyResponse( diff --git a/tests/test_contract_filter.py b/tests/test_contract_filter.py new file mode 100644 index 0000000..a05c464 --- /dev/null +++ b/tests/test_contract_filter.py @@ -0,0 +1,102 @@ +"""Tests for the --contract / -C filter flag.""" + +import pytest + +CONTRACTS = { + "0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa": "ContractA", + "0xBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBb": "ContractB", + "0xCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCc": "ContractC", +} + + +def apply_filter(contracts, contract_filter): + """Reproduce the filter logic from process_config.""" + filter_set = ( + set(addr.lower() for addr in contract_filter) if contract_filter else None + ) + result = {} + for addr, name in contracts.items(): + if filter_set and addr.lower() not in filter_set: + continue + result[addr] = name + return result + + +def test_no_filter_returns_all(): + assert apply_filter(CONTRACTS, None) == CONTRACTS + assert apply_filter(CONTRACTS, []) == CONTRACTS + + +def test_filter_single_contract(): + filtered = apply_filter(CONTRACTS, ["0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"]) + assert list(filtered.keys()) == ["0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"] + assert filtered["0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"] == "ContractA" + + +def test_filter_multiple_contracts(): + filtered = apply_filter( + CONTRACTS, + [ + "0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa", + "0xCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCc", + ], + ) + assert len(filtered) == 2 + assert "0xBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBb" not in filtered + + +def test_filter_is_case_insensitive(): + filtered = apply_filter(CONTRACTS, ["0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]) + assert len(filtered) == 1 + assert "ContractA" in filtered.values() + + +def filter_matched_any(config_contracts, contract_filter): + """Reproduce the run-level check from main: did the filter match any contract?""" + if not contract_filter: + return True + return any( + apply_filter(contracts, contract_filter) for contracts in config_contracts + ) + + +def test_filter_nonexistent_address_returns_empty(): + filtered = apply_filter(CONTRACTS, ["0x0000000000000000000000000000000000000000"]) + assert filtered == {} + + +def test_filter_matching_nothing_is_an_error(): + # A filter that matches no contract in any config is a usage error (exit non-zero). + assert ( + filter_matched_any([CONTRACTS], ["0x0000000000000000000000000000000000000000"]) + is False + ) + + +def test_filter_matching_in_any_config_is_ok(): + # Matching at least one contract in one of several configs is fine. + other = {"0xDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDd": "ContractD"} + assert ( + filter_matched_any( + [other, CONTRACTS], ["0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"] + ) + is True + ) + + +def test_no_filter_is_never_an_error(): + assert filter_matched_any([CONTRACTS], None) is True + assert filter_matched_any([CONTRACTS], []) is True + + +def test_filter_mixed_case_multiple(): + filtered = apply_filter( + CONTRACTS, + [ + "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", + ], + ) + assert len(filtered) == 2 + names = set(filtered.values()) + assert names == {"ContractB", "ContractC"}