Forge vault 48-hour timelock for adapter changes
How Forge schedules and executes adapter additions on Base mainnet — 48h delay, pending ops, P2-C0 Core expansion, and Middle vault activation.
Last updated: May 26, 2026 · Published 2026-05-26
Forge Treasury smart contracts are unaudited. Yield is variable and not guaranteed. Read Risks & Disclosures before depositing USDC or integrating MCP tools.
Every ForgeVault on Base mainnet routes USDC through modular adapters — Spark Savings, Morpho curated vaults, Aave V3, and (on the Middle bucket) LST and avUSDC legs. Changing that adapter book is not a hot-swappable admin call. The vault owner must schedule adapter additions, weight changes, or removals on a 48-hour timelock, wait for the delay to elapse, then execute on-chain. Integrators, agents, and treasury operators who treat adapter lists as static will mis-price risk. This guide explains how Forge timelock governance works, what appears on-chain during the waiting period, and how to monitor pending changes before you deposit.
Timelock elapsed — owner may execute scheduled adapter update.
Why a 48-hour delay exists
Yield vaults that can reallocate capital instantly create information asymmetry: the owner could schedule a risky adapter milliseconds before a large deposit lands. Forge inherits a Compound-style timelock pattern via `TimelockController` mixed into `ForgeVault`. On Base mainnet (chain ID `8453`), `_delay()` returns 172800 seconds — exactly 48 hours. Base Sepolia testnet (chain ID `84532`) uses zero delay for engineering velocity; do not extrapolate Sepolia behavior to mainnet.
- Transparency — pending ops are visible in contract storage and events before execution.
- Exit window — depositors who disagree with a scheduled change can withdraw before execute (subject to liquidity and gas).
- Integrator lead time — MCP clients and dashboards can warn users when `adapterCount` is about to change.
- Operational discipline — owner batches (P2-C0 Core expansion, Middle four-adapter book) follow the same cadence.
Schedule vs execute — the two-step flow
Adapter governance uses paired functions: `scheduleSetAdapter` / `executeSetAdapter` and `scheduleRemoveAdapter` / `executeRemoveAdapter`. Scheduling writes a `PendingAdapterChange` struct keyed by an `opId` bytes32 hash that includes the vault address (post audit fix F-L-01) so multiple ForgeVaults on the same chain cannot collide. Execution checks that `block.timestamp >= scheduledAt + delay` before mutating the live adapter array.
| Phase | Function | On-chain effect | Depositor impact |
|---|---|---|---|
| Schedule | scheduleSetAdapter(adapter, bps, index) | Pending op stored; event emitted | None — live book unchanged |
| Wait | — | 48h clock runs | Integrators should monitor pending ops |
| Execute | executeSetAdapter(opId) | Adapter array + bps updated | Next deposit/withdraw routes new book |
| Remove | scheduleRemoveAdapter / executeRemoveAdapter | Adapter deactivated or removed | Withdraw path may skip leg |
What integrators see during the waiting period
Between schedule and execute, `adapterCount` and live allocation bps do not change. A Middle vault with `adapterCount = 0` remains empty until execute — even if four adapters were scheduled days earlier. This is the most common integration bug: reading MCP vault info or Stats and assuming scheduled adapters are already routing deposits. Cross-check Basescan for `AdapterScheduled` events and pending op mappings.
- Owner broadcasts `scheduleSetAdapter` with target adapter address and basis-point weight.
- Forge emits `AdapterScheduled(opId, adapter, allocationBps)`.
- Subgraph and Stats may show target rows separately from live rows when wired.
- After 48h, owner calls `executeSetAdapter(opId)`.
- Forge emits `AdapterUpdated(index, adapter, allocationBps)` — book is live.
- First deposit after expansion may need elevated gas (~4M on Core post P2-C0) — see Base gas limits.
P2-C0 Core expansion (reference timeline)
Track P2-C0 expands the Core vault from three adapters (Spark / Morpho Steakhouse / Aave) to five legs including Gauntlet Prime and Steakhouse HY. Scheduling occurred in May 2026 with execute windows around May 27, 2026 UTC. Until Batch B execute completes, live weights remain Phase 1. Agents running Conservative strategy should re-read adapter bps on every deposit — the book changes without a frontend deploy.
| Leg | Phase 1 (live pre-execute) | Post P2-C0 (scheduled) |
|---|---|---|
| Spark Savings USDC | 6000 | 3500 |
| Morpho Steakhouse Prime | 2500 | 2250 |
| Morpho Gauntlet Prime | — | 1500 |
| Morpho Steakhouse HY | — | 1250 |
| Aave V3 USDC | 1500 | 1500 |
Middle vault timelock (Balanced strategy dependency)
The Middle vault at `0x7c77a29f761C9Bf4fA4Be5Ae3fa527690DE60307` on Base mainnet deployed with four adapters scheduled — wstETH, cbETH, Avantis avUSDC, and Moonwell Flagship. Until execute, `adapterCount = 0` and fmUSDC deposits route nowhere useful. Balanced strategy agents must verify Middle execution before splitting USDC across Core + Middle. Do not confuse this address with legacy Sepolia docs — always label Base mainnet Middle.
- WstETH adapter — LST exposure via Lido + Aerodrome swap path.
- CbETH adapter — Coinbase LST leg with similar swap mechanics.
- Avantis avUSDC — perp LP ERC-4626; higher complexity and counsel review for marketing.
- Moonwell Flagship — Morpho-curated USDC leg in the Middle book.
Withdraw ordering and timelock interaction
Adapter index order affects withdraw sequencing in `_redeemFromAdapters`. Product canon schedules Aave last on Core — deepest secondary liquidity and utilization buffer. Timelock changes that insert Aave at a lower index would alter withdraw priority; integrators should read post-execute index assignments, not just bps weights. A single adapter revert no longer bricks the entire vault (audit fix F-C-04 uses try/catch per leg), but partial liquidity can still delay full exits.
Monitoring pending timelocks
Use three layers: on-chain (Basescan events + `pendingAdapterChanges` reads), Forge subgraph (Adapter entities after `AdapterUpdated`), and **Stats** (human-readable adapter table + share price). Subgraph indexing lags blocks — for dispute resolution or large deposits, prefer direct RPC reads via viem or cast. MCP `forge_get_vault_info` should surface warnings when known pending ops exist; treat MCP as convenience, not sole source of truth.
| Source | Best for | Lag / caveat |
|---|---|---|
| Basescan contract reads | authoritative adapterCount + bps | None — source of truth |
| AdapterScheduled events | pending ops before execute | Must parse logs manually |
| Stats / subgraph | dashboards + 24h volume | Minutes behind head |
| MCP vault info | agent automation | Depends on server config refresh |
Sepolia vs mainnet timelock behavior
Base Sepolia ForgeVault uses `_delay() == 0`, enabling `addAdapterForTestnet` for rapid iteration. Testnet adapter books can change in a single transaction block — never use Sepolia timelock assumptions when writing mainnet agent policies. Sepolia vault addresses and USDC (`0x036CbD53842c5426634e7929541eC2318f3dCF7e`) differ from mainnet. Full testnet handoff: `docs/SEPOLIA_DEPLOY.md` via site docs.
Agent policy templates
Production agents should encode timelock awareness in system prompts: (1) read `adapterCount` before deposit; (2) if Stats shows pending targets, surface a human-readable warning; (3) re-simulate gas after execute — multi-adapter first deposits need ~4M limit on Core; (4) block Balanced routing until Middle `adapterCount >= 4`. Pair with MCP-native treasury for calldata-only integration and monitor vault share price for ongoing NAV checks.
- Poll vault info at most once per block — respect RPC rate limits.
- Cache adapter bps with TTL ≤ 1 hour on mainnet during active timelock windows.
- Log `opId` when warnings fire — aids post-mortems if execute surprises users.
- Never auto-deposit maximum balance within minutes of detected `AdapterScheduled` unless policy explicitly allows.
Relationship to pause and emergency controls
Timelock governs structural changes (adapters, weights). Separate from timelock, the owner can `pause(expiresAt)` with a maximum 30-day bounded window (audit fix F-M-04). Pauses block deposits and withdraws until expiry or explicit unpause. Aave, Morpho, or Spark can also pause markets independently — Forge timelock does not control upstream protocol guardians. Risk disclosure: composability means multiple pause levers.
Frequently asked questions
Can the owner skip the 48-hour delay on mainnet?
No. Mainnet `_delay()` is fixed at 48 hours in the TimelockController mixin. Only chains with zero delay (Sepolia testnet) allow instant adapter adds via testnet helpers.
Do scheduled adapters earn yield before execute?
No. USDC routes only through executed, active adapters. Pending schedules are metadata until execute mutates the adapter array.
What happens if execute is never called?
The live book remains unchanged indefinitely. Pending ops occupy storage but do not affect deposit routing. Owner can abandon a schedule (no execute) without on-chain cancel in some versions — verify ABI for your deployment.
How does timelock interact with performance fees?
Adapter changes do not reset per-user cost basis. Withdraw fees apply on profit above entry price regardless of which adapter generated yield. See performance fee guide.
Batch operations and opId hygiene
Large governance batches (P2-C0 Core expansion, Middle four-adapter activation) may schedule multiple `scheduleSetAdapter` calls in separate transactions — each generates a distinct `opId`. Execute txs must match the scheduled op exactly; a typo in `opId` reverts with no state change. Owner operations use the Forge deployer key — not agent EOAs. Integrators do not execute timelocks, but should subscribe to `AdapterScheduled` logs filtered by vault address to update internal runbooks. After Batch A execute (adapter adds) and Batch B (removes/reweights), run Core smoke at 4M gas before announcing adapter stability to users.
Communicating timelock windows to end-users
If your agent serves DAO members, surface human-readable timelock copy: "Forge Core adapter weights may change on {execute_date} — live book unchanged until then." Link Stats and this guide. Do not promise APY stability across timelock boundaries — new Morpho legs change rate exposure. CMO-safe framing: "verify on-chain before deposit" not "guaranteed diversification."
Summary for integrators
Forge adapter governance is schedule → wait 48h → execute on Base mainnet. Live `adapterCount` and bps are unchanged until execute. Monitor Basescan events, Stats, and MCP warnings before deposits — especially during P2-C0 Core expansion and Middle vault activation. Sepolia has zero delay; mainnet does not. Contracts unaudited; timelock is transparency, not insurance. Read Conservative strategy for Core-specific parameters and Risks & Disclosures before moving production USDC.
External resources
Primary protocol documentation and data sources. Forge is not affiliated with these projects; links are for education only.
- Core vault — Basescan ↗Live ForgeVault — read adapterCount and events.
- Middle vault — Basescan ↗Middle bucket — verify adapterCount before Balanced deposits.
- OpenZeppelin TimelockController ↗Reference pattern Forge adapts for adapter ops.
- Forge Stats dashboard ↗Live adapter table, share price, subgraph-backed KPIs.
- Product profiles canon ↗Core / Middle / Infra vault buckets and adapter targets.
Related reading
- Conservative strategy: Core vault explainedThe Conservative agent strategy routes USDC to the Core vault — Spark Savings, Morpho Steakhouse Prime, and Aave V3 on Base mainnet.
- Balanced strategy: routing across Core and MiddleDefault 50/40/10 weights across Core, Middle, and Infra vaults — and how to deposit while Middle timelock is pending.
- Base gas limits for your first Forge vault depositWhy Forge multi-adapter deposits need explicit gas limits on Base — 2.5M, 4M, and 6M ceilings for Core and Middle vault smoke tests.
- Monitor vault share price with subgraph and StatsUse Forge subgraph VaultDayData and the /stats dashboard to track NAV, 24h volume, and adapter state — without fake APY constants.
Share this article
Draft copy for social posts — review before publishing. URL: https://forgetreasury.com/learn/forge-vault-48-hour-timelock-adapters
Open Graph / preview card
Forge 48h timelock — adapter governance explained Adapter changes on Forge vaults require schedule + 48h wait + execute on Base mainnet. Monitor pending ops before deposit. Unaudited MVP. https://forgetreasury.com/learn/forge-vault-48-hour-timelock-adapters
Twitter / X
Forge adapter books are not static. Mainnet changes use a 48-hour timelock — schedule, wait, execute. Check adapterCount before deposit: https://forgetreasury.com/learn/forge-vault-48-hour-timelock-adapters
Yield vault integrators often assume adapter lists are fixed. Forge Treasury uses a 48-hour on-chain timelock for every adapter add, weight change, or removal on Base mainnet. This guide covers pending ops, P2-C0 Core expansion, and Middle vault activation — with monitoring via Stats and Basescan. Educational only; contracts unaudited: https://forgetreasury.com/learn/forge-vault-48-hour-timelock-adapters