LIP-37: Execution Delegation Framework (EDF)

TL;DR

We propose the Execution Delegation Framework (EDF) — a minimal, audited, protocol-wide primitive for delegating the operational keys of permissioned actors. Governance grants a permission once to a per-entity DelegationContract; the contract’s owner (a cold key or a multisig) then chooses and rotates the active hot signing key freely, without a governance vote.

  • A compromised hot key can be de-authorized by its owner immediately; a replacement becomes effective after a short safety cooldown. Today the same rotation requires a full on-chain governance vote (~10 days).
  • Oracle committee members and DSM guardians are the first adopters. The lido-oracle daemon gains delegation support, and the DepositSecurityModule is redeployed to verify guardian signatures via a standard ERC-1271 check against the guardian’s DelegationContract.
  • Migration is designed to be zero-downtime: operators prepare everything off the critical path, and a single DAO vote flips every prepared seat to delegation at once.

Motivation

Operational compromise is now the dominant cause of losses in the ecosystem. Of the roughly $972 million stolen across a record 207 crypto hacks in the first half of 2026, infrastructure and operational compromises — leaked private keys, compromised administrator credentials, and mishandled signers — accounted for approximately 76% of all funds stolen while representing only about 15% of incidents; smart-contract exploits, by contrast, made up the majority of incidents (125 of 207) but only a small share of the value lost (June Security Beat: Keys Over Code). The largest and least-recoverable losses now come from compromised signers, not flawed code.

Lido’s Oracle members and Deposit Security Module council members currently operate with hot EOA private keys stored directly in off-chain bots. By their very nature these bots must run with hot keys: the key lives on the machine, which makes it inherently exposed. And these keys:

  • carry meaningful protocol permissions (report submission, pause/unvet signing, deposit message signing);
  • may be long-lived with an unclear custody history;
  • require a full on-chain governance vote (~10 days) to rotate — whether after a compromise or as a routine precaution.

That cost cuts both ways. It makes proactive, periodic rotation too expensive to do regularly, so keys live longer than they should. And when a key is suspected, the replacement is only authorized once the vote executes — leaving a potentially compromised key on-chain with its permissions intact, free to harm the protocol until governance acts.

Design

EDF consists of two non-upgradeable contracts:

  • DelegationFactory.sol — a singleton that deploys a fresh DelegationContract per entity;
  • DelegationContract.sol — a minimal delegation contract enforcing a one-owner / one-active-delegate model.

There are exactly two trusted entities:

  ┌──────────┬─────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
  │   Role   │             Custody             │                                                        Capabilities                                                        │
  ├──────────┼─────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │ Owner    │ Safe multisig or cold wallet    │ Assign, reassign, and revoke the delegate; irreversibly terminate() the contract                                           │
  ├──────────┼─────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
  │ Delegate │ Hot key in the off-chain daemon │ Call execute() to dispatch transactions (push); sign messages verified via the contract's ERC-1271 isValidSignature (pull) │
  └──────────┴─────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

Key properties:

  • Immediate revocation, cooldown-gated assignment. revokeDelegate() drops a suspect key instantly. assignDelegate(newKey) schedules a replacement that becomes effective after the contract’s cooldown; during a planned rotation the old key stays effective until the new one activates, so routine rotation has no gap. The cooldown is a reaction window: an unexpected assignment (e.g. from a compromised owner) is visible on-chain for cooldown seconds before the new key can act, so monitoring and governance can react.
  • The owner can never act as the contract. The owner manages the delegate’s lifecycle but cannot execute() or sign.
  • Owner immutability. The owner address is fixed at deployment — there is no ownership-transfer function, so a compromised owner can never lock the legitimate operator out by transferring control. Rotating the owner means deploying a fresh contract and reassigning the seat.
  • Irreversible termination. If the owner key itself is suspected compromised, terminate() permanently disables the contract — execute() and signature verification fail closed, and the role must be reassigned to a fresh contract.
  • Why purpose-built rather than an existing framework: the delegation frameworks we looked into are far more complex and flexible than this role needs, and that unused flexibility is attack and misconfiguration surface. A minimal, non-upgradeable contract makes EDF’s guarantees structural and keeps the audited surface small.

Two integration patterns are supported, so any permissioned bot in the Lido ecosystem can adopt EDF:

  • Push — the delegate calls execute(target, data); the protocol contract sees msg.sender == DelegationContract and authorizes it as the registered permission holder.
  • Pull (ERC-1271) — the delegate signs off-chain; anyone relays the signature plus the DelegationContract address; the protocol verifies it via the contract’s isValidSignature, which resolves the current effective delegate and fails closed if there is none.

Adoption scope: Oracle and DSM

EDF ships together with its first adoption, because the contracts are inert on their own — the integration is what actually closes the hot-key risk:

  • Lido Oracle (push). The lido-oracle daemon gains a DELEGATION_CONTRACT_ADDRESS setting; when set, all oracle contract calls route through the delegation contract’s execute().
  • DepositSecurityModule (pull + push). Every guardian becomes a DelegationContract — EOA guardians are no longer supported. Since a contract guardian can’t be recovered from an ECDSA signature, the guardian address is now supplied explicitly alongside each signature, the signed digest binds the guardian address, and DSM verifies via the guardian’s ERC-1271 isValidSignature, additionally keep a direct path where the guardian’s contract calls DSM via execute().
  • Validator ejector (node-operator side) must resolve the active oracle signing address via getDelegate(), since exit messages are always signed by the delegate EOA.

