Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
6920f3f
Task #375: Task 375 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
37f3404
sentinel_01 HB#385-416 session: AUDIT_DB growth + Capture-cluster dis…
ClawDAOBot Apr 15, 2026
41628f4
Merge remote-tracking branch 'origin/main' into agent/sprint-3
ClawDAOBot Apr 15, 2026
ba77334
Task #376: Task 376 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
dccbd50
AUDIT_DB v3.1: +5 DeFi entries, +1 low-Gini outlier
ClawDAOBot Apr 15, 2026
403798d
Task #377: post-x-thread.mjs implementation + skill update + tweet 8 fix
ClawDAOBot Apr 15, 2026
9e92078
Merge remote-tracking branch 'origin/main' into agent/sprint-3
ClawDAOBot Apr 15, 2026
8ef3dcb
Task #379: Task 379 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
113c490
Task #378: mitigate pop vote list subgraph-indexer lag via on-chain p…
ClawDAOBot Apr 15, 2026
6c5b7b0
Task #378 follow-up: extend subgraph-lag mitigation to DD branch
ClawDAOBot Apr 15, 2026
57324e4
AUDIT_DB v3.2: +5 entries (3 new + 2 restored), dataset now 66 DAOs
ClawDAOBot Apr 15, 2026
8bba37f
Capture Cluster v1.1: BendDAO methodology illustration
ClawDAOBot Apr 15, 2026
82e2277
Task #380: Task 380 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
622ebba
Capture Cluster v1.2: veToken methodology-limits section
ClawDAOBot Apr 15, 2026
60a6fb9
Merge remote-tracking branch 'origin/main' into agent/sprint-3
ClawDAOBot Apr 15, 2026
d6a2ba5
Task #382: Task 382 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
623f043
Task #383: pop org audit-vetoken — on-chain veCRV-family top-holder p…
ClawDAOBot Apr 15, 2026
16d0263
Capture Cluster v1.3: Convex cascade + live on-chain Curve veCRV numbers
ClawDAOBot Apr 15, 2026
82d8bc6
audit-vetoken: accept mixed-case addresses (HB#445 UX fix)
ClawDAOBot Apr 15, 2026
e4353bb
OPERATOR-STATE.md refresh: HB#432-445 sentinel substantive-work arc
ClawDAOBot Apr 15, 2026
cfa94fb
Task #384: Task 384 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
7f40dd5
Task #387: Task 387 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
ae43c7b
Add audit-vetoken skill SKILL.md (HB#447)
ClawDAOBot Apr 15, 2026
be30ab9
brain: refresh pop.brain.shared.generated.md with vigil_01 local view…
ClawDAOBot Apr 15, 2026
f41a322
Task #386: audit-vetoken --enumerate mode (Deposit-event discovery)
ClawDAOBot Apr 15, 2026
c07fe88
Capture Cluster v1.4: Balancer Aura cascade confirmed (67.95% top-1)
ClawDAOBot Apr 15, 2026
886f5d8
Merge remote-tracking branch 'origin/main' into agent/sprint-3
ClawDAOBot Apr 15, 2026
8fa08b9
Task #388: Task 388 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
7f43ecd
AUDIT_DB +2: Tokemak (0.956 Gini, 181v, 38.9% top), ShapeShift (0.778…
ClawDAOBot Apr 15, 2026
dc43027
AUDIT_DB +1: Starknet (L2, 0.85 Gini but only 10.5% top voter — distr…
ClawDAOBot Apr 15, 2026
682a186
Four Architectures v2.5 errata: veToken methodology gap + dataset upd…
ClawDAOBot Apr 15, 2026
7fbbc4d
distribution/INDEX.md: latest pins (HB#454)
ClawDAOBot Apr 15, 2026
650ef21
AUDIT_DB v3.3 pin (69 DAOs, HB#455 cascade-probing HB)
ClawDAOBot Apr 15, 2026
8bb302f
Task #390: Task 390 — submitted via pop task submit
ClawDAOBot Apr 15, 2026
62d8c02
Task #389: audit-vetoken --enumerate-transfers mode
ClawDAOBot Apr 15, 2026
a2dfa0a
Merge remote-tracking branch 'origin/main' into agent/sprint-3
Apr 15, 2026
844a02f
Task #391: corpus identity sweep — clean result + honest rename
ClawDAOBot Apr 15, 2026
60ada39
Task #394: Task 394 — submitted via pop task submit
hudsonhrh Apr 15, 2026
25c1b98
Cascade fingerprinting methodology — standalone citable doc
ClawDAOBot Apr 15, 2026
cec729f
AUDIT_DB +1: Optimism Citizens House (60 voters, Gini 0.365, 54% pass…
ClawDAOBot Apr 15, 2026
c9284d4
Task #393: fix broken main build — close 3 half-finished imports
ClawDAOBot Apr 15, 2026
333950b
Task #395: Task 395 — submitted via pop task submit
hudsonhrh Apr 15, 2026
c13f68b
Merge remote-tracking branch 'origin/main' into agent/sprint-3
Apr 15, 2026
95ddb87
AUDIT_DB Lido refresh: 0.904 → 0.862 (substantive reversal, HB#466)
ClawDAOBot Apr 15, 2026
1fe4133
distribution/INDEX.md: record HB#466 Lido second-reversal restatement
ClawDAOBot Apr 15, 2026
0a38003
Task #396: Task 396 — submitted via pop task submit
hudsonhrh Apr 15, 2026
88c00c4
Four Architectures v2.5 errata v1.1: Lido restatement + Delegated Cou…
ClawDAOBot Apr 15, 2026
cfccc1e
gitignore: stop tracking auto-gen/transient state (HB#469 hygiene)
ClawDAOBot Apr 15, 2026
b4c7988
Task #397: Task 397 — submitted via pop task submit
hudsonhrh Apr 15, 2026
eaaf5e0
AUDIT_DB +1: BitDAO — 654 voters (largest in dataset), 17% top despit…
ClawDAOBot Apr 15, 2026
36860cd
Task #393 pt2: commit 9 orphaned files referenced by committed imports
ClawDAOBot Apr 15, 2026
5c39574
Merge remote-tracking branch 'origin/main' into agent/sprint-3
Apr 15, 2026
56133fc
AUDIT_DB +1: Argus (self) — first internal audit, Gini 0.122 (dataset…
ClawDAOBot Apr 15, 2026
7fa3c6a
Task #398: Task 398 — submitted via pop task submit
hudsonhrh Apr 15, 2026
16602eb
Task #399: add minimal GitHub Actions CI workflow
ClawDAOBot Apr 15, 2026
c529d9b
Argus self-audit standalone research artifact (HB#477)
ClawDAOBot Apr 15, 2026
14f89d3
Merge remote-tracking branch 'origin/main' into agent/sprint-3
Apr 15, 2026
94b9b02
Task #400: Task 400 — submitted via pop task submit
hudsonhrh Apr 15, 2026
47f7070
Argus self-audit v1.1: role specialization reframe + sentinel_01 zero…
ClawDAOBot Apr 15, 2026
a43d53d
Task #401: Task 401 — submitted via pop task submit
hudsonhrh Apr 15, 2026
b7c5395
OPERATOR-STATE.md HB#480 refresh: Argus self-audit headline
ClawDAOBot Apr 15, 2026
3fc429b
Merge remote-tracking branch 'origin/main' into agent/sprint-3
Apr 15, 2026
bf8a646
AUDIT_DB HB#486 hygiene: remove stale Optimism duplicate + merge L2/z…
ClawDAOBot Apr 15, 2026
9268ebc
Task #404: Task 404 — submitted via pop task submit
hudsonhrh Apr 15, 2026
6bb0b4f
Task #385: on-chain fallback probe for pop task view (HB#223 asymmetr…
ClawDAOBot Apr 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 157 additions & 0 deletions agent/artifacts/audits/solidly-venft-audit-hb296.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
# Velodrome V2 + Aerodrome veNFT Governance Audit

**Targets**:
- Velodrome V2 VotingEscrow: `0xFAf8FD17D9840595845582fCB047DF13f006787d` (Optimism, chain 10)
- Aerodrome VotingEscrow: `0xeBf418Fe2512e7E6bd9b87a8F0f294aCDC67e6B4` (Base, chain 8453)

**Shipped**: HB#296 task #404 (argus_prime / ClawDAOBot)
**Category**: C — veToken / staking governance, new **C-Solidly-veNFT** sub-family
**Method**: `pop org probe-access` against a vendored `src/abi/external/SolidlyVotingEscrow.json` ABI (camelCase Solidly function names, not Curve's snake_case), burner-callStatic

## TL;DR

Velodrome V2 and Aerodrome are **bytecode-sibling Solidity implementations** of Andre Cronje's Solidly vote-escrow pattern. They use **NFT positions** (ERC721) instead of non-transferable locked balances, which is a fundamental architectural departure from the Curve-family veToken model (Curve, Balancer, Frax). Every write function returned a **custom-error revert** from the burner — NONE passed — giving a 10/10 gate rate with clean access control signal.

**Decoded custom errors** (all match Solidly V2 source):
- `ZeroAmount()` (0x1f2a2005) — parameter validation on `createLock` / `createLockFor`
- `NotApprovedOrOwner()` (0xe433766c) — ERC721 ownership gate on token-id ops (`increaseAmount`, `increaseUnlockTime`, `withdraw`, `transferFrom`)
- `SameNFT()` (0x93b50ef2) — state check on `merge`
- **`NotTeam()` (0xe9f3e974)** — admin gate on `setTeam`, `setArtProxy`
- **`NotVoter()` (0xc18384c1)** — privileged-caller gate on `setVoterAndDistributor`

**Both admin functions are properly gated by custom error reverts.** This is exactly the pattern probe-access was built to detect cleanly, and Velodrome/Aerodrome demonstrate it textbook-perfectly.

**Scores**:
- Velodrome V2 veNFT: **85/100** (C-Solidly-veNFT, rank 1)
- Aerodrome veNFT: **85/100** (C-Solidly-veNFT, rank 1 tied — direct bytecode-sibling fork)

## Methodology

1. **ABI vendoring**: Solidly veNFT uses camelCase function names (`createLock`, `increaseAmount`) instead of Curve's snake_case (`create_lock`, `increase_amount`). Created `src/abi/external/SolidlyVotingEscrow.json` with the 15-function Solidly write + view surface. Reusing the existing CurveVotingEscrow.json ABI would have returned `not-implemented` for every function.
2. **Identity check** (HB#385): both contracts return `name() = "veNFT"`. HB#291 pre-registered `velodrome → venft` and `aerodrome → venft` aliases in `src/lib/label-aliases.ts`; `--expected-name Velodrome` / `--expected-name Aerodrome` both match ✓.
3. **Family detection** (HB#292): the existing `voteEscrow` triad check (create_lock + increase_unlock_time + locked__end, all snake_case) does NOT fire on Solidly veNFT because those selectors are absent. This is a **methodology gap** — filed as a Sprint 14 follow-up to extend detection with a Solidly triad (createLock + increaseUnlockTime + team).
4. **Function probe** (11 functions via SolidlyVotingEscrow.json): burner-callStatic against each.
5. **Admin resolution**: `team()` and `voter()` live-fetched via eth_call.

## Results

### Velodrome V2 (Optimism)

| Function | Status | Error Selector | Decoded |
|---|---|---|---|
| `createLock(uint256,uint256)` | gated | `0x1f2a2005` | **`ZeroAmount()`** — param validation |
| `createLockFor(uint256,uint256,address)` | gated | `0x1f2a2005` | **`ZeroAmount()`** |
| `increaseAmount(uint256,uint256)` | gated | `0xe433766c` | **`NotApprovedOrOwner()`** — ERC721 gate |
| `increaseUnlockTime(uint256,uint256)` | gated | `0xe433766c` | **`NotApprovedOrOwner()`** |
| `withdraw(uint256)` | gated | `0xe433766c` | **`NotApprovedOrOwner()`** |
| `merge(uint256,uint256)` | gated | `0x93b50ef2` | **`SameNFT()`** |
| `setTeam(address)` | **gated (admin)** | `0xe9f3e974` | **`NotTeam()`** — ADMIN GATE ✓ |
| `setArtProxy(address)` | **gated (admin)** | `0xe9f3e974` | **`NotTeam()`** — ADMIN GATE ✓ |
| `setVoterAndDistributor(address,address)` | **gated (admin)** | `0xc18384c1` | **`NotVoter()`** — ADMIN GATE ✓ |
| `transferFrom(address,address,uint256)` | gated | `0xe433766c` | **`NotApprovedOrOwner()`** |
| `delegate(address)` | not-implemented | — | Selector absent — Velodrome V2 doesn't use ERC5805 delegation |

**10 gated / 0 passed / 1 not-implemented**. Clean result.

### Aerodrome (Base)

Identical results to Velodrome V2 on every selector — same custom error codes in the same positions, confirming Aerodrome is a bytecode-sibling fork of Velodrome V2 with only chain + deployment-param differences. `delegate` also not-implemented.

**10 gated / 0 passed / 1 not-implemented**.

### Admin resolution

| DAO | team() | Code size | voter() | Code size |
|---|---|---|---|---|
| Velodrome V2 | `0x0a16cb36b553ba2bb2339f3b206a965e9841d305` | 812 bytes | `0x41c914ee0c7e1a5edcd0295623e6dc557b5abf3c` | (not fetched) |
| Aerodrome | `0xee5b3c7b333e2870b746b3b2b168ef0958e55e15` | 10993 bytes | `0x16613524e02ad97edfef371bc883f2f5d6c480a5` | (not fetched) |

**Both `team()` are contracts, not EOAs.** Velodrome's 812-byte team is consistent with a small Gnosis Safe proxy or minimal multisig. Aerodrome's 10993-byte team is much larger — likely a full governance timelock or multisig implementation with execution logic. Deeper admin classification (signer set, threshold, timelock delay) would require manual inspection, filed as follow-up.

## Findings

### F-1 (STRONG POSITIVE — ADMIN GATES WORKING)

**Both `setTeam` and `setArtProxy` revert with `NotTeam()` for non-team callers.** `setVoterAndDistributor` reverts with `NotVoter()`. The Solidity authors implemented proper custom-error access control on all 3 admin mutators, and probe-access identifies them cleanly.

This is what a well-gated Solidity vote-escrow looks like. Contrast with Balancer veBAL (HB#293), which had 2 admin functions (`commit/apply_smart_wallet_checker`) passing from burner due to a methodology quirk or a real silent-check — Velodrome V2 / Aerodrome have no such ambiguity.

### F-2 (ARCHITECTURAL — NFT POSITIONS, NOT BALANCES)

**veNFT is fundamentally different from Curve-family veCRV.** Curve/Balancer/Frax lock tokens into per-address balances that decay over time; Solidly locks into ERC721 token positions that can be transferred, merged, and split. This means:
- `transferFrom` is a write method (with NotApprovedOrOwner gate)
- `merge` combines two positions
- Lock positions are tradable NFTs — the "bribes for gauge votes" market (Convex, Votium, Hidden Hand) has a different shape than in Curve because positions themselves are transferable
- Liquid staking / wrapped veNFT protocols can built around it

The HB#292 `voteEscrow` family tag does NOT fire on veNFT (it checks for Curve snake_case selectors). **Filed as Sprint 14 follow-up**: extend detection with a Solidly triad (createLock + increaseUnlockTime + team, all camelCase) so future Solidly family audits surface the family tag automatically.

### F-3 (BYTECODE-SIBLING FORK)

**Aerodrome is a bytecode-sibling of Velodrome V2.** Every probed selector returned the exact same custom-error code from burner-callStatic. This is strong evidence that Aerodrome is a direct fork with only chain/constructor parameter changes, not a re-implementation. Security implications: Velodrome V2 audits should apply to Aerodrome with high confidence (shared attack surface), but any Velodrome-specific finding should be verified against Aerodrome separately since deployment state differs.

## Scoring

Both contracts score **85/100** in Category **C-Solidly-veNFT**:

| Component | Points | Notes |
|---|---|---|
| Access gates (30 max) | 30 | 3/3 admin functions gated with custom errors. Perfect. |
| Verbosity (25 max) | 22 | Custom errors are decoded to meaningful names (NotTeam, NotVoter, ZeroAmount, NotApprovedOrOwner, SameNFT). Lose a few points only because custom errors need off-chain selector decoding rather than being plain strings. |
| Passes credit (20 max) | 18 | Zero suspicious passes. The only "not-implemented" is `delegate` which is a known design choice (veNFT doesn't support ERC5805). |
| Architecture (25 max) | 15 | Solidly Solidity fork avoids Vyper caveat (+5). ERC721 model is security-positive in some ways (transferable positions) and security-negative in others (more surface area than monolithic balances). Team is a contract (+5). Aerodrome team is 10993 bytes suggesting proper governance contract (+5). Deducted points because deeper team classification wasn't done in this ship. |

Both rank #1 in C-Solidly-veNFT (tied, since they're bytecode siblings).

## Leaderboard v3 Category C — after this ship

| Rank | DAO | Score | Sub-family | Chain |
|---|---|---|---|---|
| **1** | **Velodrome V2 veNFT** | **85** | C-Solidly-veNFT | Optimism |
| **1 (tied)** | **Aerodrome veNFT** | **85** | C-Solidly-veNFT | Base |
| 2 | Balancer veBAL | 45 (floor) | C-Solidity-fork Curve | Ethereum |
| 3 | Curve VE + GC | 30 (legacy) | C-Vyper | Ethereum |
| n/a | Frax veFXS | n/a | C-Vyper (tool-limited) | Ethereum |

**Category C now has 3 meaningful sub-families**: Curve-style Vyper veCRV (probe-limited), Curve-style Solidity veCRV (Balancer — probe-reliable), and Solidly veNFT (Velodrome/Aerodrome — probe-reliable, NFT positions). Scores comparable within sub-family only.

## Sprint 14 P1 status

This ship completes **Sprint 14 rank 1** (execute pending[] veToken audits):

| Target | Status | HB | Score |
|---|---|---|---|
| Balancer veBAL | ✓ shipped | 293 | 45 floor |
| Frax veFXS | ✓ shipped | 294 | n/a (C-Vyper) |
| Velodrome V2 | ✓ shipped (this audit) | 296 | 85 |
| Aerodrome | ✓ shipped (this audit) | 296 | 85 |

Pending queue in `audit-corpus-index.json` is now **empty**.

## Cross-references

- HB#290 task #395 — LABEL_ALIASES integration
- HB#291 task #396 — pre-registered `velodrome → {velo, venft}`, `aerodrome → {aero, venft}`
- HB#292 task #398 — `voteEscrow` family tag (Curve triad; Solidly triad extension needed as follow-up)
- HB#293 task #400 — Balancer veBAL (C-Solidity-fork Curve contrast)
- HB#294 task #401 — Frax veFXS (C-Vyper contrast)
- Probe artifacts: `agent/scripts/probe-velodrome-venft-optimism.json`, `agent/scripts/probe-aerodrome-venft-base.json`
- Vendored ABI: `src/abi/external/SolidlyVotingEscrow.json`

## What this audit proves

**Proves**:
- Velodrome V2 and Aerodrome admin functions are properly gated with custom-error access control
- Aerodrome is a bytecode-sibling fork of Velodrome V2 (identical selector-to-error mapping)
- The Solidly veNFT pattern is probe-reliable and scores cleanly (no Vyper or silent-check issues)
- The HB#290-292 tooling chain extends to new selector conventions by vendoring minimal ABIs

**Doesn't prove**:
- Whether the `team()` signer set is well-distributed or captured (would need manual signer inspection)
- Whether the veNFT-transferability opens attack surfaces that monolithic veToken contracts don't have (architectural review, not probe-based)
- Whether `voter` contract's privileged calls are themselves well-audited (separate audit)
- Gauge bribing dynamics, emission governance, or off-chain governance (orthogonal concerns)

---

*Argus audit corpus entries #17 and #18. Completes Sprint 14 P1 veToken batch. Bytecode-sibling fork = 1 audit covers 2 DAOs; the efficiency gain is why rank 1 is tied.*
81 changes: 57 additions & 24 deletions agent/brain/Knowledge/audit-corpus-index.json
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,51 @@
"Ecosystem note: the veToken model has been forked into 30+ DAOs (Balancer, Frax, Velodrome, Aerodrome, Aura, Yearn, Convex, Beethoven X). Each would score similarly weak via burner-callStatic probing."
]
},
{
"address": "0xFAf8FD17D9840595845582fCB047DF13f006787d",
"chainId": 10,
"canonicalName": "veNFT",
"filenameLabel": "Velodrome V2 veNFT",
"category": "C",
"categoryLabel": "veToken / staking governance (Solidly veNFT, probe-reliable)",
"score": 85,
"scoreStatus": "clean — all admin functions gated with custom-error reverts",
"auditHB": 296,
"sourceFile": "agent/scripts/probe-velodrome-venft-optimism.json",
"reportFile": "agent/artifacts/audits/solidly-venft-audit-hb296.md",
"leaderboardRank": 1,
"lastVerified": "2026-04-15T18:30:00Z",
"notes": [
"Solidly veNFT — NFT-position vote-escrow (ERC721), architecturally distinct from Curve-family veCRV. Uses camelCase function names (createLock, increaseAmount, increaseUnlockTime) not Curve's snake_case.",
"11 functions probed via new src/abi/external/SolidlyVotingEscrow.json. 10 gated with CUSTOM ERRORS, 0 passed, 1 not-implemented (delegate — veNFT doesn't support ERC5805).",
"Custom errors decoded: ZeroAmount (0x1f2a2005), NotApprovedOrOwner (0xe433766c), SameNFT (0x93b50ef2), NotTeam (0xe9f3e974 — ADMIN GATE), NotVoter (0xc18384c1 — ADMIN GATE).",
"F-1 STRONG POSITIVE: 3/3 admin functions (setTeam, setArtProxy, setVoterAndDistributor) properly gated via custom errors. Clean Solidity access control. Contrast Balancer's 2 indeterminate findings — Velodrome has zero ambiguity.",
"F-2 ARCHITECTURAL: NFT positions are transferable/mergeable, fundamentally different from Curve's locked balances. HB#292 voteEscrow detection does NOT fire (checks Curve snake_case selectors). Needs Solidly triad extension — filed as Sprint 14 follow-up.",
"F-3 BYTECODE-SIBLING: Aerodrome (Base) returns IDENTICAL custom error codes on every selector — confirmed direct fork of Velodrome V2.",
"team() = 0x0a16cb36b553ba2bb2339f3b206a965e9841d305 (812 bytes, Gnosis Safe shape). voter() = 0x41c914ee0c7e1a5edcd0295623e6dc557b5abf3c."
]
},
{
"address": "0xeBf418Fe2512e7E6bd9b87a8F0f294aCDC67e6B4",
"chainId": 8453,
"canonicalName": "veNFT",
"filenameLabel": "Aerodrome veNFT",
"category": "C",
"categoryLabel": "veToken / staking governance (Solidly veNFT, probe-reliable)",
"score": 85,
"scoreStatus": "clean — bytecode-sibling of Velodrome V2, identical error codes on every selector",
"auditHB": 296,
"sourceFile": "agent/scripts/probe-aerodrome-venft-base.json",
"reportFile": "agent/artifacts/audits/solidly-venft-audit-hb296.md",
"leaderboardRank": 1,
"lastVerified": "2026-04-15T18:30:00Z",
"notes": [
"DIRECT bytecode-sibling fork of Velodrome V2. Every probed selector returned the exact same custom-error code as Velodrome V2 — this audit covers both.",
"team() = 0xee5b3c7b333e2870b746b3b2b168ef0958e55e15 (10993 bytes — larger than Velodrome's team, likely a full governance timelock or signer-set contract with execution logic).",
"Score 85 tied with Velodrome V2 because the bytecode is sibling-identical; differences are constructor params + chain deployment, not code.",
"See solidly-venft-audit-hb296.md for shared methodology and findings. Any Velodrome-specific finding should be verified against Aerodrome separately because deployment state differs even when bytecode matches."
]
},
{
"address": "0xc8418aF6358FFddA74e09Ca9CC3Fe03Ca6aDC5b0",
"chainId": 1,
Expand Down Expand Up @@ -322,42 +367,30 @@
},
"schemaVersion": 1,
"meta": {
"totalEntries": 15,
"rankedEntries": 13,
"totalEntries": 17,
"rankedEntries": 15,
"unrankedEntries": 2,
"categoryA": 6,
"categoryB": 2,
"categoryC": 4,
"categoryC": 6,
"categoryD": 2,
"corrections": 1,
"lastSweepHB": 386,
"lastSweepResult": "clean (0 mismatches beyond the documented correction)",
"lastAuditHB": 294,
"lastAuditProject": "Frax veFXS"
"lastAuditHB": 296,
"lastAuditProject": "Velodrome V2 + Aerodrome veNFT (Sprint 14 P1 batch complete)"
},
"pending": [
{
"project": "Velodrome",
"label": "veVELO",
"project": "_placeholder",
"label": "Sprint 14 P1 complete — all 4 veToken targets audited",
"address": null,
"chainId": 10,
"expectedOnChainName": "veNFT",
"category": "C",
"notes": [
"Solidly-style veNFT vote-escrow on Optimism. Address TBD; resolve via Velodrome docs before audit.",
"Name alias pre-registered as 'venft' since Solidly contracts don't embed the project name in name()."
]
},
{
"project": "Aerodrome",
"label": "veAERO",
"address": null,
"chainId": 8453,
"expectedOnChainName": "veNFT",
"category": "C",
"chainId": 0,
"expectedOnChainName": null,
"category": null,
"notes": [
"Solidly-fork vote-escrow on Base. Aerodrome is Velodrome's Base-deployed sister project.",
"Same veNFT naming pattern as Velodrome; shared alias registration."
"Sprint 14 P1 (execute pending[] veToken audits) is now complete: Balancer HB#293, Frax HB#294, Velodrome + Aerodrome HB#296. This placeholder entry is kept so downstream consumers can detect the transition (pending.length > 0 vs 0) gracefully.",
"Next candidates for the queue (NOT yet verified on-chain): Aura (AURA), Beethoven X (veBEETS on Fantom), Convex vlCVX, Yearn yCRV, Thena (veTHE on BNB Chain). Add as concrete pending[] entries after live name() verification like HB#291."
]
}
]
Expand Down
1 change: 1 addition & 0 deletions agent/scripts/probe-aerodrome-venft-base.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"address":"0xeBf418Fe2512e7E6bd9b87a8F0f294aCDC67e6B4","chainId":8453,"burnerAddress":"0xB6D01bD45705FA01c92AeBdA7E3C40071CB7503D","contractName":"veNFT","nameCheck":{"expected":"Aerodrome","actual":"veNFT","match":true},"functionsProbed":11,"reliability":{"dsAuth":false,"vyper":false,"voteEscrow":false,"warnings":[]},"results":[{"name":"createLock","selector":"0xb52c05fe","status":"gated","errorName":"unknown(0x1f2a2005)","likelyGate":"unknown selector unknown(0x1f2a2005)"},{"name":"createLockFor","selector":"0xec32e6df","status":"gated","errorName":"unknown(0x1f2a2005)","likelyGate":"unknown selector unknown(0x1f2a2005)"},{"name":"increaseAmount","selector":"0xb2383e55","status":"gated","errorName":"unknown(0xe433766c)","likelyGate":"unknown selector unknown(0xe433766c)"},{"name":"increaseUnlockTime","selector":"0x9d507b8b","status":"gated","errorName":"unknown(0xe433766c)","likelyGate":"unknown selector unknown(0xe433766c)"},{"name":"withdraw","selector":"0x2e1a7d4d","status":"gated","errorName":"unknown(0xe433766c)","likelyGate":"unknown selector unknown(0xe433766c)"},{"name":"merge","selector":"0xd1c2babb","status":"gated","errorName":"unknown(0x93b50ef2)","likelyGate":"unknown selector unknown(0x93b50ef2)"},{"name":"setTeam","selector":"0x095cf5c6","status":"gated","errorName":"unknown(0xe9f3e974)","likelyGate":"unknown selector unknown(0xe9f3e974)"},{"name":"setArtProxy","selector":"0x2e720f7d","status":"gated","errorName":"unknown(0xe9f3e974)","likelyGate":"unknown selector unknown(0xe9f3e974)"},{"name":"setVoterAndDistributor","selector":"0x2d0485ec","status":"gated","errorName":"unknown(0xc18384c1)","likelyGate":"unknown selector unknown(0xc18384c1)"},{"name":"delegate","selector":"0x5c19a95c","status":"not-implemented","likelyGate":"selector not in contract runtime code — function not implemented on this target (ABI/contract family mismatch). Use --skip-code-check for proxies."},{"name":"transferFrom","selector":"0x23b872dd","status":"gated","errorName":"unknown(0xe433766c)","likelyGate":"unknown selector unknown(0xe433766c)"}]}
Loading
Loading