Skip to content
Back to skills

Centralization Risk

ASecurity

Detect centralization and trust-assumption risks — admin powers, single-key risk, missing timelocks, upgrade authority, treasury keys, pause permanence, blacklisting authority, oracle authority. Activate on `onlyOwner`, `onlyRole`, `AccessControl`, upgrade authorizations, pause/unpause functions, mint/burn caps, treasury/fee setters.

  • 36 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 4, 2026
blockchainrustgo

Security analysis

A100/100

Scanned October 4, 2026

npx -y skills add iktok90-design/ai-smart-contract-auditor --skill centralization-risk --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Centralization Risk?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Centralization Risk
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iktok90-design-centralization-risk/badge)](https://www.skillsdirectory.com/skills/iktok90-design-centralization-risk)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: centralization-risk
description: Detect centralization and trust-assumption risks — admin powers, single-key risk, missing timelocks, upgrade authority, treasury keys, pause permanence, blacklisting authority, oracle authority. Activate on `onlyOwner`, `onlyRole`, `AccessControl`, upgrade authorizations, pause/unpause functions, mint/burn caps, treasury/fee setters.
---

# Centralization risk audit

## Why this matters

Centralization findings are non-exploits in the traditional sense, but they're the most common reason audits flag a protocol as "rugpullable". The protocol can be the attacker. Investors deserve a clear inventory.

## When this applies

- Every privileged function (mint, burn, set-fee, set-oracle, upgrade, pause, recover, sweep, blacklist)
- Multi-sig configuration
- Timelock configuration
- Upgrade authority (UUPS `_authorizeUpgrade`)
- Emergency-withdraw / emergency-pause
- Token mint caps + upgradability of caps

## Detection patterns

### Single-key admin (HIGH)
```solidity
contract X is Ownable {
    function upgradeTo(address impl) external onlyOwner { ... }
    function setFee(uint256 fee) external onlyOwner { ... }
    // ← one key, can pull rug
}
```
Findings:
- "Owner can upgrade implementation immediately, with no timelock or multi-sig."
- "Single key controls treasury."

### No timelock (HIGH)
`onlyOwner` upgrades / fee changes / oracle changes that take effect immediately. Add a Timelock (OZ TimelockController), document the delay.

### Pause-without-time-cap (HIGH)
`pause()` with no auto-unpause. Owner can permanently freeze user funds.

### Mint without cap (HIGH)
```solidity
function mint(address to, uint256 amt) external onlyMinter { _mint(to, amt); }   // ← no cap, inflation risk
```

### Blacklist without on-chain criteria (HIGH)
A `blacklist(address)` function with no public criteria = "the protocol's discretion to freeze you".

### Oracle controlled by single admin (HIGH)
```solidity
function setOracle(address o) external onlyOwner { oracle = IOracle(o); }
```
Admin → switches to malicious oracle → liquidates everyone.

### Sweep-any-token without allowlist (HIGH — also in [[access-control]])
`recoverERC20(token)` that can sweep user deposits.

### Upgrade authority over user funds, no exit window (HIGH)
Users should have a window after upgrade announcement to withdraw if they disagree. Without it, governance can rug by upgrade.

### "Renounced ownership" theater (HIGH)
Ownable renounced but `DEFAULT_ADMIN_ROLE` retained. Or admin role transferred to a smart contract that has its own backdoor.

### EOA multisig threshold of 1 (HIGH)
Marketed as "multi-sig" but `threshold == 1` defeats the purpose.

### Validator / sequencer centralization (HIGH for bridges, L2s)
Single sequencer / centralized validator set. Document for bridges + L2 deployments.

### Treasury without time-locked spend (HIGH)
Owner can drain treasury immediately.

### `selfdestruct` reachable by admin (MEDIUM-HIGH)
See [[selfdestruct-eip6780]].

## Severity rubric

| Pattern | Severity |
|---|---|
| EOA controls upgrade + treasury + oracle | **Critical** *(for trust report)* |
| Pause with no auto-unpause | **High** |
| Mint with no cap | **High** |
| Unrestricted blacklist | **High** |
| No timelock on key params | **High** |
| Sweep includes user deposits | **High** |
| Multisig threshold = 1 | **High** |
| Renounce + retained admin role | **High** |
| Timelock < 24h on high-impact ops | **Medium** |
| Single-sequencer L2 | **Medium-Info** *(contextual)* |

## Output format

Centralization findings should produce a **"Trust report"** section in `/report`:

> **Admin powers:**
> - `setOracle` — can replace price oracle → drain liquidations (no timelock).
> - `upgradeTo` — can swap implementation (UUPS, no timelock).
> - `recoverERC20` — can sweep any token, including user deposits.
> - `pause` — can freeze withdrawals indefinitely (no auto-unpause).
> - `setFee` — can set fee to 100% (no cap).
>
> **Mitigations in place:**
> - Owner is a Gnosis Safe at `0x…` with 3/5 threshold.
> - 24h Timelock at `0x…` mediates `setOracle` and `upgradeTo`.
>
> **Trust assumption:** Users must trust the multi-sig signers and the 24h timelock window.

## Remediation patterns

- Multi-sig (3+ of N) for admin role.
- Timelock (≥48h for upgrades, ≥24h for params).
- Per-function caps on what admin can change (fee ≤ 5%, mint ≤ 10% of supply).
- Auto-unpause after N hours.
- Withdraw-only mode on pause.
- Public "trust assumptions" doc — every admin function listed.

## False-positive notes

- A pre-launch protocol with single admin pending timelock setup is normal — flag with recommendation, not critical.
- Test networks / staging contracts are fine to centralize.

## Related

- [[access-control]]
- [[initialization]]
- [[delegatecall-risks]]

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…