# ERC-7818: Expirable ERC-20

Source: https://www.eipsfordesigners.com/standards/ERC-7818
Agent brief: https://www.eipsfordesigners.com/standards/ERC-7818/agent.md
Machine-readable JSON: https://www.eipsfordesigners.com/api/standards/ERC-7818
Last reviewed: 2026-04-05
Last updated: 2026-04-05

| Field | Value |
| --- | --- |
| Status | Draft |
| Chain | both |
| Category | DeFi Patterns |
| Journey stages | Asset Discovery & Display, Asset Management |
| Detailed guide | Yes |
| Official specification | https://eips.ethereum.org/EIPS/eip-7818 |
| Discussion search | https://ethereum-magicians.org/search?q=ERC-7818 |

## UX Impact

Users hold tokens that expire after a validity period — for rewards, prepaid credits, or time-limited assets. Design implications: prominently show expiration date/countdown per token epoch, display both current-epoch and total usable balance, add 'expiring soon' warnings, enable epoch-specific transfers, gray out or hide expired balances. Design decisions: how aggressively to warn about upcoming expiration, whether to auto-hide expired epochs or show them struck-through, FIFO vs user-selected epoch for spending, notification timing for expiring tokens.

## Summary

ERC-7818 adds expiration to ERC-20 tokens. Tokens have a validity period and become unusable after expiration. Perfect for loyalty points that expire, time-limited rewards, promotional tokens, or any fungible asset that shouldn't last forever. Users see clear "expires in X days" messaging.

## For Designers

- You can design UI that delivers on-chain expiration.
- You can design UI that delivers promotion expires, tokens have clear end date.
- You can design UI that delivers "Use before Jan 31" creates healthy urgency.

## Applicability

### When to Use

- Your product addresses: loyalty points that should expire never do on-chain.
- Your product addresses: promotional tokens remain valid forever.
- The flow should deliver: on-chain expiration, tokens automatically become unusable.
- You are designing a expiration warning display experience with visible states and recovery paths.

### When to Avoid

- Show expiration prominently from day one.
- Send reminders at 7 days, 3 days, 1 day before.
- FIFO: always use soonest-expiring first.
- No token balances, swaps, lending, or yield flows appear in the product.

## Problems It Solves

### Loyalty points that should expire never do on-chain

Impact: critical

Old way: Off-chain expiration tracking, inconsistent enforcement

New way: On-chain expiration, tokens automatically become unusable

### Promotional tokens remain valid forever

Impact: high

Old way: One-time rewards circulate indefinitely, diluting value

New way: Promotion expires, tokens have clear end date

### No urgency to use rewards

Impact: high

Old way: Users hoard rewards, never engage

New way: "Use before Jan 31" creates healthy urgency

### Complex backend for expiring balances

Impact: medium

Old way: Track expiration per-user off-chain, sync issues

New way: Built into token contract, consistent behavior

## Anti-Patterns

### Hiding expiration until it's too late

Severity: critical

Users feel tricked when tokens suddenly expire

Instead: Show expiration prominently from day one

### No notification before expiration

Severity: high

Users may not check balances, lose tokens unknowingly

Instead: Send reminders at 7 days, 3 days, 1 day before

### Using newest tokens first

Severity: high

Old tokens expire unused while new ones get spent

Instead: FIFO: always use soonest-expiring first

### Showing only total balance without breakdown

Severity: medium

Users don't know some of their balance expires soon

Instead: Show balance breakdown by expiration date

## UI Components

### ExpirationBadge

Small indicator showing expiration status
States: valid, expiring-soon, expired
Props: expirationDate, urgencyThreshold

### TokenBatchList

List tokens grouped by expiration date
States: loading, loaded, empty
Props: batches[], sortBy, onSelectBatch

### ExpirationCountdown

Visual countdown timer to expiration
States: days, hours, minutes, expired
Props: expirationDate, format

### AutoSelectPreview

Show which batches will be auto-selected for spend
States: calculating, selected, modified
Props: amount, batches[], selectedBatches[]

## On Monad

### Expiration Check

Ethereum: Each expiration check costs gas

Monad: Cheap reads for frequent expiration checks

Design implication: Can show real-time expiration status

### Batch Updates

Ethereum: Updating multiple batches expensive

Monad: Cheap batch operations

Design implication: Can process many expiration batches efficiently

### Transaction Speed

Ethereum: Using expiring tokens takes 15+ seconds

Monad: Sub-second use of expiring tokens

Design implication: Last-minute redemption actually works

### Time Precision

Ethereum: Block time ~12 seconds, timing approximate

Monad: Faster blocks, more precise expiration

Design implication: Can show "expires in X minutes" more accurately

## Key Takeaways

- Always show expiration prominently - no surprises
- Use FIFO: spend soonest-expiring tokens first
- Send notifications before tokens expire
- Show breakdown by expiration date, not just total
- On Monad: fast transactions enable last-minute redemption

## UX Patterns

### Expiration Warning Display

Show tokens with approaching expiration

User flow:

- User views reward balance
- Tokens sorted by expiration (soonest first)
- Visual countdown for each batch
- Warning highlights urgent expirations
- Quick action to use expiring tokens

Mockup registry key: `concept/proxy-pattern` (React UI on the live standard page).

### Batch Expiration View

Show multiple token batches with different expirations

User flow:

- Query all token batches for user
- Group by expiration date
- Color-code by urgency
- Suggest using oldest first
- Auto-select expiring tokens for transactions

Mockup registry key: `concept/proxy-pattern` (React UI on the live standard page).

### Spending with Auto-Select

Automatically use soonest-expiring tokens first

User flow:

- User initiates purchase
- System auto-selects expiring tokens first
- Show which batches will be used
- Display remaining balance by batch
- Confirm transaction

Mockup registry key: `concept/tx-status` (React UI on the live standard page).

### Expiration Notification

Alert users before tokens expire

User flow:

- System checks for expiring tokens
- Send notification before expiration
- Show clear deadline
- Provide direct link to use tokens
- Allow snooze for reminder

Mockup registry key: `concept/proxy-pattern` (React UI on the live standard page).

## Technical Notes

ERC-7818 extends ERC-20 with expiration timestamps per token batch. The contract tracks multiple batches with different expirations for each holder. balanceOf returns only non-expired tokens. The standard defines methods to query expiration dates and batch details. Expired tokens can optionally be burned or recycled.
