A Polkadot dApp is a web front end plus logic that runs somewhere in the Polkadot network. This guide shows where that logic can run in 2026, which client libraries and wallets the front end uses, and how XCM and indexers fit into the build.
The logic can be a smart contract on Polkadot Hub, a contract on a parachain such as Moonbeam, or a pallet in a runtime you control. The first decision is where the logic runs, and the client library, wallet connection and indexer follow from that choice.
Where a Polkadot dApp's logic can run
| Option | Language and tools | Fits | Trade-off |
|---|---|---|---|
| Smart contracts on Polkadot Hub | Solidity with Hardhat, Foundry or Remix, and Ethereum JSON-RPC. Contracts run on REVM, or on PVM after compiling with resolc. | Apps that want DOT, native Polkadot assets and Polkadot users without running a chain | A newer environment. Gas reports from local tools may not match on-chain costs. |
| EVM parachain such as Moonbeam | Standard Solidity with Hardhat or Foundry, and MetaMask | Porting an existing Ethereum dApp with few changes | Users need the parachain's gas token, and accounts follow the Ethereum format. |
| Other parachains with contracts, such as Astar | Solidity, or ink! where the chain supports it | Teams already active in that parachain's ecosystem | The dApp depends on one parachain's roadmap and liquidity. |
| Your own runtime pallet | Rust with FRAME in the Polkadot SDK | Products that need custom fees, governance or performance | You run a chain and buy coretime. The Polkadot development guide covers this path. |
Most new dApps should deploy contracts rather than launch a chain. A custom pallet makes sense only when a contract cannot express the logic, or when the economics of a separate chain work for the product.
Smart contracts on Polkadot Hub
Polkadot Hub is the chain that holds DOT balances, staking and governance in the Polkadot ecosystem. It runs contracts through pallet_revive, which offers two backends:
- REVM is a Rust implementation of the Ethereum Virtual Machine. Solidity contracts run without changes, and the docs recommend REVM for most projects.
- PVM is a RISC-V based backend for heavy computation. Solidity compiles to PVM bytecode with the
resolccompiler, and the tooling is more limited.
The Polkadot docs list Polkadot Hub mainnet with chain ID 420420419 and DOT as the currency. Polkadot Hub TestNet uses chain ID 420420417 and the PAS test token. REVM and PVM share precompiles, including ERC-20 and XCM precompiles, so contracts can reach native assets and cross-chain messages.
Ethereum developers should note three differences that the docs list:
- A 20-byte Ethereum address maps to a 32-byte Polkadot account.
- Fees combine gas with weight, proof size and storage deposits.
- Local test runs use the tool's own EVM, so helpers such as
evm_increaseTimeandloadFixtureoften fail against a Polkadot node.
The status of ink!
ink! is the Rust language for Polkadot contracts. The ink! maintainers state that since January 2026 they cannot actively maintain or develop ink! further, and the repository no longer accepts new issues or pull requests. A new project should pick Solidity on Polkadot Hub, or Rust in a runtime pallet, unless it accepts an unmaintained toolchain.
Front end libraries for Polkadot dApps
A front end for an EVM contract works like any Ethereum dApp, using viem, ethers.js or Wagmi with an EVM wallet. A front end that touches native Polkadot features, such as balances, staking, governance, XCM and your own pallet, needs a Substrate client.
The older Substrate client is @polkadot/api, also called polkadot.js. Many new projects use polkadot-api (PAPI). PAPI generates TypeScript types from chain metadata, is built around a light client, and produces smaller bundles. Dedot is another modern option. Four Polkadot details shape the code with any library:
- Metadata-driven types. Runtime metadata describes calls and storage, and a chain upgrade can change these types, so generate descriptors and test against upcoming runtimes.
- Light clients. smoldot runs in the browser and checks chain data without trusting an RPC provider, though the first load takes a short sync.
- Several chains at once. A user's DOT and stablecoins sit on Polkadot Hub, while identity sits on the People chain, so the app may need connections to several chains at once.
- Planck units. DOT uses 10 decimals, so a dApp must not hardcode 18.
Connecting wallets
Polkadot browser wallets such as the Polkadot.js extension, Talisman and SubWallet inject accounts into the page through a shared extension interface. Mobile wallets such as Nova support WalletConnect and in-app browsers. React projects can use LunoKit, a library listed in the Polkadot docs that connects the main Polkadot wallets and works with PAPI, Dedot or polkadot.js.
A connect flow lists the available extensions, lets the user pick accounts, and passes a signer to the client library, and the app should show SS58 addresses with the correct network prefix. If the dApp mixes EVM contracts with native Substrate calls, decide early whether users hold one account type or two, because that choice affects every screen that shows an address or asks for a signature. For the wallet side, see Polkadot wallet development.
Cross-chain features with XCM
XCM (Cross-Consensus Messaging) lets a dApp move assets between chains or trigger actions on another chain. Most dApps use XCM for deposits, such as bringing USDT from Polkadot Hub to their own chain, and for withdrawals. Some use it for remote execution. The difficult parts are estimating fees on the destination chain and handling failed messages. Test XCM flows on forked networks before launch.
Indexing and data
Chain storage does not answer queries such as "all trades by this user", so most Polkadot dApps add an indexer. SubQuery and SQD (formerly Subsquid) both index events from Substrate pallets and EVM contracts. Run the indexer as a production service with its own monitoring.
Polkadot ecosystem fit
A dApp on Polkadot can use assets and users from several chains through XCM, and a team can later move heavy logic into its own pallet on a separate chain. The trade-off is fewer tools, auditors and liquidity than on Ethereum. The IDO launchpads on Polkadot page covers token sales in the Polkadot ecosystem.
Build sequence
- Pick the execution environment, and confirm that the token standards, wallets and liquidity you need exist there.
- Write and test contracts with Foundry or Hardhat on a local development node or Polkadot Hub TestNet.
- Build the front end with PAPI or an EVM library, plus wallet connection and network switching.
- Add an indexer and any backend services, such as notifications.
- Audit the contracts, then launch with low limits on deposits and withdrawals.
As a rough estimate, a focused dApp with a few contracts, one front end and an indexer needs a team of two to four people for three to five months, plus an external audit. Cross-chain features add months, and so does a custom pallet. For dApp architecture beyond Polkadot, see dApp development.
Frequently asked questions
Can I deploy my existing Solidity contracts on Polkadot?
Yes. Moonbeam runs them without changes. Polkadot Hub runs them on REVM, but test them there, because gas accounting and account mapping differ from Ethereum.
Is ink! still maintained?
No. The ink! maintainers state that since January 2026 they cannot actively maintain or develop it. New Polkadot dApps usually use Solidity on Polkadot Hub instead.
Should I use polkadot.js or PAPI for a Polkadot dApp?
New projects usually start with PAPI because of its generated types and light-client support. polkadot.js has more examples and documentation, so teams that rely on existing code often keep it.
What is the difference between REVM and PVM on Polkadot Hub?
REVM runs Ethereum bytecode and supports standard Ethereum tools. PVM is a RISC-V backend for heavy computation that needs the resolc compiler and has fewer tools.