Validation Rules
Proposed specification areas for ordering, supply and balance validation.
Open designValidation rules decide which ELC-20 operations change state. They are the most consequential part of the standard: two indexers with different rules will report different balances from the same chain.
This page lists the proposed rules by specification area and marks every area that remains open.
Processing model
An indexer maintains a state for each ticker and processes every ELC-20 Sigil in canonical order. Each operation is either applied, changing state, or rejected, changing nothing. A rejected operation is still a valid Sigil; it is simply ineffective under the standard.
The outcome of each operation should be recorded with a reason, so that users and applications can see why an operation had no effect.
Canonical ordering
| Rule | Status |
|---|---|
| Operations are ordered by block number, then transaction index, then intra-transaction index | Proposed |
| Only transactions with a successful receipt are considered | Proposed |
| Ordering is evaluated over finalized blocks only | Open |
Elysium produces fast sequencer confirmations that precede settlement to HyperEVM. Whether indexers should report state at sequencer confirmation, at settlement or both is an open question with direct consequences for user experience and reorg risk.
Ticker rules
| Rule | Status |
|---|---|
| Tickers are compared case-insensitively | Proposed |
| The first valid deploy of a ticker defines it; later deploys are rejected | Proposed |
| Allowed characters and length bounds | Open |
| Reserved or protected tickers | Open |
Supply rules
| Rule | Status |
|---|---|
| A mint for an undeployed ticker is rejected | Proposed |
A mint with amt greater than lim is rejected | Proposed |
A mint is rejected once total minted equals max | Proposed |
A mint that would exceed max is truncated to the remaining supply, or rejected | Open |
Balance rules
| Rule | Status |
|---|---|
A transfer with amt greater than the signer's balance is rejected | Proposed |
| Balances are computed in base units with arbitrary precision integers | Proposed |
| Transfers to the signer's own address | Open |
| Transfers to the zero address, and whether they constitute a burn | Open |
Numeric rules
| Rule | Status |
|---|---|
| Quantities must match the pattern of a positive decimal integer without leading zeros | Proposed |
| Any non-conforming quantity rejects the operation | Proposed |
| Upper bound on quantities, such as 2^256 - 1 | Open |
Reorganizations
Before a block is final, it can in principle be replaced. An indexer must be able to roll back state to a previous block and reapply operations. The rules above are defined over a single canonical history; how far an indexer must be prepared to roll back depends on the finality policy chosen above.
Test vectors
Before ELC-20 is considered stable, each rule will be accompanied by test vectors: an ordered list of Sigils with their expected outcomes and resulting balances. Two indexers are conforming only if they reproduce every vector exactly.
Draft Example — Not Finalized
{
"name": "mint beyond limit is rejected",
"sigils": [
{ "from": "0xA", "body": { "op": "deploy", "tick": "demo", "max": "100", "lim": "10" } },
{ "from": "0xB", "body": { "op": "mint", "tick": "demo", "amt": "11" } },
{ "from": "0xB", "body": { "op": "mint", "tick": "demo", "amt": "10" } }
],
"expect": {
"outcomes": ["applied", "rejected:exceeds-limit", "applied"],
"balances": { "0xB": "10" },
"minted": "10"
}
}