solady-erc20-permit2-assumptions

Solid

Detect unsafe assumptions about Solady's gas-optimized ERC20/ERC2612 permit and DN404 metadata. Solady's ERC20 uses custom storage slots, returns bools via assembly, exposes a virtual `_constantNameHash`/`_versionHash` for permit domain separation, and its DN404 mirror splits ERC20/ERC721 logic — integrators that assume OZ-style behavior, revert strings, or that `name()`/`decimals()` are always present can misbehave. Activate on solady/tokens imports, ERC2612 permit flows, DN404, or off-chain code parsing Solady revert reasons.

AI & Automation 38 stars 5 forks Updated 2 days ago MIT

Install

View on GitHub

Quality Score: 82/100

Stars 20%
53
Recency 20%
100
Frontmatter 20%
70
Documentation 15%
100
Issue Health 10%
50
License 10%
100
Description 5%
100

Skill Content

# Solady ERC20 / permit / DN404 assumption detection ## When this applies Trigger on any of: - `import {ERC20} from "solady/tokens/ERC20.sol";` or `ERC2612`, `DN404`, `DN404Mirror`, `ERC4626` from solady - Integrations calling `permit(...)` and assuming a fixed EIP-712 domain / version string - Code relying on Solady's revert *reasons* (Solady reverts with custom errors / 4-byte selectors, not strings) - DN404 tokens treated as plain ERC20 (the NFT mirror has separate transfer semantics) - Off-chain indexers decoding events / revert data assuming OZ layout - Overriding `name()`, `symbol()`, `_constantNameHash`, `_versionHash`, or `_domainNameAndVersion` ## Detection patterns ### Hardcoded permit domain separator (MEDIUM) ```solidity bytes32 DOMAIN = keccak256(abi.encode( TYPE_HASH, keccak256("MyToken"), keccak256("1"), block.chainid, token )); // ← assumes version "1"; Solady ERC2612 default version is "1" but DN404/overrides may differ ``` Solady derives the domain via `_domainNameAndVersion()` (default version `"1"`). If the token overrides `_versionHash` or `name()`, a hand-rolled separator mismatches and every `permit` reverts `InvalidPermit`. **Signal:** off-chain or on-chain code reconstructs the EIP-712 domain instead of reading `DOMAIN_SEPARATOR()` from the token. ### Relying on revert strings (MEDIUM) ```solidity try token.transferFrom(a, b, amt) returns (bool) {} catch Error(string memory reason) { // ← Solady reverts with custom errors, if (...

Details

Author
iktok90-design
Repository
iktok90-design/ai-smart-contract-auditor
Created
1 weeks ago
Last Updated
2 days ago
Language
JavaScript
License
MIT

Bundled in these plugins

Similar Skills

Semantically similar based on skill content — not just same category