omermaksutii/rugproof/delegatecall-risks

Claude Code and agent skill by omermaksutii/rugproof

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Detect delegatecall risks — uninitialized proxies, malicious implementations, storage-slot collisions, delegatecall to user-controlled addresses, library delegatecall pitfalls. Activate on `delegatecall`, UUPS proxy upgrades, multicall implementations, diamond facets, governor-execute patterns.

Install

npx vskill@latest install omermaksutii/rugproof/delegatecall-risks

SKILL.md

Delegatecall risk detection

When this applies

  • Any delegatecall site
  • Proxy implementations (UUPS, Transparent, Beacon, Diamond)
  • Multicall / Multicall3 / batch-execute on the contract itself
  • Governor's execute() flow
  • Library using X for * where X uses delegatecall
  • Generic call-forwarder / Safe modules

Detection patterns

delegatecall to user-controlled address (CRITICAL)
solidity
function exec(address impl, bytes calldata data) external {
impl.delegatecall(data); // ← attacker provides impl, owns storage + can selfdestruct
}
Uninitialized UUPS implementation (CRITICAL)

The implementation contract, if uninitialized, can be initialized by anyone, then UUPS-upgraded to a selfdestruct impl, bricking the implementation. (Famous: Parity multisig.) Always _disableInitializers() in constructor.

Storage slot collision in proxy (CRITICAL)

Proxy uses slot 0 for admin, impl uses slot 0 for owner → impl writes corrupt proxy admin. Use EIP-1967 namespaced slots.

delegatecall + msg.value (MEDIUM-HIGH)

Forwarding msg.value via delegatecall to a function that doesn't expect ether → trapped funds or double-accounting.

Multicall + delegatecall + msg.sender confusion (HIGH)

Multicall via delegatecall preserves msg.sender, so signed-payload-based functions (permit, ERC-2771) can be combined in surprising ways. Audit each function for "what if called via multicall with attacker-controlled previous step?"

Diamond facet self-destruct (HIGH — pre-EIP-6780)

A malicious or buggy facet that calls selfdestruct deletes the diamond. EIP-6780 limits this to same-tx-deploy, but old diamonds remain at risk. See [[selfdestruct-eip6780]].

Library marked internal actually compiled with delegatecall (HIGH)

Solidity compiles "linked" libraries to delegatecall. Linking the wrong library (or address) bricks downstream contracts.

_authorizeUpgrade missing or weak (CRITICAL)

UUPS upgrade gate. If unguarded, anyone can upgrade the proxy.

solidity
function _authorizeUpgrade(address) internal override {} // ← no auth, anyone upgrades
Cross-contract delegatecall to read-only function (LOW)

Used (rarely) for pattern obfuscation; usually a code smell.

Severity rubric

PatternSeverity
delegatecall to user-supplied addressCritical
UUPS _authorizeUpgrade unguardedCritical
Uninitialized UUPS impl with no _disableInitializersCritical
Storage collision proxy/implCritical
Forwarding msg.value to non-payable targetHigh
Multicall + signed-msg sender ambiguityHigh
Library linkage to wrong addressHigh
Diamond facet with selfdestruct pathHigh (see [[selfdestruct-eip6780]])

Remediation patterns

  • Never delegatecall a non-allowlisted address. Hardcode or maintain a strict allowlist of valid implementations.
  • UUPS: _authorizeUpgrade MUST check onlyOwner (or stricter).
  • Implementation constructor: _disableInitializers().
  • Use EIP-1967 / EIP-7201 namespaced slots for proxy admin / impl.
  • Multicall guard: forbid permit/auth-changing functions in batch, or limit to a non-delegatecall variant.
  • After upgrading: verify storage layout via forge inspect.

False-positive notes

  • Solady LibClone.deployERC1967 and similar canonical proxy libraries are well-tested.
  • delegatecall to an immutable implementation address (set in constructor, not changeable) is much lower risk.

Related

  • [[initialization]]
  • [[storage-layout]]
  • [[access-control]]
  • [[selfdestruct-eip6780]]

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/omermaksutii/rugproof/delegatecall-risks/badge)](https://verified-skill.com/skills/omermaksutii/rugproof/delegatecall-risks)

Something wrong with this skill or its page? Tell us.