Uniscribe is an open inscription standard that piggybacks on Uniswap v4
swap hookData. Three operations. One hook. A registry that
lives entirely on-chain. The protocol's genesis ticker
UNIS — 21M max supply, 1k per-mint, zero premine
— is inscribed atomically at contract creation. A dedicated v4
pool lets anyone mint by swapping ETH for wUNIS.
$ cat deploy.json // Register a new UNI-20 ticker { "p": "uni-20", "op": "deploy", "tick": "UNIS", "max": "21000000", "lim": "1000" } $ uniscribe inscribe ./deploy.json // → Inscription #1 · ticker UNIS deployed (max 21M, per-mint 1k)
$ cat mint.json // Claim 1,000 UNIS from the cap { "p": "uni-20", "op": "mint", "tick": "UNIS", "amt": "1000" } $ uniscribe inscribe ./mint.json // → Inscription #2 · 1,000 UNIS minted to 0xRyZ...eN
$ cat transfer.json // Move 500 UNIS to another address { "p": "uni-20", "op": "transfer", "tick": "UNIS", "amt": "500", "to": "0xabc0000000000000000000000000000000000123" } $ uniscribe inscribe ./transfer.json // → Inscription #3 · 500 UNIS sent to 0xabc...0123 (no fee)
UNI-20 borrows what worked about BRC-20 — a declarative, indexable format — and grounds it in EVM-native accounting. Three operations. One hook. Predictable settlement.
Inscriptions ride inside the swap you were going to execute. No additional transaction surface, no separate venue to maintain.
Three verbs — deploy, mint, transfer — encoded as compact JSON, parsed strictly on-chain.
Tickers, supply caps, per-mint limits, and balances live in contract storage. Off-chain indexers are a convenience, not a dependency.
A minimal protocol fee on deploy and mint protects the namespace and routes value to a transparent treasury.
Every op emits a structured Inscription event with the raw payload — drop-in for The Graph, Ponder, Goldsky, or in-house ETL.
MIT-licensed reference. The standard can ossify; applications can innovate at the edges.
Uniscribe is a single Solidity contract that doubles as a Uniswap v4 BaseHook and as a standalone inscription registry. The v4 path is the canonical integration; the direct path keeps the protocol usable in any environment that can call a contract.
Inscription, Mint, Transfer, TickerDeployed).function beforeSwap( address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData ) external override onlyPoolManager returns (bytes4, int256, uint24) { if (hookData.length > 0) { _processInscription(sender, hookData); } return (BEFORE_SWAP_SELECTOR, 0, 0); }
Every UNI-20 payload is a flat JSON object. Numeric fields are quoted strings to preserve 256-bit precision. Unknown keys are ignored for forward-compatibility.
{
"p": "uni-20",
"op": "deploy",
"tick": "UNIS",
"max": "21000000",
"lim": "1000"
}
{
"p": "uni-20",
"op": "mint",
"tick": "UNIS",
"amt": "1000"
}
{
"p": "uni-20",
"op": "transfer",
"tick": "UNIS",
"amt": "500",
"to": "0xabc...123"
}
event Inscription( uint64 indexed inscriptionNo, address indexed from, bytes32 indexed tick, string op, uint256 amount, address to, bytes raw );
Reference contract, JSON schema, integration walkthroughs, and indexer guidance — everything you need to ship an inscription-aware app.