Part 1 of "Building on Polkadot Hub: A Builder's Journal" — a series documenting what we learned building on Hub. New to the series? Start with Part 0: The Plaza Brief for a 5-minute overview.
TL;DR
We built plaza.fun on Polkadot Hub — not a parachain, not a fork, not "another EVM chain." Polkadot Hub gives us EVM smart contracts + native assets + cross-chain messaging in one place. The result: an activation layer for Polkadot's native assets — giving them price discovery, liquidity, and creator economics that they've never had before.
Why Not Just Fork pump.fun?
If all we wanted was a bonding curve launchpad, we could have forked pump.fun onto Moonbeam in a weekend.
But we didn't want "pump.fun on Polkadot." We wanted something that could only exist on Polkadot.
Polkadot Hub already has pallet_assets — a runtime-level asset system that's XCM-ready, near-zero gas, and more secure than any contract token. The problem? Nobody uses it. There's no way to launch an asset with price discovery, no automatic liquidity, no creator incentives. The raw capability is there, but it's dormant.
That's where we come in. Plaza activates it.
Polkadot Hub is the system chain at the center of the Polkadot network. It's not a parachain competing for a slot. It's core infrastructure — the chain where native assets live. And in January 2026, Hub got EVM compatibility via pallet-revive. That changed everything — we could finally write business logic in Solidity that operates on native assets.
The Architecture That Only Hub Makes Possible
Here's what Polkadot Hub gives us that no other chain does:
Layer 1: EVM Smart Contracts (pallet-revive) We write business logic in Solidity — bonding curves, fee distribution, graduation, DEX. The tooling is mature: Hardhat, Foundry, wagmi — it all works.
Layer 2: Native Assets (pallet_assets) Tokens created on plaza.fun aren't ERC20 contracts. They're native assets — first-class citizens managed by the runtime. Lower gas, better security, XCM-ready.
The Bridge: ERC20 Precompiles Precompiles expose pallet_assets as ERC20 interfaces. Your Solidity code calls transfer() on what looks like an ERC20, but under the hood it's moving native assets.
┌─────────────────────────────────────────────┐
│ Your Solidity Contract │
│ (OmniBondingCurve, PlazaSwap, ...) │
└──────────────────┬──────────────────────────┘
│ calls
┌─────────▼──────────┐
│ ERC20 Precompile │
└─────────┬──────────┘
│ routes to
┌─────────▼──────────┐
│ pallet_assets │
│ (native runtime) │
└────────────────────┘
Business logic in EVM, assets in Substrate, precompiles as the bridge.
The Full Product Architecture
plaza.fun isn't just a bonding curve. It's a complete token lifecycle platform:
┌─────────────┐ ┌──────────────┐ ┌────────────┐
│ Create │───▶│ Trade on │───▶│ Graduate │
│ (2π DOT) │ │ Bonding Curve│ │ (auto) │
└─────────────┘ └──────────────┘ └─────┬──────┘
│
┌──────────────┐ ┌─────▼──────┐
│ Earn Forever│◀───│ Trade on │
│ (FeeKeyNFT) │ │ PlazaSwap │
└──────────────┘ └────────────┘
Smart contracts working together (grouped by function):
- OmniBondingCurve — token creation + bonding curve trading
- FeeConfig — fee parameters and distribution rules
- PlazaSwap V2 (Factory + Router + Pair) — full DEX for graduated tokens
- GraduationManager + DirectAdapter — orchestrates the curve-to-DEX transition
- CreatorFeeVault — locks 10% LP, distributes fee earnings
- FeeKeyNFT — ERC721 representing permanent LP fee rights
- ProtocolFeeCollector — on-chain fee collection for DEX-stage revenue
- AdminConfig — protocol governance parameters
- MetadataRegistry — token metadata storage
- QuoteTokenRegistry — multi-quote-token support
- ReferralStorage — on-chain referral tracking
All deployed and verified on Blockscout.
Two Wallets, One Platform
Polkadot Hub runs two VMs simultaneously. Users might show up with MetaMask (H160 addresses) or Polkadot wallets like Talisman (SS58 addresses). We support both — no forcing anyone to switch.
In practice: MetaMask users and Polkadot wallet users see the same UI, but different things happen under the hood. Our frontend runs wagmi (EVM) and polkadot-api (Substrate) in parallel, with a unified wallet store that routes transactions to the correct path. The key insight: every feature has two execution paths, and the frontend is the abstraction layer.
Why This Matters: Activating Native Assets
We could have taken the easy road: EVM-only, MetaMask-only, deploy on a parachain. But Hub is the center of Polkadot. Building here means our tokens are native citizens — not imports from a sidechain.
pallet_assets has been on Polkadot Hub since day one. What it lacked was an activation layer — something to give these assets a launch mechanism, price discovery, automatic liquidity, and creator economics. That's what plaza.fun is:
| What pallet_assets has | What Plaza adds |
|---|---|
| Runtime-level assets | Bonding curve launch |
| XCM-ready | Automatic price discovery |
| Near-zero gas | Auto-graduation to DEX |
| More secure than ERC20 | Creator fees + FeeKeyNFT |
| No liquidity layer | 90% LP burned = no rug possible |
pump.fun creates SPL contract tokens. plaza.fun activates Polkadot native assets. That's not the same category.
In this series, we'll show you exactly how we built each piece:
- Part 2: The Bonding Curve — token creation, pricing, and the two-phase creation process
- Part 3: The Fee Engine — where the money flows
- Part 4: The Token Lifecycle — graduation → DEX → 90% LP burn → permanent creator earnings
- Part 5: Security & Governance — real bugs, the attack surface map, and on-chain governance
- Part 6: Lessons & What's Next — What we'd do differently, what surprised us, and where we're going.
Try It Yourself
The testnet is live. Connect your wallet and create your first token:
Contracts on Passet Hub Testnet — all verified on Blockscout:
- OmniBondingCurve:
0x1a257c1b735E11Dbd2822372F00F9c26EeCD1bFF - PlazaSwapV2Router:
0xe11Ea83Cc75D3097f0d219812C026Bd4c0046b1d - Full contract suite → deployer address
Follow @plaza_fun for updates. Questions? Join the discussion on our Forum post. · Discord