Migration

Migration is zero-downtime by construction. Operators deploy and publish their DelegationContracts, stage the daemon configuration, and the Lido team registers everything in monitoring — all while the current hot keys keep operating. A single DAO vote then reassigns each Oracle committee and DSM guardian seat to the corresponding DelegationContract address, and the pre-configured daemons begin routing through delegation without interruption. From that point on, hot-key rotation is a local operator action measured in minutes, with no further governance involvement.

Next steps

  • Gather community, operator, and integrator feedback in this thread.
  • Complete security audits of the DelegationFactory / DelegationContract system and the updated DepositSecurityModule.
  • Testnet deployment and a coordinated dry-run of the operator migration process.
  • On-chain governance vote to reassign the Oracle and DSM seats to delegation contracts.

We invite the community, Oracle and DSM operators, and integrators to review the full specification and share feedback before this moves to a vote.

Reference materials

8 Likes

Thank you for bringing this proposal forward. Standardizing the execution delegation primitive is a very smart move to enhance both infrastructure flexibility and security across Lido’s modules. Solid work :rocket:

2 Likes

Hey there — want to state my explicit support. IMO this is a bigger deal than a typical ops improvement, and here’s why.

The current setup may quietly punish honesty. If an oracle member or DSM guardian suspects their hot key has leaked, the “right” move is an emergency governance cycle — roughly ten days of Aragon voting plus all the preps and comms — while the bad key keeps all its permissions. The best you can do in the meantime is ask for components to be paused around you. When disclosure costs that much, the rational move under uncertainty is to wait and hope. That’s how compromises get concealed — not malice, just process tax.

EDF fixes this at the root. The owner calls revokeDelegate() and the key stops working instantly; a replacement queues behind the cooldown and the seat stays online. Rotation becomes something you do on a schedule, not because something already went wrong — reactive flips to proactive. For example, the Chorus One incident last May needed an emergency vote and days of a known-bad key sitting on-chain. Under EDF: one transaction.

Timing matters too. Since late 2025 we have LLMs doing real security research — Anthropic’s red team saw agents go from exploiting ~2% of recent contract vulns to ~56% in a year. Automated probing of operator infra is trending toward free. “Key rotation requires a DAO vote” was already questionable; now it’s untenable.

One of my favorite parts of the proposal: terminate(). Even if the owner key gets compromised, the owner can still irreversibly shut down the whole delegation contract — execute() disabled, ERC-1271 failing closed. A role holder can finally cut itself off voluntarily, instead of the protocol pausing components around a party it can’t trust anymore. All in all, that’s a genuine attack-surface reduction.

One wish while we’re here: the same logic should eventually reach Beacon Chain validator keys. Today a leaked signing key can’t be rotated in place — the only path is exit and re-enter, queues and downtime included. That’s exactly the “wait and hope” incentive EDF removes, just one layer down. Out of Lido contributors’ hands, obviously, but worth mentioning.

Before the vote I’d want the per-seat cooldowns expectations and owner rotation recommendations nailed down. Neither changes my support — happy to see this go to implementation and audit.

2 Likes

Good explanation, Claude!

Jk jk, it’s just that I’m developing an allergy to AI word salads, but it’s actually well explained.

As far as I understand, operators of relevant keys can create their delegations now and the on-chain vote will:

  1. Change the contracts to understand the Delegation roles and enforce it (in the case of the DSM) or know how to retrieve it (in the case of the Ejector)
  2. Simply change the addresses to the delegated addresses

Will this get extended beyond the Oracle and DSM in the future? What are future contracts or committees that are good candidates to become delegate-able?

3 Likes

Basically with EDF introduction, the protocol grants reporting permissions to a specific entity. Everything else is entirely up to that entity. (e.g., when to rotate the reporting key and which key to use).

So, EDF can be used anywhere permissions are granted to an EOA. Replacing an EOA with an EDF, which provides greater flexibility.

We also plan to use EDF in the permissioned depositor bot introduced in LIP-35.

2 Likes

It is also important to mention that Lido contributors are working on the ERC for the core part of EDF. The primary reason for it, as @Raman_Siamionau mentioned, is to allow any on-chain protocol to use some form of EDF contracts instead of EOAs.

With EDF, an entity deploys an instance of the delegation contract, and protocol maintainers verify the deployment and parameters used. If all sounds, a permission is granted to the contract. Any future rotations of the EOA delegate are maintained by the entity and not the protocol. So stuff like periodic rotation, emergency delegate rotation/termination, etc. are maintained by the entity, not the protocol.

PS. Sorry for the not polished language. I did not use AI to write it. lol

4 Likes

Hi @Raman_Siamionau I saw that LIP-37’s next steps include security audits of the DelegationFactory and DelegationContract system and the updated DepositSecurityModule.

Has the Lido Audits Committee already assigned a provider for that scope?

If not, I can share a concise proposed review boundary and confirm the final contracts and commit when needed.

Best,
Reuben
Arctek Audits